From da9f00bd29b8c853d7dbe6311e007b014245e67a Mon Sep 17 00:00:00 2001 From: Swanny Date: Wed, 11 Dec 2024 17:16:02 -0500 Subject: [PATCH 1/3] feat: metrics for when blocks are submitted --- Cargo.toml | 2 ++ bin/builder.rs | 3 +++ src/tasks/submit.rs | 12 ++++++++++++ 3 files changed, 17 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 8e51564..4b716db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,3 +50,5 @@ tracing-subscriber = "0.3.18" async-trait = "0.1.80" oauth2 = "4.4.2" +metrics = "0.24.1" +metrics-exporter-prometheus = "0.16.0" diff --git a/bin/builder.rs b/bin/builder.rs index 8a419ac..e517782 100644 --- a/bin/builder.rs +++ b/bin/builder.rs @@ -5,6 +5,7 @@ use builder::service::serve_builder_with_span; use builder::tasks::block::BlockBuilder; use builder::tasks::oauth::Authenticator; use builder::tasks::submit::SubmitTask; +use metrics_exporter_prometheus::PrometheusBuilder; use tokio::select; @@ -17,6 +18,8 @@ async fn main() -> eyre::Result<()> { let provider = config.connect_provider().await?; let authenticator = Authenticator::new(&config); + let _ = PrometheusBuilder::new().install().expect("failed to install prometheus exporter"); + tracing::debug!(rpc_url = config.host_rpc_url.as_ref(), "instantiated provider"); let sequencer_signer = config.connect_sequencer_signer().await?; diff --git a/src/tasks/submit.rs b/src/tasks/submit.rs index 9b5e5ac..2f7938b 100644 --- a/src/tasks/submit.rs +++ b/src/tasks/submit.rs @@ -17,7 +17,9 @@ use alloy::{ use alloy_primitives::{FixedBytes, U256}; use alloy_sol_types::SolError; use eyre::{bail, eyre}; +use metrics::{counter, histogram}; use oauth2::TokenResponse; +use std::time::Instant; use tokio::{sync::mpsc, task::JoinHandle}; use tracing::{debug, error, instrument, trace}; use zenith_types::{ @@ -264,12 +266,16 @@ impl SubmitTask { let handle = tokio::spawn(async move { loop { if let Some(in_progress) = inbound.recv().await { + let building_start_time = Instant::now(); let mut retries = 0; loop { match self.handle_inbound(&in_progress).await { Ok(ControlFlow::Retry) => { retries += 1; if retries > 3 { + counter!("block_building_too_many_retries").increment(1); + histogram!("builder.block_build_time") + .record(building_start_time.elapsed().as_millis() as f64); tracing::error!( "error handling inbound block: too many retries" ); @@ -279,10 +285,16 @@ impl SubmitTask { tokio::time::sleep(tokio::time::Duration::from_secs(2)).await; } Ok(ControlFlow::Skip) => { + histogram!("builder.block_build_time") + .record(building_start_time.elapsed().as_millis() as f64); + counter!("block_building_skipped_blocks").increment(1); tracing::info!("skipping block"); break; } Ok(ControlFlow::Done) => { + histogram!("builder.block_build_time") + .record(building_start_time.elapsed().as_millis() as f64); + counter!("block_building_successful_blocks").increment(1); tracing::info!("block landed successfully"); break; } From 8d24b3d545665b0794da01e2a778756cdb81b42b Mon Sep 17 00:00:00 2001 From: Swanny Date: Wed, 11 Dec 2024 17:26:18 -0500 Subject: [PATCH 2/3] feat: more counters and cleanup namespacing --- src/tasks/submit.rs | 8 ++++---- src/tasks/tx_poller.rs | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tasks/submit.rs b/src/tasks/submit.rs index 2f7938b..3ea1cf3 100644 --- a/src/tasks/submit.rs +++ b/src/tasks/submit.rs @@ -172,7 +172,6 @@ impl SubmitTask { return Ok(ControlFlow::Skip); } - self.send_transaction(resp, tx).await } @@ -254,6 +253,7 @@ impl SubmitTask { sig = hex::encode(resp.sig.as_bytes()), "acquired signature from quincey" ); + counter!("builder.quincey_signature_acquired").increment(1); resp }; @@ -273,7 +273,7 @@ impl SubmitTask { Ok(ControlFlow::Retry) => { retries += 1; if retries > 3 { - counter!("block_building_too_many_retries").increment(1); + counter!("builder.building_too_many_retries").increment(1); histogram!("builder.block_build_time") .record(building_start_time.elapsed().as_millis() as f64); tracing::error!( @@ -287,14 +287,14 @@ impl SubmitTask { Ok(ControlFlow::Skip) => { histogram!("builder.block_build_time") .record(building_start_time.elapsed().as_millis() as f64); - counter!("block_building_skipped_blocks").increment(1); + counter!("builder.skipped_blocks").increment(1); tracing::info!("skipping block"); break; } Ok(ControlFlow::Done) => { histogram!("builder.block_build_time") .record(building_start_time.elapsed().as_millis() as f64); - counter!("block_building_successful_blocks").increment(1); + counter!("builder.submitted_successful_blocks").increment(1); tracing::info!("block landed successfully"); break; } diff --git a/src/tasks/tx_poller.rs b/src/tasks/tx_poller.rs index e56510c..41e84e0 100644 --- a/src/tasks/tx_poller.rs +++ b/src/tasks/tx_poller.rs @@ -11,6 +11,8 @@ use serde_json::from_slice; pub use crate::config::BuilderConfig; +use metrics::counter; + #[derive(Debug, Clone, Serialize, Deserialize)] pub struct TxPoolResponse { transactions: Vec, @@ -54,6 +56,7 @@ impl TxPoller { self.seen_txns.entry(*tx.tx_hash()).or_insert_with(|| { // add to unique transactions unique.push(tx.clone()); + counter!("builder.unique_txs").increment(1); // expiry is now + cache_duration time::Instant::now() + Duration::from_secs(self.config.tx_pool_cache_duration) }); @@ -77,6 +80,7 @@ impl TxPoller { for key in expired_keys { self.seen_txns.remove(&key); + counter!("builder.evicted_txs").increment(1); } } } From 0fd24d60cc0bfd1d8018287be42555e040f71742 Mon Sep 17 00:00:00 2001 From: Swanny Date: Wed, 11 Dec 2024 17:27:53 -0500 Subject: [PATCH 3/3] chore: clippy fmt --- bin/builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/builder.rs b/bin/builder.rs index e517782..87bfc6b 100644 --- a/bin/builder.rs +++ b/bin/builder.rs @@ -18,7 +18,7 @@ async fn main() -> eyre::Result<()> { let provider = config.connect_provider().await?; let authenticator = Authenticator::new(&config); - let _ = PrometheusBuilder::new().install().expect("failed to install prometheus exporter"); + PrometheusBuilder::new().install().expect("failed to install prometheus exporter"); tracing::debug!(rpc_url = config.host_rpc_url.as_ref(), "instantiated provider");