diff --git a/lez/sequencer/core/metrics/src/record.rs b/lez/sequencer/core/metrics/src/record.rs index 9a9b3f42..96b3304e 100644 --- a/lez/sequencer/core/metrics/src/record.rs +++ b/lez/sequencer/core/metrics/src/record.rs @@ -26,6 +26,14 @@ pub enum TxKind { ProgramDeployment, } +/// Whether applying a transaction to the block's working state succeeded. +#[derive(Debug, Clone, Copy, strum::IntoStaticStr, strum::EnumIter)] +#[strum(serialize_all = "snake_case")] +pub enum ApplyStatus { + Applied, + Failed, +} + impl From for TxKind { fn from(kind: common::transaction::TxKind) -> Self { match kind { @@ -47,7 +55,11 @@ pub fn init() { drop(transactions_per_block_histogram()); for origin in TransactionOrigin::iter() { for kind in TxKind::iter() { - drop(mempool_transaction_application_time_histogram(origin, kind)); + for status in ApplyStatus::iter() { + drop(mempool_transaction_application_time_histogram( + origin, kind, status, + )); + } } } } @@ -107,6 +119,7 @@ pub fn record_mempool_max_size(size: usize) { fn mempool_transaction_application_time_histogram( origin: TransactionOrigin, kind: TxKind, + status: ApplyStatus, ) -> Histogram { histogram!( description: "Time taken to apply a mempool transaction", @@ -114,15 +127,18 @@ fn mempool_transaction_application_time_histogram( names::MEMPOOL_TRANSACTION_APPLICATION_TIME, "origin" => <&'static str>::from(origin), "kind" => <&'static str>::from(kind), + "status" => <&'static str>::from(status), ) } pub fn record_mempool_transaction_application_time( origin: TransactionOrigin, kind: TxKind, + status: ApplyStatus, duration: Duration, ) { - mempool_transaction_application_time_histogram(origin, kind).record(duration.as_secs_f64()); + mempool_transaction_application_time_histogram(origin, kind, status) + .record(duration.as_secs_f64()); } fn transactions_per_block_histogram() -> Histogram { diff --git a/lez/sequencer/core/src/lib.rs b/lez/sequencer/core/src/lib.rs index 77888b35..e38a19ca 100644 --- a/lez/sequencer/core/src/lib.rs +++ b/lez/sequencer/core/src/lib.rs @@ -902,16 +902,22 @@ impl SequencerCore { new_block_timestamp, &mut withdrawals, ); - sequencer_core_metrics::record_mempool_transaction_application_time( - origin.into(), - tx.kind().into(), - before_tx_apply.elapsed(), - ); - if applied { + sequencer_core_metrics::record_mempool_transaction_application_time( + origin.into(), + tx.kind().into(), + sequencer_core_metrics::ApplyStatus::Applied, + before_tx_apply.elapsed(), + ); valid_transactions.push(tx); } else { sequencer_core_metrics::increment_mempool_failed_transactions_total(); + sequencer_core_metrics::record_mempool_transaction_application_time( + origin.into(), + tx.kind().into(), + sequencer_core_metrics::ApplyStatus::Failed, + before_tx_apply.elapsed(), + ); // A failed transaction is simply left out of the block, except a // dispatch: that one is re-fed from the store every turn, so one // that can never execute would fail on every block for ever. diff --git a/monitoring/grafana/dashboards/sequencer.json b/monitoring/grafana/dashboards/sequencer.json index f9297c80..ede0ae4b 100644 --- a/monitoring/grafana/dashboards/sequencer.json +++ b/monitoring/grafana/dashboards/sequencer.json @@ -131,8 +131,8 @@ "targets": [ { "datasource": { "type": "prometheus", "uid": "prometheus" }, - "expr": "histogram_quantile(${percentile}, sum by (le, kind, origin) (rate(mempool_transaction_application_time_seconds_bucket[$__rate_interval])))", - "legendFormat": "{{kind}} · {{origin}}", + "expr": "histogram_quantile(${percentile}, sum by (le, kind, origin, status) (rate(mempool_transaction_application_time_seconds_bucket[$__rate_interval])))", + "legendFormat": "{{kind}} · {{origin}} · {{status}}", "refId": "A" } ], diff --git a/tools/dashboard_gen/src/dashboards/sequencer.rs b/tools/dashboard_gen/src/dashboards/sequencer.rs index 2956edfa..0520251c 100644 --- a/tools/dashboard_gen/src/dashboards/sequencer.rs +++ b/tools/dashboard_gen/src/dashboards/sequencer.rs @@ -75,8 +75,8 @@ pub fn dashboard() -> Dashboard { .unit(Unit::Seconds) .target(selected_percentile( sequencer_core_metrics::names::MEMPOOL_TRANSACTION_APPLICATION_TIME, - &["kind", "origin"], - "{{kind}} · {{origin}}", + &["kind", "origin", "status"], + "{{kind}} · {{origin}} · {{status}}", )), Panel::timeseries("Transactions per block") .width(12)