@@ -324,28 +324,10 @@ func (server *relayMinerHTTPServer) serveSyncRequest(
324324 // Capture the service call request duration metric.
325325 relayer .CaptureServiceDuration (serviceId , serviceCallStartTime , httpResponse .StatusCode )
326326
327- // Serialize the service response to be sent back to the client.
328- // This will include the status code, headers, and body.
329- wrappedHTTPResponse , responseBz , err := SerializeHTTPResponse (logger , httpResponse , server .serverConfig .MaxBodySize )
330- if err != nil {
331- logger .Error ().Err (err ).Msg ("❌ Failed serializing the service response" )
332- return relayRequest , err
333- }
334-
335- // Pass through all backend responses including errors.
336- // Allows clients to see real HTTP status codes from backend service.
337- // Log non-2XX status codes for monitoring but don't block response.
338- if httpResponse .StatusCode >= http .StatusMultipleChoices {
339- logger .Error ().
340- Int ("status_code" , httpResponse .StatusCode ).
341- Str ("request_url" , httpRequest .URL .String ()).
342- Str ("request_payload_first_bytes" , polylog .Preview (string (relayRequest .Payload ))).
343- Str ("response_payload_first_bytes" , polylog .Preview (string (wrappedHTTPResponse .BodyBz ))).
344- Msg ("backend service returned a non-2XX status code. Passing it through to the client." )
345- }
346-
347327 // Check if the response is a stream
348328 streamThis := IsStreamingResponse (httpResponse )
329+ // Capture the time after response time for the relay.
330+ responsePreparationEnd := time .Now ()
349331 // Create empty relay response
350332 relayResponse := & types.RelayResponse {
351333 Meta : types.RelayResponseMetadata {SessionHeader : meta .SessionHeader },
@@ -366,16 +348,28 @@ func (server *relayMinerHTTPServer) serveSyncRequest(
366348
367349 // Serialize the service response to be sent back to the client.
368350 // This will include the status code, headers, and body.
369- _ , responseBz , err := SerializeHTTPResponse (logger , httpResponse , server .serverConfig .MaxBodySize )
351+ wrappedHTTPResponse , responseBz , err := SerializeHTTPResponse (logger , httpResponse , server .serverConfig .MaxBodySize )
370352 if err != nil {
371353 logger .Error ().Err (err ).Msg ("❌ Failed serializing the service response" )
372354 return relayRequest , err
373355 }
374356
357+ // Pass through all backend responses including errors.
358+ // Allows clients to see real HTTP status codes from backend service.
359+ // Log non-2XX status codes for monitoring but don't block response.
360+ if httpResponse .StatusCode >= http .StatusMultipleChoices {
361+ logger .Error ().
362+ Int ("status_code" , httpResponse .StatusCode ).
363+ Str ("request_url" , httpRequest .URL .String ()).
364+ Str ("request_payload_first_bytes" , polylog .Preview (string (relayRequest .Payload ))).
365+ Str ("response_payload_first_bytes" , polylog .Preview (string (wrappedHTTPResponse .BodyBz ))).
366+ Msg ("backend service returned a non-2XX status code. Passing it through to the client." )
367+ }
368+
375369 logger .Debug ().
376370 Str ("relay_request_session_header" , meta .SessionHeader .String ()).
377371 Msg ("building relay response protobuf from service response" )
378-
372+
379373 // Check context cancellation before building relay response to prevent signature race conditions
380374 if ctxErr := ctxWithDeadline .Err (); ctxErr != nil {
381375 logger .Warn ().Err (ctxErr ).Msg ("⚠️ Context canceled before building relay response - preventing signature race condition" )
@@ -398,7 +392,7 @@ func (server *relayMinerHTTPServer) serveSyncRequest(
398392 }
399393
400394 // Capture the time after response time for the relay.
401- responsePreparationEnd : = time .Now ()
395+ responsePreparationEnd = time .Now ()
402396 // Add response preparation duration to the logger such that any log before errors will have
403397 // as much request duration information as possible.
404398 logger = logger .With (
@@ -408,11 +402,14 @@ func (server *relayMinerHTTPServer) serveSyncRequest(
408402 relayer .CaptureResponsePreparationDuration (serviceId , backendServiceProcessingEnd )
409403
410404 // Send the relay response to the client.
411- if err = server .sendRelayResponse (relay .Res , writer ); err != nil {
405+ err = server .sendRelayResponse (relayResponse , writer )
406+ logger = logger .With ("send_response_duration" , time .Since (responsePreparationEnd ).String ())
407+ if err != nil {
412408 // If the originHost cannot be parsed, reply with an internal error so that
413409 // the original error is not exposed to the client.
414410 clientError := ErrRelayerProxyInternalError .Wrap (err .Error ())
415- logger .Warn ().Err (err ).Msg ("❌ Failed sending relay response" )
411+ // Log current time to highlight writer i/o timeout errors.
412+ logger .Warn ().Err (err ).Time ("current_time" , time .Now ()).Msg ("❌ Failed sending relay response" )
416413 return relayRequest , clientError
417414 }
418415
@@ -424,7 +421,6 @@ func (server *relayMinerHTTPServer) serveSyncRequest(
424421 // Create the relay response
425422 relay := & types.Relay {Req : relayRequest , Res : relayResponse }
426423
427-
428424 logger .ProbabilisticDebugInfo (polylog .ProbabilisticDebugInfoProb ).Msg ("relay request served successfully" )
429425
430426 relayer .RelaysSuccessTotal .With ("service_id" , serviceId ).Add (1 )
0 commit comments