Skip to content

Commit cad54d6

Browse files
authored
refactor: replace klog with slog (#37)
* refactor: eliminate klog usage in server Signed-off-by: Jian Zeng <[email protected]> * feat: add slog util Signed-off-by: Jian Zeng <[email protected]> * refactor: replace klog with slog Signed-off-by: Jian Zeng <[email protected]> * feat: specify verbosity Signed-off-by: Jian Zeng <[email protected]> * chore: update config files Signed-off-by: Jian Zeng <[email protected]> * chore: minor change Signed-off-by: Jian Zeng <[email protected]> --------- Signed-off-by: Jian Zeng <[email protected]>
1 parent c7e621c commit cad54d6

File tree

14 files changed

+173
-142
lines changed

14 files changed

+173
-142
lines changed

.golangci.yaml

+1-6
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@ run:
33
modules-download-mode: readonly
44
linters:
55
enable:
6-
- exhaustive
7-
- exportloopref
86
- dupl
7+
- exportloopref
98
- gochecknoinits
109
- goconst
1110
- gocritic
@@ -22,10 +21,6 @@ linters:
2221
- usestdlibvars
2322
- whitespace
2423
linters-settings:
25-
exhaustive:
26-
# presence of "default" case in switch statements satisfies exhaustiveness,
27-
# even if all enum members are not listed
28-
default-signifies-exhaustive: true
2924
issues:
3025
exclude-rules:
3126
- path: _test.go

cmd/client/forwarder.go

+27-32
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ package main
22

33
import (
44
"fmt"
5+
"log/slog"
56
"net"
67
"strconv"
78

89
"k8s.io/apimachinery/pkg/util/httpstream"
9-
"k8s.io/klog/v2"
1010

1111
"github.com/knight42/krelay/pkg/constants"
1212
"github.com/knight42/krelay/pkg/ports"
1313
"github.com/knight42/krelay/pkg/remoteaddr"
14+
slogutil "github.com/knight42/krelay/pkg/slog"
1415
"github.com/knight42/krelay/pkg/xnet"
1516
)
1617

@@ -53,14 +54,16 @@ func (p *portForwarder) listen(localIP string) error {
5354
func (p *portForwarder) run(streamConn httpstream.Connection) {
5455
switch {
5556
case p.tcpListener != nil:
56-
l := p.tcpListener
57-
defer l.Close()
58-
59-
localAddr := l.Addr().String()
60-
klog.InfoS("Forwarding",
61-
constants.LogFieldProtocol, p.ports.Protocol,
62-
constants.LogFieldLocalAddr, localAddr,
63-
constants.LogFieldRemotePort, p.ports.RemotePort,
57+
lis := p.tcpListener
58+
defer lis.Close()
59+
60+
localAddr := lis.Addr().String()
61+
l := slog.With(
62+
slog.String(constants.LogFieldProtocol, p.ports.Protocol),
63+
slog.String(constants.LogFieldLocalAddr, localAddr),
64+
)
65+
l.Info("Forwarding",
66+
slogutil.Uint16(constants.LogFieldRemotePort, p.ports.RemotePort),
6467
)
6568

6669
for {
@@ -70,21 +73,15 @@ func (p *portForwarder) run(streamConn httpstream.Connection) {
7073
default:
7174
}
7275

73-
c, err := l.Accept()
76+
c, err := lis.Accept()
7477
if err != nil {
75-
klog.ErrorS(err, "Fail to accept tcp connection",
76-
constants.LogFieldProtocol, p.ports.Protocol,
77-
constants.LogFieldLocalAddr, localAddr,
78-
)
78+
l.Error("Fail to accept tcp connection", slogutil.Error(err))
7979
return
8080
}
8181

8282
remoteAddr, err := p.addrGetter.Get()
8383
if err != nil {
84-
klog.ErrorS(err, "Fail to get remote address",
85-
constants.LogFieldProtocol, p.ports.Protocol,
86-
constants.LogFieldLocalAddr, localAddr,
87-
)
84+
l.Error("Fail to get remote address", slogutil.Error(err))
8885
continue
8986
}
9087
go handleTCPConn(c, streamConn, remoteAddr, p.ports.RemotePort)
@@ -96,21 +93,21 @@ func (p *portForwarder) run(streamConn httpstream.Connection) {
9693

9794
udpConn := &xnet.UDPConn{UDPConn: pc.(*net.UDPConn)}
9895
localAddr := pc.LocalAddr().String()
99-
klog.InfoS("Forwarding",
100-
constants.LogFieldProtocol, p.ports.Protocol,
101-
constants.LogFieldLocalAddr, localAddr,
102-
constants.LogFieldRemotePort, p.ports.RemotePort,
96+
l := slog.With(
97+
slog.String(constants.LogFieldProtocol, p.ports.Protocol),
98+
slog.String(constants.LogFieldLocalAddr, localAddr),
99+
)
100+
l.Info("Forwarding",
101+
slogutil.Uint16(constants.LogFieldRemotePort, p.ports.RemotePort),
103102
)
104103
track := newConnTrack()
105104
finish := make(chan string)
106105

107106
go func() {
108107
for key := range finish {
109108
track.Delete(key)
110-
klog.V(4).InfoS("Remove udp conn from conntrack table",
111-
"key", key,
112-
constants.LogFieldProtocol, p.ports.Protocol,
113-
constants.LogFieldLocalAddr, localAddr,
109+
l.Debug("Remove udp conn from conntrack table",
110+
slog.String("key", key),
114111
)
115112
}
116113
}()
@@ -128,9 +125,8 @@ func (p *portForwarder) run(streamConn httpstream.Connection) {
128125

129126
n, cliAddr, err := udpConn.ReadFrom(buf)
130127
if err != nil {
131-
klog.ErrorS(err, "Fail to read udp packet",
132-
constants.LogFieldProtocol, p.ports.Protocol,
133-
constants.LogFieldLocalAddr, localAddr,
128+
l.Error("Fail to read udp packet",
129+
slogutil.Error(err),
134130
)
135131
return
136132
}
@@ -146,9 +142,8 @@ func (p *portForwarder) run(streamConn httpstream.Connection) {
146142
track.Set(key, dataCh)
147143
remoteAddr, err := p.addrGetter.Get()
148144
if err != nil {
149-
klog.ErrorS(err, "Fail to get remote address",
150-
constants.LogFieldProtocol, p.ports.Protocol,
151-
constants.LogFieldLocalAddr, localAddr,
145+
l.Error("Fail to get remote address",
146+
slogutil.Error(err),
152147
)
153148
continue
154149
}

cmd/client/main.go

+20-30
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import (
44
"context"
55
"encoding/json"
66
"errors"
7-
"flag"
87
"fmt"
8+
"log/slog"
99
"net/http"
1010
"os"
1111
"os/signal"
@@ -22,11 +22,11 @@ import (
2222
_ "k8s.io/client-go/plugin/pkg/client/auth"
2323
"k8s.io/client-go/rest"
2424
"k8s.io/client-go/transport/spdy"
25-
"k8s.io/klog/v2"
2625

2726
"github.com/knight42/krelay/pkg/constants"
2827
"github.com/knight42/krelay/pkg/ports"
2928
"github.com/knight42/krelay/pkg/remoteaddr"
29+
slogutil "github.com/knight42/krelay/pkg/slog"
3030
"github.com/knight42/krelay/pkg/xnet"
3131
)
3232

@@ -41,6 +41,8 @@ type Options struct {
4141
address string
4242
// targetsFile is the file containing the list of targets.
4343
targetsFile string
44+
45+
verbosity int
4446
}
4547

4648
// setKubernetesDefaults sets default values on the provided client config for accessing the Kubernetes API.
@@ -153,7 +155,7 @@ func (o *Options) Run(ctx context.Context, args []string) error {
153155
}
154156
}
155157

156-
klog.InfoS("Creating krelay-server", "namespace", o.serverNamespace)
158+
slog.Info("Creating krelay-server", slog.String("namespace", o.serverNamespace))
157159
svrPodName, err := createServerPod(ctx, cs, o.serverImage, o.serverNamespace)
158160
if err != nil {
159161
return fmt.Errorf("create krelay-server pod: %w", err)
@@ -164,7 +166,7 @@ func (o *Options) Run(ctx context.Context, args []string) error {
164166
if err != nil {
165167
return fmt.Errorf("ensure krelay-server is running: %w", err)
166168
}
167-
klog.InfoS("krelay-server is running", "pod", svrPodName, "namespace", o.serverNamespace)
169+
slog.Info("krelay-server is running", slog.String("pod", svrPodName), slog.String("namespace", o.serverNamespace))
168170

169171
transport, upgrader, err := spdy.RoundTripperFor(restCfg)
170172
if err != nil {
@@ -191,7 +193,7 @@ func (o *Options) Run(ctx context.Context, args []string) error {
191193
for _, pf := range portForwarders {
192194
err := pf.listen(o.address)
193195
if err != nil {
194-
klog.ErrorS(err, "Fail to listen on port", "port", pf.ports.LocalPort)
196+
slog.Error("Fail to listen on port", slog.Any("port", pf.ports.LocalPort), slog.Any("error", err))
195197
} else {
196198
succeeded = true
197199
}
@@ -204,15 +206,14 @@ func (o *Options) Run(ctx context.Context, args []string) error {
204206

205207
select {
206208
case <-streamConn.CloseChan():
207-
klog.InfoS("Lost connection to krelay-server pod")
209+
slog.Info("Lost connection to krelay-server pod")
208210
case <-ctx.Done():
209211
}
210212

211213
return nil
212214
}
213215

214216
func main() {
215-
klog.InitFlags(nil)
216217
cf := genericclioptions.NewConfigFlags(true)
217218
o := Options{
218219
getter: cf,
@@ -237,40 +238,29 @@ service, ip and hostname rather than only pods.`,
237238
})
238239
}
239240

241+
h := slog.NewTextHandler(cmd.ErrOrStderr(), &slog.HandlerOptions{
242+
Level: slogutil.MapVerbosityToLogLevel(o.verbosity),
243+
})
244+
slog.SetDefault(slog.New(h))
240245
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
241246
defer cancel()
242247
return o.Run(ctx, args)
243248
},
244249
SilenceUsage: true,
245250
}
246251
flags := c.Flags()
247-
flags.AddGoFlagSet(flag.CommandLine)
248-
cf.AddFlags(flags)
252+
flags.SortFlags = false
253+
flags.StringVar(cf.KubeConfig, "kubeconfig", *cf.KubeConfig, "Path to the kubeconfig file to use for CLI requests.")
254+
flags.StringVarP(cf.Namespace, "namespace", "n", *cf.Namespace, "If present, the namespace scope for this CLI request")
255+
flags.StringVar(cf.Context, "context", *cf.Context, "The name of the kubeconfig context to use")
256+
flags.StringVar(cf.ClusterName, "cluster", *cf.ClusterName, "The name of the kubeconfig cluster to use")
257+
249258
flags.BoolVarP(&printVersion, "version", "V", false, "Print version info and exit.")
250259
flags.StringVar(&o.address, "address", "127.0.0.1", "Address to listen on. Only accepts IP addresses as a value.")
260+
flags.StringVarP(&o.targetsFile, "file", "f", "", "Forward to the targets specified in the given file, with one target per line.")
251261
flags.StringVar(&o.serverImage, "server.image", "ghcr.io/knight42/krelay-server:v0.0.2", "The krelay-server image to use.")
252262
flags.StringVar(&o.serverNamespace, "server.namespace", metav1.NamespaceDefault, "The namespace in which krelay-server is located.")
253-
flags.StringVarP(&o.targetsFile, "file", "f", "", "Forward to the targets specified in the given file, with one target per line.")
254-
255-
// I do not want these flags to show up in --help.
256-
hiddenFlags := []string{
257-
"add_dir_header",
258-
"log_flush_frequency",
259-
"alsologtostderr",
260-
"log_backtrace_at",
261-
"log_dir",
262-
"log_file",
263-
"log_file_max_size",
264-
"one_output",
265-
"logtostderr",
266-
"skip_headers",
267-
"skip_log_headers",
268-
"stderrthreshold",
269-
"vmodule",
270-
}
271-
for _, flagName := range hiddenFlags {
272-
_ = flags.MarkHidden(flagName)
273-
}
263+
flags.IntVarP(&o.verbosity, "v", "v", 3, "Number for the log level verbosity. The bigger the more verbose.")
274264

275265
_ = c.Execute()
276266
}

cmd/client/tcp.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ package main
22

33
import (
44
"io"
5+
"log/slog"
56
"net"
67

78
"k8s.io/apimachinery/pkg/util/httpstream"
8-
"k8s.io/klog/v2"
99

1010
"github.com/knight42/krelay/pkg/constants"
11+
slogutil "github.com/knight42/krelay/pkg/slog"
1112
"github.com/knight42/krelay/pkg/xio"
1213
"github.com/knight42/krelay/pkg/xnet"
1314
)
@@ -16,18 +17,17 @@ func handleTCPConn(clientConn net.Conn, serverConn httpstream.Connection, dstAdd
1617
defer clientConn.Close()
1718

1819
requestID := xnet.NewRequestID()
19-
kvs := []any{constants.LogFieldRequestID, requestID}
20-
defer klog.V(4).InfoS("handleTCPConn exit", kvs...)
21-
klog.InfoS("Handling tcp connection",
22-
constants.LogFieldRequestID, requestID,
23-
constants.LogFieldDestAddr, xnet.JoinHostPort(dstAddr.String(), dstPort),
24-
constants.LogFieldLocalAddr, clientConn.LocalAddr().String(),
25-
"clientAddr", clientConn.RemoteAddr().String(),
20+
l := slog.With(slog.String(constants.LogFieldRequestID, requestID))
21+
defer l.Debug("handleTCPConn exit")
22+
l.Info("Handling tcp connection",
23+
slog.String(constants.LogFieldDestAddr, xnet.JoinHostPort(dstAddr.String(), dstPort)),
24+
slog.String(constants.LogFieldLocalAddr, clientConn.LocalAddr().String()),
25+
slog.String("clientAddr", clientConn.RemoteAddr().String()),
2626
)
2727

2828
dataStream, errorChan, err := createStream(serverConn, requestID)
2929
if err != nil {
30-
klog.ErrorS(err, "Fail to create stream", kvs...)
30+
l.Error("Fail to create stream", slogutil.Error(err))
3131
return
3232
}
3333

@@ -39,18 +39,18 @@ func handleTCPConn(clientConn net.Conn, serverConn httpstream.Connection, dstAdd
3939
}
4040
_, err = xio.WriteFull(dataStream, hdr.Marshal())
4141
if err != nil {
42-
klog.ErrorS(err, "Fail to write header", kvs...)
42+
l.Error("Fail to write header", slogutil.Error(err))
4343
return
4444
}
4545

4646
var ack xnet.Acknowledgement
4747
err = ack.FromReader(dataStream)
4848
if err != nil {
49-
klog.ErrorS(err, "Fail to receive ack", kvs...)
49+
l.Error("Fail to receive ack", slogutil.Error(err))
5050
return
5151
}
5252
if ack.Code != xnet.AckCodeOK {
53-
klog.ErrorS(ack.Code, "Fail to connect", kvs...)
53+
l.Error("Fail to connect", slogutil.Error(ack.Code))
5454
return
5555
}
5656

@@ -60,7 +60,7 @@ func handleTCPConn(clientConn net.Conn, serverConn httpstream.Connection, dstAdd
6060
go func() {
6161
// Copy from the remote side to the local port.
6262
if _, err := io.Copy(clientConn, dataStream); err != nil && !xnet.IsClosedConnectionError(err) {
63-
klog.ErrorS(err, "Fail to copy from remote stream to local connection", kvs...)
63+
l.Error("Fail to copy from remote stream to local connection", slogutil.Error(err))
6464
}
6565

6666
// inform the select below that the remote copy is done
@@ -73,7 +73,7 @@ func handleTCPConn(clientConn net.Conn, serverConn httpstream.Connection, dstAdd
7373

7474
// Copy from the local port to the remote side.
7575
if _, err := io.Copy(dataStream, clientConn); err != nil && !xnet.IsClosedConnectionError(err) {
76-
klog.ErrorS(err, "Fail to copy from local connection to remote stream", kvs...)
76+
l.Error("Fail to copy from local connection to remote stream", slogutil.Error(err))
7777
// break out of the select below without waiting for the other copy to finish
7878
close(localError)
7979
}
@@ -88,6 +88,6 @@ func handleTCPConn(clientConn net.Conn, serverConn httpstream.Connection, dstAdd
8888
// always expect something on errorChan (it may be nil)
8989
err = <-errorChan
9090
if err != nil {
91-
klog.ErrorS(err, "Unexpected error from stream", kvs...)
91+
l.Error("Unexpected error from stream", slogutil.Error(err))
9292
}
9393
}

0 commit comments

Comments
 (0)