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) {
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+
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
0 commit comments