Skip to content

Commit f711eb5

Browse files
committed
chore: add requestID to update status API calls and increase timeout to 10s
1 parent d9f8054 commit f711eb5

File tree

4 files changed

+66
-7
lines changed

4 files changed

+66
-7
lines changed

internal/ota/ota.go

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"errors"
77
"fmt"
88
"net/http"
9+
"net/http/httptrace"
910
"net/url"
1011
"time"
1112

@@ -58,16 +59,47 @@ func (s *State) getUpdateURL(params UpdateParams) (string, error, bool) {
5859
func (s *State) fetchUpdateMetadata(ctx context.Context, params UpdateParams) (*UpdateMetadata, error) {
5960
metadata := &UpdateMetadata{}
6061

62+
logger := s.l.With().Logger()
63+
if params.RequestID != "" {
64+
logger = logger.With().Str("requestID", params.RequestID).Logger()
65+
}
66+
t := time.Now()
67+
traceLogger := func() *zerolog.Event {
68+
return logger.Trace().Dur("duration", time.Since(t))
69+
}
70+
6171
url, err, isCustomVersion := s.getUpdateURL(params)
72+
traceLogger().Err(err).
73+
Msg("fetchUpdateMetadata: getUpdateURL")
6274
if err != nil {
6375
return nil, fmt.Errorf("error getting update URL: %w", err)
6476
}
6577

66-
s.l.Trace().
78+
traceLogger().
6779
Str("url", url).
6880
Msg("fetching update metadata")
6981

70-
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
82+
localCtx := ctx
83+
if s.l.GetLevel() <= zerolog.TraceLevel {
84+
85+
clientTrace := &httptrace.ClientTrace{
86+
GetConn: func(hostPort string) { traceLogger().Str("hostPort", hostPort).Msg("starting to create conn") },
87+
DNSStart: func(info httptrace.DNSStartInfo) {
88+
traceLogger().Interface("info", info).Msg("starting to look up dns")
89+
},
90+
DNSDone: func(info httptrace.DNSDoneInfo) { traceLogger().Interface("info", info).Msg("done looking up dns") },
91+
ConnectStart: func(network, addr string) {
92+
traceLogger().Str("network", network).Str("addr", addr).Msg("starting tcp connection")
93+
},
94+
ConnectDone: func(network, addr string, err error) {
95+
traceLogger().Str("network", network).Str("addr", addr).Err(err).Msg("tcp connection created")
96+
},
97+
GotConn: func(info httptrace.GotConnInfo) { traceLogger().Interface("info", info).Msg("connection established") },
98+
}
99+
localCtx = httptrace.WithClientTrace(localCtx, clientTrace)
100+
}
101+
102+
req, err := http.NewRequestWithContext(localCtx, "GET", url, nil)
71103
if err != nil {
72104
return nil, fmt.Errorf("error creating request: %w", err)
73105
}
@@ -80,6 +112,10 @@ func (s *State) fetchUpdateMetadata(ctx context.Context, params UpdateParams) (*
80112
}
81113
defer resp.Body.Close()
82114

115+
traceLogger().
116+
Int("status", resp.StatusCode).
117+
Msg("fetchUpdateMetadata: response")
118+
83119
if isCustomVersion && resp.StatusCode == http.StatusNotFound {
84120
return nil, ErrVersionNotFound
85121
}
@@ -93,6 +129,9 @@ func (s *State) fetchUpdateMetadata(ctx context.Context, params UpdateParams) (*
93129
return nil, fmt.Errorf("error decoding response: %w", err)
94130
}
95131

132+
traceLogger().
133+
Msg("fetchUpdateMetadata: completed")
134+
96135
return metadata, nil
97136
}
98137

@@ -225,6 +264,9 @@ type UpdateParams struct {
225264
Components map[string]string `json:"components"`
226265
IncludePreRelease bool `json:"includePreRelease"`
227266
ResetConfig bool `json:"resetConfig"`
267+
// RequestID is a unique identifier for the update request
268+
// When it's set, detailed trace logs will be enabled (if the log level is Trace)
269+
RequestID string
228270
}
229271

230272
// getUpdateStatus gets the update status for the given components
@@ -274,9 +316,16 @@ func (s *State) checkUpdateStatus(
274316
appUpdateStatus.localVersion = appVersionLocal.String()
275317
systemUpdateStatus.localVersion = systemVersionLocal.String()
276318

277-
s.l.Trace().
319+
logger := s.l.With().Logger()
320+
if params.RequestID != "" {
321+
logger = logger.With().Str("requestID", params.RequestID).Logger()
322+
}
323+
t := time.Now()
324+
325+
logger.Trace().
278326
Str("appVersionLocal", appVersionLocal.String()).
279327
Str("systemVersionLocal", systemVersionLocal.String()).
328+
Dur("duration", time.Since(t)).
280329
Msg("checkUpdateStatus: getLocalVersion")
281330

282331
// fetch the remote metadata
@@ -290,8 +339,9 @@ func (s *State) checkUpdateStatus(
290339
return err
291340
}
292341

293-
s.l.Trace().
342+
logger.Trace().
294343
Interface("remoteMetadata", remoteMetadata).
344+
Dur("duration", time.Since(t)).
295345
Msg("checkUpdateStatus: fetchUpdateMetadata")
296346

297347
// parse the remote metadata to the componentUpdateStatuses
@@ -314,10 +364,14 @@ func (s *State) checkUpdateStatus(
314364
}
315365

316366
if s.l.GetLevel() <= zerolog.TraceLevel {
317-
appUpdateStatus.getZerologLogger(s.l).Trace().Msg("checkUpdateStatus: remoteMetadataToComponentStatus [app]")
318-
systemUpdateStatus.getZerologLogger(s.l).Trace().Msg("checkUpdateStatus: remoteMetadataToComponentStatus [system]")
367+
appUpdateStatus.getZerologLogger(&logger).Trace().Msg("checkUpdateStatus: remoteMetadataToComponentStatus [app]")
368+
systemUpdateStatus.getZerologLogger(&logger).Trace().Msg("checkUpdateStatus: remoteMetadataToComponentStatus [system]")
319369
}
320370

371+
logger.Trace().
372+
Dur("duration", time.Since(t)).
373+
Msg("checkUpdateStatus: completed")
374+
321375
return nil
322376
}
323377

jsonrpc.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ func onRPCMessage(message webrtc.DataChannelMessage, session *Session) {
123123
Interface("id", request.ID).Logger()
124124

125125
scopedLogger.Trace().Msg("Received RPC request")
126+
t := time.Now()
126127

127128
handler, ok := rpcHandlers[request.Method]
128129
if !ok {
@@ -154,7 +155,7 @@ func onRPCMessage(message webrtc.DataChannelMessage, session *Session) {
154155
return
155156
}
156157

157-
scopedLogger.Trace().Interface("result", result).Msg("RPC handler returned")
158+
scopedLogger.Trace().Dur("duration", time.Since(t)).Interface("result", result).Msg("RPC handler returned")
158159

159160
response := JSONRPCResponse{
160161
JSONRPC: "2.0",

ota.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99

1010
"github.com/Masterminds/semver/v3"
11+
"github.com/google/uuid"
1112
"github.com/jetkvm/kvm/internal/ota"
1213
)
1314

@@ -82,6 +83,7 @@ func getUpdateStatus(includePreRelease bool) (*ota.UpdateStatus, error) {
8283
updateStatus, err := otaState.GetUpdateStatus(context.Background(), ota.UpdateParams{
8384
DeviceID: GetDeviceID(),
8485
IncludePreRelease: includePreRelease,
86+
RequestID: uuid.New().String(),
8587
})
8688

8789
// to ensure backwards compatibility,

ui/src/utils/jsonrpc.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ export async function getUpdateStatus() {
232232
// It can be called on page load right after a restart, so we need to give it time to
233233
// establish a connection to the api server.
234234
maxAttempts: 6,
235+
attemptTimeoutMs: 10000,
235236
});
236237

237238
if (response.error) throw response.error;
@@ -252,6 +253,7 @@ export interface updateParams {
252253
}
253254

254255
export async function checkUpdateComponents(params: updateParams, includePreRelease: boolean) {
256+
console.log("checkUpdateComponents", JSON.stringify(params, null, 2), includePreRelease);
255257
const response = await callJsonRpc<SystemVersionInfo>({
256258
method: "checkUpdateComponents",
257259
params: {

0 commit comments

Comments
 (0)