From 4e95f6e7c4df982a29ae6450ca36082b0c6c59eb Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Mon, 24 Apr 2023 20:29:29 +0200 Subject: [PATCH] feat: add payload build metrics (#2367) --- Cargo.lock | 2 ++ crates/payload/basic/Cargo.toml | 4 ++++ crates/payload/basic/src/lib.rs | 9 ++++++++ crates/payload/basic/src/metrics.rs | 30 +++++++++++++++++++++++++++ crates/payload/builder/src/metrics.rs | 4 ++-- 5 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 crates/payload/basic/src/metrics.rs diff --git a/Cargo.lock b/Cargo.lock index ff6c5d3bf..a2ee6c051 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4641,6 +4641,8 @@ version = "0.1.0" dependencies = [ "futures-core", "futures-util", + "metrics", + "reth-metrics-derive", "reth-payload-builder", "reth-primitives", "reth-provider", diff --git a/crates/payload/basic/Cargo.toml b/crates/payload/basic/Cargo.toml index f86bc5fe1..9d585cbe2 100644 --- a/crates/payload/basic/Cargo.toml +++ b/crates/payload/basic/Cargo.toml @@ -20,6 +20,10 @@ reth-tasks = { path = "../../tasks" } ## ethereum revm = { version = "3" } +# metrics +metrics = "0.20.1" +reth-metrics-derive = { path = "../../metrics/metrics-derive" } + ## async tokio = { version = "1", features = ["sync", "time"] } futures-core = "0.3" diff --git a/crates/payload/basic/src/lib.rs b/crates/payload/basic/src/lib.rs index f10eadab6..0b22bc87c 100644 --- a/crates/payload/basic/src/lib.rs +++ b/crates/payload/basic/src/lib.rs @@ -7,6 +7,7 @@ //! reth basic payload job generator +use crate::metrics::PayloadBuilderMetrics; use futures_core::{ready, Stream}; use futures_util::FutureExt; use reth_payload_builder::{ @@ -47,6 +48,8 @@ use tokio::{ }; use tracing::trace; +mod metrics; + /// The [PayloadJobGenerator] that creates [BasicPayloadJob]s. pub struct BasicPayloadJobGenerator { /// The client that can interact with the chain. @@ -143,6 +146,7 @@ where best_payload: None, pending_block: None, payload_task_guard: self.payload_task_guard.clone(), + metrics: Default::default(), }) } } @@ -252,6 +256,8 @@ pub struct BasicPayloadJob { pending_block: Option, /// Restricts how many generator tasks can be executed at once. payload_task_guard: PayloadTaskGuard, + /// metrics for this type + metrics: PayloadBuilderMetrics, } impl Stream for BasicPayloadJob @@ -283,6 +289,7 @@ where let guard = this.payload_task_guard.clone(); let payload_config = this.config.clone(); let best_payload = this.best_payload.clone(); + this.metrics.inc_initiated_payload_builds(); this.executor.spawn_blocking(Box::pin(async move { // acquire the permit for executing the task let _permit = guard.0.acquire().await; @@ -311,6 +318,7 @@ where } } Poll::Ready(Err(err)) => { + this.metrics.inc_failed_payload_builds(); this.interval.reset(); return Poll::Ready(Some(Err(err))) } @@ -345,6 +353,7 @@ where // Note: it is assumed that this is unlikely to happen, as the payload job is started right // away and the first full block should have been built by the time CL is requesting the // payload. + self.metrics.inc_requested_empty_payload(); build_empty_payload(&self.client, self.config.clone()).map(Arc::new) } } diff --git a/crates/payload/basic/src/metrics.rs b/crates/payload/basic/src/metrics.rs new file mode 100644 index 000000000..5425ac24b --- /dev/null +++ b/crates/payload/basic/src/metrics.rs @@ -0,0 +1,30 @@ +//! Metrics for the payload builder impl + +use metrics::Counter; +use reth_metrics_derive::Metrics; + +/// Transaction pool metrics +#[derive(Metrics)] +#[metrics(scope = "payloads")] +pub(crate) struct PayloadBuilderMetrics { + /// Number of active jobs + pub(crate) requested_empty_payload: Counter, + /// Total number of initiated payload build attempts + pub(crate) initiated_payload_builds: Counter, + /// Total number of failed payload build attempts + pub(crate) failed_payload_builds: Counter, +} + +impl PayloadBuilderMetrics { + pub(crate) fn inc_requested_empty_payload(&self) { + self.requested_empty_payload.increment(1); + } + + pub(crate) fn inc_initiated_payload_builds(&self) { + self.initiated_payload_builds.increment(1); + } + + pub(crate) fn inc_failed_payload_builds(&self) { + self.failed_payload_builds.increment(1); + } +} diff --git a/crates/payload/builder/src/metrics.rs b/crates/payload/builder/src/metrics.rs index 599133e08..0f4113f2a 100644 --- a/crates/payload/builder/src/metrics.rs +++ b/crates/payload/builder/src/metrics.rs @@ -1,9 +1,9 @@ -//! Payloadbuild service metrics. +//! Payload builder service metrics. use metrics::{Counter, Gauge}; use reth_metrics_derive::Metrics; -/// Transaction pool metrics +/// Payload builder service metrics #[derive(Metrics)] #[metrics(scope = "payloads")] pub(crate) struct PayloadBuilderServiceMetrics {