mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: add payload builder service metrics (#2347)
This commit is contained in:
@ -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"
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
30
crates/payload/builder/src/metrics.rs
Normal file
30
crates/payload/builder/src/metrics.rs
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user