Skip to content

Commit 934bb68

Browse files
authored
refactor: structured logging (#351)
2 parents af0f452 + d52052b commit 934bb68

32 files changed

+553
-341
lines changed

block_device.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type remoteImageBackend struct {
1616

1717
func (r remoteImageBackend) ReadAt(p []byte, off int64) (n int, err error) {
1818
virtualMediaStateMutex.RLock()
19-
logger.Debugf("currentVirtualMediaState is %v", currentVirtualMediaState)
20-
logger.Debugf("read size: %d, off: %d", len(p), off)
19+
logger.Debug().Interface("currentVirtualMediaState", currentVirtualMediaState).Msg("currentVirtualMediaState")
20+
logger.Debug().Int64("read size", int64(len(p))).Int64("off", off).Msg("read size and off")
2121
if currentVirtualMediaState == nil {
2222
return 0, errors.New("image not mounted")
2323
}
@@ -93,7 +93,7 @@ func (d *NBDDevice) Start() error {
9393
// Remove the socket file if it already exists
9494
if _, err := os.Stat(nbdSocketPath); err == nil {
9595
if err := os.Remove(nbdSocketPath); err != nil {
96-
logger.Errorf("Failed to remove existing socket file %s: %v", nbdSocketPath, err)
96+
nativeLogger.Warn().Err(err).Str("socket_path", nbdSocketPath).Msg("Failed to remove existing socket file")
9797
os.Exit(1)
9898
}
9999
}
@@ -134,22 +134,22 @@ func (d *NBDDevice) runServerConn() {
134134
MaximumBlockSize: uint32(16 * 1024),
135135
SupportsMultiConn: false,
136136
})
137-
logger.Infof("nbd server exited: %v", err)
137+
nativeLogger.Info().Err(err).Msg("nbd server exited")
138138
}
139139

140140
func (d *NBDDevice) runClientConn() {
141141
err := client.Connect(d.clientConn, d.dev, &client.Options{
142142
ExportName: "jetkvm",
143143
BlockSize: uint32(4 * 1024),
144144
})
145-
logger.Infof("nbd client exited: %v", err)
145+
nativeLogger.Info().Err(err).Msg("nbd client exited")
146146
}
147147

148148
func (d *NBDDevice) Close() {
149149
if d.dev != nil {
150150
err := client.Disconnect(d.dev)
151151
if err != nil {
152-
logger.Warnf("error disconnecting nbd client: %v", err)
152+
nativeLogger.Warn().Err(err).Msg("error disconnecting nbd client")
153153
}
154154
_ = d.dev.Close()
155155
}

cloud.go

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,14 +253,14 @@ func disconnectCloud(reason error) {
253253
defer cloudDisconnectLock.Unlock()
254254

255255
if cloudDisconnectChan == nil {
256-
cloudLogger.Tracef("cloud disconnect channel is not set, no need to disconnect")
256+
cloudLogger.Trace().Msg("cloud disconnect channel is not set, no need to disconnect")
257257
return
258258
}
259259

260260
// just in case the channel is closed, we don't want to panic
261261
defer func() {
262262
if r := recover(); r != nil {
263-
cloudLogger.Infof("cloud disconnect channel is closed, no need to disconnect: %v", r)
263+
cloudLogger.Warn().Interface("reason", r).Msg("cloud disconnect channel is closed, no need to disconnect")
264264
}
265265
}()
266266
cloudDisconnectChan <- reason
@@ -289,11 +289,16 @@ func runWebsocketClient() error {
289289
header.Set("Authorization", "Bearer "+config.CloudToken)
290290
dialCtx, cancelDial := context.WithTimeout(context.Background(), CloudWebSocketConnectTimeout)
291291

292+
scopedLogger := websocketLogger.With().
293+
Str("source", wsURL.Host).
294+
Str("sourceType", "cloud").
295+
Logger()
296+
292297
defer cancelDial()
293298
c, _, err := websocket.Dial(dialCtx, wsURL.String(), &websocket.DialOptions{
294299
HTTPHeader: header,
295300
OnPingReceived: func(ctx context.Context, payload []byte) bool {
296-
websocketLogger.Infof("ping frame received: %v, source: %s, sourceType: cloud", payload, wsURL.Host)
301+
scopedLogger.Info().Bytes("payload", payload).Int("length", len(payload)).Msg("ping frame received")
297302

298303
metricConnectionTotalPingReceivedCount.WithLabelValues("cloud", wsURL.Host).Inc()
299304
metricConnectionLastPingReceivedTimestamp.WithLabelValues("cloud", wsURL.Host).SetToCurrentTime()
@@ -304,19 +309,19 @@ func runWebsocketClient() error {
304309
// if the context is canceled, we don't want to return an error
305310
if err != nil {
306311
if errors.Is(err, context.Canceled) {
307-
cloudLogger.Infof("websocket connection canceled")
312+
cloudLogger.Info().Msg("websocket connection canceled")
308313
return nil
309314
}
310315
return err
311316
}
312317
defer c.CloseNow() //nolint:errcheck
313-
cloudLogger.Infof("websocket connected to %s", wsURL)
318+
cloudLogger.Info().Str("url", wsURL.String()).Msg("websocket connected")
314319

315320
// set the metrics when we successfully connect to the cloud.
316321
wsResetMetrics(true, "cloud", wsURL.Host)
317322

318323
// we don't have a source for the cloud connection
319-
return handleWebRTCSignalWsMessages(c, true, wsURL.Host)
324+
return handleWebRTCSignalWsMessages(c, true, wsURL.Host, &scopedLogger)
320325
}
321326

322327
func authenticateSession(ctx context.Context, c *websocket.Conn, req WebRTCSessionRequest) error {
@@ -327,7 +332,7 @@ func authenticateSession(ctx context.Context, c *websocket.Conn, req WebRTCSessi
327332
_ = wsjson.Write(context.Background(), c, gin.H{
328333
"error": fmt.Sprintf("failed to initialize OIDC provider: %v", err),
329334
})
330-
cloudLogger.Errorf("failed to initialize OIDC provider: %v", err)
335+
cloudLogger.Warn().Err(err).Msg("failed to initialize OIDC provider")
331336
return err
332337
}
333338

@@ -396,8 +401,8 @@ func handleSessionRequest(ctx context.Context, c *websocket.Conn, req WebRTCSess
396401
}()
397402
}
398403

399-
cloudLogger.Info("new session accepted")
400-
cloudLogger.Tracef("new session accepted: %v", session)
404+
cloudLogger.Info().Interface("session", session).Msg("new session accepted")
405+
cloudLogger.Trace().Interface("session", session).Msg("new session accepted")
401406
currentSession = session
402407
_ = wsjson.Write(context.Background(), c, gin.H{"type": "answer", "data": sd})
403408
return nil
@@ -413,21 +418,21 @@ func RunWebsocketClient() {
413418

414419
// If the network is not up, well, we can't connect to the cloud.
415420
if !networkState.Up {
416-
cloudLogger.Warn("waiting for network to be up, will retry in 3 seconds")
421+
cloudLogger.Warn().Msg("waiting for network to be up, will retry in 3 seconds")
417422
time.Sleep(3 * time.Second)
418423
continue
419424
}
420425

421426
// If the system time is not synchronized, the API request will fail anyway because the TLS handshake will fail.
422427
if isTimeSyncNeeded() && !timeSyncSuccess {
423-
cloudLogger.Warn("system time is not synced, will retry in 3 seconds")
428+
cloudLogger.Warn().Msg("system time is not synced, will retry in 3 seconds")
424429
time.Sleep(3 * time.Second)
425430
continue
426431
}
427432

428433
err := runWebsocketClient()
429434
if err != nil {
430-
cloudLogger.Errorf("websocket client error: %v", err)
435+
cloudLogger.Warn().Err(err).Msg("websocket client error")
431436
metricCloudConnectionStatus.Set(0)
432437
metricCloudConnectionFailureCount.Inc()
433438
time.Sleep(5 * time.Second)
@@ -479,7 +484,7 @@ func rpcDeregisterDevice() error {
479484
return fmt.Errorf("failed to save configuration after deregistering: %w", err)
480485
}
481486

482-
cloudLogger.Infof("device deregistered, disconnecting from cloud")
487+
cloudLogger.Info().Msg("device deregistered, disconnecting from cloud")
483488
disconnectCloud(fmt.Errorf("device deregistered"))
484489

485490
return nil

config.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func LoadConfig() {
132132
defer configLock.Unlock()
133133

134134
if config != nil {
135-
logger.Info("config already loaded, skipping")
135+
logger.Info().Msg("config already loaded, skipping")
136136
return
137137
}
138138

@@ -141,15 +141,15 @@ func LoadConfig() {
141141

142142
file, err := os.Open(configPath)
143143
if err != nil {
144-
logger.Debug("default config file doesn't exist, using default")
144+
logger.Debug().Msg("default config file doesn't exist, using default")
145145
return
146146
}
147147
defer file.Close()
148148

149149
// load and merge the default config with the user config
150150
loadedConfig := *defaultConfig
151151
if err := json.NewDecoder(file).Decode(&loadedConfig); err != nil {
152-
logger.Errorf("config file JSON parsing failed, %v", err)
152+
logger.Warn().Err(err).Msg("config file JSON parsing failed")
153153
return
154154
}
155155

display.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const (
2424
func switchToScreen(screen string) {
2525
_, err := CallCtrlAction("lv_scr_load", map[string]interface{}{"obj": screen})
2626
if err != nil {
27-
logger.Warnf("failed to switch to screen %s: %v", screen, err)
27+
displayLogger.Warn().Err(err).Str("screen", screen).Msg("failed to switch to screen")
2828
return
2929
}
3030
currentScreen = screen
@@ -40,7 +40,7 @@ func updateLabelIfChanged(objName string, newText string) {
4040
}
4141

4242
func switchToScreenIfDifferent(screenName string) {
43-
logger.Infof("switching screen from %s to %s", currentScreen, screenName)
43+
displayLogger.Info().Str("from", currentScreen).Str("to", screenName).Msg("switching screen")
4444
if currentScreen != screenName {
4545
switchToScreen(screenName)
4646
}
@@ -74,12 +74,12 @@ var displayInited = false
7474

7575
func requestDisplayUpdate() {
7676
if !displayInited {
77-
logger.Info("display not inited, skipping updates")
77+
displayLogger.Info().Msg("display not inited, skipping updates")
7878
return
7979
}
8080
go func() {
8181
wakeDisplay(false)
82-
logger.Info("display updating")
82+
displayLogger.Info().Msg("display updating")
8383
//TODO: only run once regardless how many pending updates
8484
updateDisplay()
8585
}()
@@ -118,7 +118,7 @@ func setDisplayBrightness(brightness int) error {
118118
return err
119119
}
120120

121-
logger.Infof("display: set brightness to %v", brightness)
121+
displayLogger.Info().Int("brightness", brightness).Msg("set brightness")
122122
return nil
123123
}
124124

@@ -127,7 +127,7 @@ func setDisplayBrightness(brightness int) error {
127127
func tick_displayDim() {
128128
err := setDisplayBrightness(config.DisplayMaxBrightness / 2)
129129
if err != nil {
130-
logger.Warnf("display: failed to dim display: %s", err)
130+
displayLogger.Warn().Err(err).Msg("failed to dim display")
131131
}
132132

133133
dimTicker.Stop()
@@ -140,7 +140,7 @@ func tick_displayDim() {
140140
func tick_displayOff() {
141141
err := setDisplayBrightness(0)
142142
if err != nil {
143-
logger.Warnf("display: failed to turn off display: %s", err)
143+
displayLogger.Warn().Err(err).Msg("failed to turn off display")
144144
}
145145

146146
offTicker.Stop()
@@ -163,7 +163,7 @@ func wakeDisplay(force bool) {
163163

164164
err := setDisplayBrightness(config.DisplayMaxBrightness)
165165
if err != nil {
166-
logger.Warnf("display wake failed, %s", err)
166+
displayLogger.Warn().Err(err).Msg("failed to wake display")
167167
}
168168

169169
if config.DisplayDimAfterSec != 0 {
@@ -183,7 +183,7 @@ func wakeDisplay(force bool) {
183183
func watchTsEvents() {
184184
ts, err := os.OpenFile(touchscreenDevice, os.O_RDONLY, 0666)
185185
if err != nil {
186-
logger.Warnf("display: failed to open touchscreen device: %s", err)
186+
displayLogger.Warn().Err(err).Msg("failed to open touchscreen device")
187187
return
188188
}
189189

@@ -196,7 +196,7 @@ func watchTsEvents() {
196196
for {
197197
_, err := ts.Read(buf)
198198
if err != nil {
199-
logger.Warnf("display: failed to read from touchscreen device: %s", err)
199+
displayLogger.Warn().Err(err).Msg("failed to read from touchscreen device")
200200
return
201201
}
202202

@@ -216,7 +216,7 @@ func startBacklightTickers() {
216216
}
217217

218218
if dimTicker == nil && config.DisplayDimAfterSec != 0 {
219-
logger.Info("display: dim_ticker has started")
219+
displayLogger.Info().Msg("dim_ticker has started")
220220
dimTicker = time.NewTicker(time.Duration(config.DisplayDimAfterSec) * time.Second)
221221
defer dimTicker.Stop()
222222

@@ -231,7 +231,7 @@ func startBacklightTickers() {
231231
}
232232

233233
if offTicker == nil && config.DisplayOffAfterSec != 0 {
234-
logger.Info("display: off_ticker has started")
234+
displayLogger.Info().Msg("off_ticker has started")
235235
offTicker = time.NewTicker(time.Duration(config.DisplayOffAfterSec) * time.Second)
236236
defer offTicker.Stop()
237237

@@ -251,11 +251,11 @@ func init() {
251251

252252
go func() {
253253
waitCtrlClientConnected()
254-
logger.Info("setting initial display contents")
254+
displayLogger.Info().Msg("setting initial display contents")
255255
time.Sleep(500 * time.Millisecond)
256256
updateStaticContents()
257257
displayInited = true
258-
logger.Info("display inited")
258+
displayLogger.Info().Msg("display inited")
259259
startBacklightTickers()
260260
wakeDisplay(true)
261261
requestDisplayUpdate()

fuse.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func RunFuseServer() {
103103
var err error
104104
fuseServer, err = fs.Mount(fuseMountPoint, &FuseRoot{}, opts)
105105
if err != nil {
106-
logger.Warnf("failed to mount fuse: %v", err)
106+
logger.Warn().Err(err).Msg("failed to mount fuse")
107107
}
108108
fuseServer.Wait()
109109
}

go.mod

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
module github.com/jetkvm/kvm
22

3-
go 1.21.0
4-
5-
toolchain go1.21.1
3+
go 1.23.0
64

75
require (
86
github.com/Masterminds/semver/v3 v3.3.0
97
github.com/beevik/ntp v1.3.1
108
github.com/coder/websocket v1.8.13
119
github.com/coreos/go-oidc/v3 v3.11.0
1210
github.com/creack/pty v1.1.23
13-
github.com/gin-gonic/gin v1.9.1
11+
github.com/gin-contrib/logger v1.2.5
12+
github.com/gin-gonic/gin v1.10.0
1413
github.com/google/uuid v1.6.0
1514
github.com/gwatts/rootcerts v0.0.0-20240401182218-3ab9db955caf
1615
github.com/hanwen/go-fuse/v2 v2.5.1
@@ -22,38 +21,39 @@ require (
2221
github.com/prometheus/client_golang v1.21.0
2322
github.com/prometheus/common v0.62.0
2423
github.com/psanford/httpreadat v0.1.0
24+
github.com/rs/zerolog v1.34.0
2525
github.com/vishvananda/netlink v1.3.0
2626
go.bug.st/serial v1.6.2
27-
golang.org/x/crypto v0.31.0
28-
golang.org/x/net v0.33.0
27+
golang.org/x/crypto v0.36.0
28+
golang.org/x/net v0.38.0
2929
)
3030

3131
replace github.com/pojntfx/go-nbd v0.3.2 => github.com/chemhack/go-nbd v0.0.0-20241006125820-59e45f5b1e7b
3232

3333
require (
3434
github.com/beorn7/perks v1.0.1 // indirect
35-
github.com/bytedance/sonic v1.11.6 // indirect
36-
github.com/bytedance/sonic/loader v0.1.1 // indirect
35+
github.com/bytedance/sonic v1.13.2 // indirect
36+
github.com/bytedance/sonic/loader v0.2.4 // indirect
3737
github.com/cespare/xxhash/v2 v2.3.0 // indirect
38-
github.com/cloudwego/base64x v0.1.4 // indirect
39-
github.com/cloudwego/iasm v0.2.0 // indirect
38+
github.com/cloudwego/base64x v0.1.5 // indirect
4039
github.com/creack/goselect v0.1.2 // indirect
41-
github.com/gabriel-vasile/mimetype v1.4.3 // indirect
42-
github.com/gin-contrib/sse v0.1.0 // indirect
40+
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
41+
github.com/gin-contrib/sse v1.0.0 // indirect
4342
github.com/go-jose/go-jose/v4 v4.0.2 // indirect
4443
github.com/go-playground/locales v0.14.1 // indirect
4544
github.com/go-playground/universal-translator v0.18.1 // indirect
46-
github.com/go-playground/validator/v10 v10.20.0 // indirect
47-
github.com/goccy/go-json v0.10.2 // indirect
45+
github.com/go-playground/validator/v10 v10.26.0 // indirect
46+
github.com/goccy/go-json v0.10.5 // indirect
4847
github.com/json-iterator/go v1.1.12 // indirect
4948
github.com/klauspost/compress v1.17.11 // indirect
50-
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
49+
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
5150
github.com/leodido/go-urn v1.4.0 // indirect
51+
github.com/mattn/go-colorable v0.1.14 // indirect
5252
github.com/mattn/go-isatty v0.0.20 // indirect
5353
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
5454
github.com/modern-go/reflect2 v1.0.2 // indirect
5555
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
56-
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
56+
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
5757
github.com/pilebones/go-udev v0.9.0 // indirect
5858
github.com/pion/datachannel v1.5.9 // indirect
5959
github.com/pion/dtls/v3 v3.0.3 // indirect
@@ -74,10 +74,10 @@ require (
7474
github.com/ugorji/go/codec v1.2.12 // indirect
7575
github.com/vishvananda/netns v0.0.4 // indirect
7676
github.com/wlynxg/anet v0.0.5 // indirect
77-
golang.org/x/arch v0.8.0 // indirect
77+
golang.org/x/arch v0.15.0 // indirect
7878
golang.org/x/oauth2 v0.24.0 // indirect
79-
golang.org/x/sys v0.28.0 // indirect
80-
golang.org/x/text v0.21.0 // indirect
81-
google.golang.org/protobuf v1.36.1 // indirect
79+
golang.org/x/sys v0.32.0 // indirect
80+
golang.org/x/text v0.23.0 // indirect
81+
google.golang.org/protobuf v1.36.6 // indirect
8282
gopkg.in/yaml.v3 v3.0.1 // indirect
8383
)

0 commit comments

Comments
 (0)