feat: add metrics for best and resolved payloads (#5469)

This commit is contained in:
Dan Cline
2023-11-24 12:43:48 -05:00
committed by GitHub
parent 62cebf0643
commit 269073b2d4
2 changed files with 43 additions and 2 deletions

View File

@ -6,7 +6,7 @@ use reth_metrics::{
};
/// Payload builder service metrics
#[derive(Metrics)]
#[derive(Metrics, Clone)]
#[metrics(scope = "payloads")]
pub(crate) struct PayloadBuilderServiceMetrics {
/// Number of active jobs
@ -15,6 +15,14 @@ pub(crate) struct PayloadBuilderServiceMetrics {
pub(crate) initiated_jobs: Counter,
/// Total number of failed jobs
pub(crate) failed_jobs: Counter,
/// Coinbase revenue for best payloads
pub(crate) best_revenue: Gauge,
/// Current block returned as the best payload
pub(crate) best_block: Gauge,
/// Coinbase revenue for resolved payloads
pub(crate) resolved_revenue: Gauge,
/// Current block returned as the resolved payload
pub(crate) resolved_block: Gauge,
}
impl PayloadBuilderServiceMetrics {
@ -29,4 +37,14 @@ impl PayloadBuilderServiceMetrics {
pub(crate) fn set_active_jobs(&self, value: usize) {
self.active_jobs.set(value as f64)
}
pub(crate) fn set_best_revenue(&self, block: u64, value: f64) {
self.best_block.set(block as f64);
self.best_revenue.set(value)
}
pub(crate) fn set_resolved_revenue(&self, block: u64, value: f64) {
self.resolved_block.set(block as f64);
self.resolved_revenue.set(value)
}
}

View File

@ -208,7 +208,17 @@ where
&self,
id: PayloadId,
) -> Option<Result<Arc<BuiltPayload>, PayloadBuilderError>> {
self.payload_jobs.iter().find(|(_, job_id)| *job_id == id).map(|(j, _)| j.best_payload())
let res = self
.payload_jobs
.iter()
.find(|(_, job_id)| *job_id == id)
.map(|(j, _)| j.best_payload());
if let Some(Ok(ref best)) = res {
// TODO: remove `to`
self.metrics.set_best_revenue(best.block.number, best.fees().to::<u128>() as f64);
}
res
}
/// Returns the payload attributes for the given payload.
@ -233,6 +243,19 @@ where
trace!(%id, "terminated resolved job");
}
// Since the fees will not be known until the payload future is resolved / awaited, we wrap
// the future in a new future that will update the metrics.
let resolved_metrics = self.metrics.clone();
let fut = async move {
let res = fut.await;
if let Ok(ref payload) = res {
// TODO: remove `to`
resolved_metrics
.set_resolved_revenue(payload.block.number, payload.fees().to::<u128>() as f64);
}
res
};
Some(Box::pin(fut))
}
}