diff --git a/core/node/eth_sender/src/error.rs b/core/node/eth_sender/src/error.rs index 61d92bcbe13..ed4fdaaec25 100644 --- a/core/node/eth_sender/src/error.rs +++ b/core/node/eth_sender/src/error.rs @@ -10,3 +10,12 @@ pub enum EthSenderError { #[error("Token parsing error: {0}")] Parse(#[from] contract::Error), } + +impl EthSenderError { + pub fn is_transient(&self) -> bool { + match self { + EthSenderError::EthereumGateway(err) => err.is_transient(), + _ => false, + } + } +} diff --git a/core/node/eth_sender/src/eth_tx_manager.rs b/core/node/eth_sender/src/eth_tx_manager.rs index a69c5265133..8ea4bb98b15 100644 --- a/core/node/eth_sender/src/eth_tx_manager.rs +++ b/core/node/eth_sender/src/eth_tx_manager.rs @@ -232,6 +232,8 @@ impl EthTxManager { .remove_tx_history(tx_history_id) .await .unwrap(); + } else { + METRICS.l1_transient_errors.inc(); } Err(error.into()) } @@ -563,6 +565,9 @@ impl EthTxManager { // Web3 API request failures can cause this, // and anything more important is already properly reported. tracing::warn!("eth_sender error {:?}", e); + if e.is_transient() { + METRICS.l1_transient_errors.inc(); + } } } diff --git a/core/node/eth_sender/src/metrics.rs b/core/node/eth_sender/src/metrics.rs index dfebcc278b7..32425baa5ee 100644 --- a/core/node/eth_sender/src/metrics.rs +++ b/core/node/eth_sender/src/metrics.rs @@ -107,6 +107,7 @@ pub(super) struct EthSenderMetrics { pub l1_blocks_waited_in_mempool: Family>, /// Number of L1 batches aggregated for publishing with a specific reason. pub block_aggregation_reason: Family, + pub l1_transient_errors: Counter, } impl EthSenderMetrics {