diff --git a/Cargo.lock b/Cargo.lock index 533fab58e..1d5a8f1f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8744,11 +8744,13 @@ dependencies = [ "c-kzg", "derive_more", "futures-util", + "metrics", "op-alloy-consensus", "op-alloy-flz", "parking_lot", "reth-chain-state", "reth-chainspec", + "reth-metrics", "reth-optimism-chainspec", "reth-optimism-evm", "reth-optimism-forks", diff --git a/crates/optimism/txpool/Cargo.toml b/crates/optimism/txpool/Cargo.toml index 1331377d0..90cd92a61 100644 --- a/crates/optimism/txpool/Cargo.toml +++ b/crates/optimism/txpool/Cargo.toml @@ -35,6 +35,10 @@ reth-optimism-evm.workspace = true reth-optimism-forks.workspace = true reth-optimism-primitives = { workspace = true, features = ["reth-codec"] } +# metrics +reth-metrics.workspace = true +metrics.workspace = true + # misc c-kzg.workspace = true derive_more.workspace = true diff --git a/crates/optimism/txpool/src/maintain.rs b/crates/optimism/txpool/src/maintain.rs index b93ed3785..82a100ec8 100644 --- a/crates/optimism/txpool/src/maintain.rs +++ b/crates/optimism/txpool/src/maintain.rs @@ -1,12 +1,28 @@ //! Support for maintaining the state of the transaction pool +use crate::conditional::MaybeConditionalTransaction; use alloy_consensus::{conditional::BlockConditionalAttributes, BlockHeader}; use futures_util::{future::BoxFuture, FutureExt, Stream, StreamExt}; use reth_chain_state::CanonStateNotification; +use reth_metrics::{metrics::Counter, Metrics}; use reth_primitives_traits::NodePrimitives; use reth_transaction_pool::TransactionPool; -use crate::conditional::MaybeConditionalTransaction; +/// Transaction pool maintenance metrics +#[derive(Metrics)] +#[metrics(scope = "transaction_pool")] +struct MaintainPoolMetrics { + /// Counter indicating the number of conditional transactions removed from + /// the pool because of exceeded block attributes. + removed_tx_conditional: Counter, +} + +impl MaintainPoolMetrics { + #[inline] + fn inc_removed_tx_conditional(&self, count: usize) { + self.removed_tx_conditional.increment(count as u64); + } +} /// Returns a spawnable future for maintaining the state of the transaction pool. pub fn maintain_transaction_pool_future( @@ -35,6 +51,7 @@ where Pool::Transaction: MaybeConditionalTransaction, St: Stream> + Send + Unpin + 'static, { + let metrics = MaintainPoolMetrics::default(); loop { let Some(event) = events.next().await else { break }; if let CanonStateNotification::Commit { new } = event { @@ -51,7 +68,10 @@ where to_remove.push(*tx.hash()); } } - let _ = pool.remove_transactions(to_remove); + if !to_remove.is_empty() { + metrics.inc_removed_tx_conditional(to_remove.len()); + let _ = pool.remove_transactions(to_remove); + } } } }