@@ -21,7 +21,7 @@ use alloy_signer_local::PrivateKeySigner;
2121use axum:: http:: HeaderValue ;
2222use dashmap:: DashMap ;
2323use futures:: { stream:: FuturesUnordered , StreamExt } ;
24- use hyper:: { header:: CONTENT_TYPE , HeaderMap } ;
24+ use hyper:: { header:: CONTENT_TYPE , HeaderMap , StatusCode } ;
2525use reqwest:: Url ;
2626use revm_primitives:: keccak256;
2727use serde_json:: json;
@@ -304,6 +304,10 @@ impl ForwardingRequest {
304304
305305#[ derive( Debug ) ]
306306struct Response < Ok , Err > {
307+ /// Whether this was a big request.
308+ is_big : bool ,
309+ /// The type of the order.
310+ order_type : & ' static str ,
307311 /// The instant at which request was sent.
308312 start_time : Instant ,
309313 /// Builder response.
@@ -354,13 +358,41 @@ impl HttpForwarder {
354358 }
355359
356360 fn on_response ( & mut self , response : Response < reqwest:: Response , reqwest:: Error > ) {
357- let Response { start_time, response : response_result, .. } = response;
361+ let Response { start_time, response : response_result, order_type , is_big } = response;
358362 let elapsed = start_time. elapsed ( ) ;
359363
360364 match response_result {
361365 Ok ( response) => {
362- if let Err ( e) = self . error_decoder_tx . try_send ( ( response, elapsed) ) {
363- error ! ( target: FORWARDER , peer_name = %self . peer_name, ?e, "Failed to send error response to decoder" ) ;
366+ let status = response. status ( ) ;
367+
368+ // Print warning if the RPC call took more than 1 second.
369+ if elapsed > Duration :: from_secs ( 1 ) {
370+ warn ! ( target: FORWARDER , name = %self . peer_url, ?elapsed, order_type, is_big, %status, "Long RPC call" ) ;
371+ }
372+
373+ if status. is_success ( ) {
374+ if status != StatusCode :: OK {
375+ warn ! ( target: FORWARDER , name = %self . peer_url, ?elapsed, order_type, is_big, %status, "Non-OK status code" ) ;
376+ }
377+
378+ // Only record success if the status is OK.
379+ ForwarderMetrics :: record_rpc_call (
380+ self . peer_name . clone ( ) ,
381+ order_type,
382+ elapsed,
383+ is_big,
384+ ) ;
385+ } else {
386+ // If we have a non-OK status code, also record it.
387+ error ! ( target: FORWARDER , name = %self . peer_url, ?elapsed, order_type, is_big, %status, "Error forwarding request" ) ;
388+ ForwarderMetrics :: increment_http_call_failures (
389+ self . peer_name . clone ( ) ,
390+ status. canonical_reason ( ) . map ( String :: from) . unwrap_or ( status. to_string ( ) ) ,
391+ ) ;
392+
393+ if let Err ( e) = self . error_decoder_tx . try_send ( ( response, elapsed) ) {
394+ error ! ( target: FORWARDER , peer_name = %self . peer_name, ?e, "Failed to send error response to decoder" ) ;
395+ }
364396 }
365397 }
366398 Err ( error) => {
@@ -371,8 +403,8 @@ impl HttpForwarder {
371403 // None.
372404 let reason = error
373405 . status ( )
374- . and_then ( |s| s. canonical_reason ( ) . map ( |s| s . to_owned ( ) ) )
375- . unwrap_or ( error . to_string ( ) ) ;
406+ . and_then ( |s| s. canonical_reason ( ) . map ( String :: from ) )
407+ . unwrap_or ( format ! ( "{error:?}" ) ) ;
376408
377409 if error. is_connect ( ) {
378410 warn ! ( target: FORWARDER , peer_name = %self . peer_name, ?reason, ?elapsed, "Connection error" ) ;
@@ -411,7 +443,6 @@ impl Future for HttpForwarder {
411443 trace ! ( target: FORWARDER , name = %this. peer_name, ?request, "Sending request" ) ;
412444 this. pending . push ( send_http_request (
413445 this. client . clone ( ) ,
414- this. peer_name . clone ( ) ,
415446 this. peer_url . clone ( ) ,
416447 request,
417448 ) ) ;
@@ -460,7 +491,6 @@ impl ResponseErrorDecoder {
460491
461492fn send_http_request (
462493 client : reqwest:: Client ,
463- peer_name : String ,
464494 url : String ,
465495 request : Arc < ForwardingRequest > ,
466496) -> RequestFut < reqwest:: Response , reqwest:: Error > {
@@ -517,18 +547,7 @@ fn send_http_request(
517547 let response =
518548 client. post ( & url) . body ( order. encoding ( ) . to_vec ( ) ) . headers ( headers) . send ( ) . await ;
519549
520- if response. is_ok ( ) {
521- let elapsed = start_time. elapsed ( ) ;
522-
523- // Print warning if the RPC call took more than 1 second.
524- if elapsed > Duration :: from_secs ( 1 ) {
525- warn ! ( target: FORWARDER , name = %url, ?elapsed, is_big, size = order. encoding( ) . len( ) , order_type, "Long RPC call" ) ;
526- }
527-
528- ForwarderMetrics :: record_rpc_call ( peer_name, order_type, elapsed, is_big) ;
529- }
530-
531- Response { start_time, response }
550+ Response { start_time, response, is_big, order_type }
532551 } )
533552}
534553
0 commit comments