Skip to content

Commit ce1c660

Browse files
authored
fix(forwarder): http rtt metric, error reasons (#112)
1 parent 5a1c3cc commit ce1c660

File tree

3 files changed

+41
-22
lines changed

3 files changed

+41
-22
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "buildernet-orderflow-proxy"
3-
version = "1.1.0"
3+
version = "1.1.1"
44
edition = "2021"
55
publish = false
66
build = "build.rs"

src/forwarder.rs

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use alloy_signer_local::PrivateKeySigner;
2121
use axum::http::HeaderValue;
2222
use dashmap::DashMap;
2323
use futures::{stream::FuturesUnordered, StreamExt};
24-
use hyper::{header::CONTENT_TYPE, HeaderMap};
24+
use hyper::{header::CONTENT_TYPE, HeaderMap, StatusCode};
2525
use reqwest::Url;
2626
use revm_primitives::keccak256;
2727
use serde_json::json;
@@ -304,6 +304,10 @@ impl ForwardingRequest {
304304

305305
#[derive(Debug)]
306306
struct 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

461492
fn 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

Comments
 (0)