feat: add payload builder service metrics (#2347)

This commit is contained in:
Matthias Seitz
2023-04-23 18:44:32 +02:00
committed by GitHub
parent ad77de49f0
commit ab581ae890
4 changed files with 46 additions and 2 deletions

View File

@ -19,6 +19,10 @@ reth-revm-primitives = { path = "../../revm/revm-primitives" }
## ethereum ## ethereum
revm-primitives = "1.1" revm-primitives = "1.1"
# metrics
metrics = "0.20.1"
reth-metrics-derive = { path = "../../metrics/metrics-derive" }
## async ## async
tokio = { version = "1", features = ["sync"] } tokio = { version = "1", features = ["sync"] }
tokio-stream = "0.1" tokio-stream = "0.1"

View File

@ -18,6 +18,7 @@
//! - [PayloadJob]: a type that can yields (better) payloads over time. //! - [PayloadJob]: a type that can yields (better) payloads over time.
pub mod error; pub mod error;
mod metrics;
mod payload; mod payload;
mod service; mod service;
mod traits; mod traits;

View File

@ -0,0 +1,30 @@
//! Payloadbuild service metrics.
use metrics::{Counter, Gauge};
use reth_metrics_derive::Metrics;
/// Transaction pool metrics
#[derive(Metrics)]
#[metrics(scope = "payloads")]
pub(crate) struct PayloadBuilderServiceMetrics {
/// Number of active jobs
pub(crate) active_jobs: Gauge,
/// Total number of initiated jobs
pub(crate) initiated_jobs: Counter,
/// Total number of failed jobs
pub(crate) failed_jobs: Counter,
}
impl PayloadBuilderServiceMetrics {
pub(crate) fn inc_initiated_jobs(&self) {
self.initiated_jobs.increment(1);
}
pub(crate) fn inc_failed_jobs(&self) {
self.failed_jobs.increment(1);
}
pub(crate) fn set_active_jobs(&self, value: usize) {
self.active_jobs.set(value as f64)
}
}

View File

@ -4,8 +4,8 @@
//! Once a new payload is created, it is continuously updated. //! Once a new payload is created, it is continuously updated.
use crate::{ use crate::{
error::PayloadBuilderError, traits::PayloadJobGenerator, BuiltPayload, error::PayloadBuilderError, metrics::PayloadBuilderServiceMetrics, traits::PayloadJobGenerator,
PayloadBuilderAttributes, PayloadJob, BuiltPayload, PayloadBuilderAttributes, PayloadJob,
}; };
use futures_util::stream::{StreamExt, TryStreamExt}; use futures_util::stream::{StreamExt, TryStreamExt};
use reth_rpc_types::engine::PayloadId; use reth_rpc_types::engine::PayloadId;
@ -106,6 +106,8 @@ where
_service_tx: mpsc::UnboundedSender<PayloadServiceCommand>, _service_tx: mpsc::UnboundedSender<PayloadServiceCommand>,
/// Receiver half of the command channel. /// Receiver half of the command channel.
command_rx: UnboundedReceiverStream<PayloadServiceCommand>, command_rx: UnboundedReceiverStream<PayloadServiceCommand>,
/// metrics for the payload builder service
metrics: PayloadBuilderServiceMetrics,
} }
// === impl PayloadBuilderService === // === impl PayloadBuilderService ===
@ -122,6 +124,7 @@ where
payload_jobs: Vec::new(), payload_jobs: Vec::new(),
_service_tx: service_tx.clone(), _service_tx: service_tx.clone(),
command_rx: UnboundedReceiverStream::new(command_rx), command_rx: UnboundedReceiverStream::new(command_rx),
metrics: Default::default(),
}; };
let handle = PayloadBuilderHandle { to_service: service_tx }; let handle = PayloadBuilderHandle { to_service: service_tx };
(service, handle) (service, handle)
@ -159,15 +162,19 @@ where
loop { loop {
match job.try_poll_next_unpin(cx) { match job.try_poll_next_unpin(cx) {
Poll::Ready(Some(Ok(payload))) => { Poll::Ready(Some(Ok(payload))) => {
this.metrics.set_active_jobs(this.payload_jobs.len());
trace!(?payload, %id, "new payload"); trace!(?payload, %id, "new payload");
} }
Poll::Ready(Some(Err(err))) => { Poll::Ready(Some(Err(err))) => {
warn!(?err, %id, "payload job failed; resolving payload"); warn!(?err, %id, "payload job failed; resolving payload");
this.metrics.set_active_jobs(this.payload_jobs.len());
this.metrics.inc_failed_jobs();
continue 'jobs continue 'jobs
} }
Poll::Ready(None) => { Poll::Ready(None) => {
// job is done // job is done
trace!(?id, "payload job finished"); trace!(?id, "payload job finished");
this.metrics.set_active_jobs(this.payload_jobs.len());
continue 'jobs continue 'jobs
} }
Poll::Pending => { Poll::Pending => {
@ -194,10 +201,12 @@ where
// no job for this payload yet, create one // no job for this payload yet, create one
match this.generator.new_payload_job(attr) { match this.generator.new_payload_job(attr) {
Ok(job) => { Ok(job) => {
this.metrics.inc_initiated_jobs();
new_job = true; new_job = true;
this.payload_jobs.push((job, id)); this.payload_jobs.push((job, id));
} }
Err(err) => { Err(err) => {
this.metrics.inc_failed_jobs();
warn!(?err, %id, "failed to create payload job"); warn!(?err, %id, "failed to create payload job");
res = Err(err); res = Err(err);
} }