66 "errors"
77 "fmt"
88 "net/http"
9+ "net/http/httptrace"
910 "net/url"
1011 "time"
1112
@@ -58,16 +59,46 @@ func (s *State) getUpdateURL(params UpdateParams) (string, error, bool) {
5859func (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+ clientTrace := & httptrace.ClientTrace {
85+ GetConn : func (hostPort string ) { traceLogger ().Str ("hostPort" , hostPort ).Msg ("starting to create conn" ) },
86+ DNSStart : func (info httptrace.DNSStartInfo ) {
87+ traceLogger ().Interface ("info" , info ).Msg ("starting to look up dns" )
88+ },
89+ DNSDone : func (info httptrace.DNSDoneInfo ) { traceLogger ().Interface ("info" , info ).Msg ("done looking up dns" ) },
90+ ConnectStart : func (network , addr string ) {
91+ traceLogger ().Str ("network" , network ).Str ("addr" , addr ).Msg ("starting tcp connection" )
92+ },
93+ ConnectDone : func (network , addr string , err error ) {
94+ traceLogger ().Str ("network" , network ).Str ("addr" , addr ).Err (err ).Msg ("tcp connection created" )
95+ },
96+ GotConn : func (info httptrace.GotConnInfo ) { traceLogger ().Interface ("info" , info ).Msg ("connection established" ) },
97+ }
98+ localCtx = httptrace .WithClientTrace (localCtx , clientTrace )
99+ }
100+
101+ req , err := http .NewRequestWithContext (localCtx , "GET" , url , nil )
71102 if err != nil {
72103 return nil , fmt .Errorf ("error creating request: %w" , err )
73104 }
@@ -80,6 +111,10 @@ func (s *State) fetchUpdateMetadata(ctx context.Context, params UpdateParams) (*
80111 }
81112 defer resp .Body .Close ()
82113
114+ traceLogger ().
115+ Int ("status" , resp .StatusCode ).
116+ Msg ("fetchUpdateMetadata: response" )
117+
83118 if isCustomVersion && resp .StatusCode == http .StatusNotFound {
84119 return nil , ErrVersionNotFound
85120 }
@@ -93,6 +128,9 @@ func (s *State) fetchUpdateMetadata(ctx context.Context, params UpdateParams) (*
93128 return nil , fmt .Errorf ("error decoding response: %w" , err )
94129 }
95130
131+ traceLogger ().
132+ Msg ("fetchUpdateMetadata: completed" )
133+
96134 return metadata , nil
97135}
98136
@@ -225,6 +263,9 @@ type UpdateParams struct {
225263 Components map [string ]string `json:"components"`
226264 IncludePreRelease bool `json:"includePreRelease"`
227265 ResetConfig bool `json:"resetConfig"`
266+ // RequestID is a unique identifier for the update request
267+ // When it's set, detailed trace logs will be enabled (if the log level is Trace)
268+ RequestID string
228269}
229270
230271// getUpdateStatus gets the update status for the given components
@@ -274,9 +315,16 @@ func (s *State) checkUpdateStatus(
274315 appUpdateStatus .localVersion = appVersionLocal .String ()
275316 systemUpdateStatus .localVersion = systemVersionLocal .String ()
276317
277- s .l .Trace ().
318+ logger := s .l .With ().Logger ()
319+ if params .RequestID != "" {
320+ logger = logger .With ().Str ("requestID" , params .RequestID ).Logger ()
321+ }
322+ t := time .Now ()
323+
324+ logger .Trace ().
278325 Str ("appVersionLocal" , appVersionLocal .String ()).
279326 Str ("systemVersionLocal" , systemVersionLocal .String ()).
327+ Dur ("duration" , time .Since (t )).
280328 Msg ("checkUpdateStatus: getLocalVersion" )
281329
282330 // fetch the remote metadata
@@ -290,8 +338,9 @@ func (s *State) checkUpdateStatus(
290338 return err
291339 }
292340
293- s . l .Trace ().
341+ logger .Trace ().
294342 Interface ("remoteMetadata" , remoteMetadata ).
343+ Dur ("duration" , time .Since (t )).
295344 Msg ("checkUpdateStatus: fetchUpdateMetadata" )
296345
297346 // parse the remote metadata to the componentUpdateStatuses
@@ -314,10 +363,14 @@ func (s *State) checkUpdateStatus(
314363 }
315364
316365 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]" )
366+ appUpdateStatus .getZerologLogger (& logger ).Trace ().Msg ("checkUpdateStatus: remoteMetadataToComponentStatus [app]" )
367+ systemUpdateStatus .getZerologLogger (& logger ).Trace ().Msg ("checkUpdateStatus: remoteMetadataToComponentStatus [system]" )
319368 }
320369
370+ logger .Trace ().
371+ Dur ("duration" , time .Since (t )).
372+ Msg ("checkUpdateStatus: completed" )
373+
321374 return nil
322375}
323376
0 commit comments