From 59760a2fe3d56f70c1a7344d796bc9ee4e4dfc47 Mon Sep 17 00:00:00 2001 From: Emma Jamieson-Hoare Date: Tue, 10 Feb 2026 23:59:06 -0500 Subject: [PATCH] feat(net): add direction labels to closed_sessions and pending_session_failures metrics (#22014) Co-authored-by: Amp --- .changelog/warm-foxes-glow.md | 5 ++++ crates/net/network/src/manager.rs | 21 ++++++++++---- crates/net/network/src/metrics.rs | 47 ++++++++++++++++++++++++++----- 3 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 .changelog/warm-foxes-glow.md diff --git a/.changelog/warm-foxes-glow.md b/.changelog/warm-foxes-glow.md new file mode 100644 index 0000000000..968bb6c9a9 --- /dev/null +++ b/.changelog/warm-foxes-glow.md @@ -0,0 +1,5 @@ +--- +reth-network: minor +--- + +Added direction labels to `closed_sessions` and `pending_session_failures` metrics. Operators can now distinguish session closures and failures by direction (`active`, `incoming_pending`, `outgoing_pending` for closed sessions; `inbound`, `outbound` for pending session failures). diff --git a/crates/net/network/src/manager.rs b/crates/net/network/src/manager.rs index e04263e7a3..7387a5b64a 100644 --- a/crates/net/network/src/manager.rs +++ b/crates/net/network/src/manager.rs @@ -24,7 +24,10 @@ use crate::{ import::{BlockImport, BlockImportEvent, BlockImportOutcome, BlockValidation, NewBlockEvent}, listener::ConnectionListener, message::{NewBlockMessage, PeerMessage}, - metrics::{DisconnectMetrics, NetworkMetrics, NETWORK_POOL_TRANSACTIONS_SCOPE}, + metrics::{ + ClosedSessionsMetrics, DisconnectMetrics, NetworkMetrics, PendingSessionFailureMetrics, + NETWORK_POOL_TRANSACTIONS_SCOPE, + }, network::{NetworkHandle, NetworkHandleMessage}, peers::PeersManager, poll_nested_stream_with_budget, @@ -139,6 +142,10 @@ pub struct NetworkManager { metrics: NetworkMetrics, /// Disconnect metrics for the Network disconnect_metrics: DisconnectMetrics, + /// Closed sessions metrics, split by direction. + closed_sessions_metrics: ClosedSessionsMetrics, + /// Pending session failure metrics, split by direction. + pending_session_failure_metrics: PendingSessionFailureMetrics, } impl NetworkManager { @@ -354,6 +361,8 @@ impl NetworkManager { num_active_peers, metrics: Default::default(), disconnect_metrics: Default::default(), + closed_sessions_metrics: Default::default(), + pending_session_failure_metrics: Default::default(), }) } @@ -866,7 +875,7 @@ impl NetworkManager { self.swarm.state_mut().peers_mut().on_active_session_gracefully_closed(peer_id); None }; - self.metrics.closed_sessions.increment(1); + self.closed_sessions_metrics.active.increment(1); self.update_active_connection_metrics(); if let Some(reason) = reason { @@ -891,7 +900,7 @@ impl NetworkManager { .state_mut() .peers_mut() .on_incoming_pending_session_dropped(remote_addr, err); - self.metrics.pending_session_failures.increment(1); + self.pending_session_failure_metrics.inbound.increment(1); if let Some(reason) = err.as_disconnected() { self.disconnect_metrics.increment(reason); } @@ -901,7 +910,7 @@ impl NetworkManager { .peers_mut() .on_incoming_pending_session_gracefully_closed(); } - self.metrics.closed_sessions.increment(1); + self.closed_sessions_metrics.incoming_pending.increment(1); self.metrics .incoming_connections .set(self.swarm.state().peers().num_inbound_connections() as f64); @@ -924,7 +933,7 @@ impl NetworkManager { &peer_id, err, ); - self.metrics.pending_session_failures.increment(1); + self.pending_session_failure_metrics.outbound.increment(1); if let Some(reason) = err.as_disconnected() { self.disconnect_metrics.increment(reason); } @@ -934,7 +943,7 @@ impl NetworkManager { .peers_mut() .on_outgoing_pending_session_gracefully_closed(&peer_id); } - self.metrics.closed_sessions.increment(1); + self.closed_sessions_metrics.outgoing_pending.increment(1); self.update_pending_connection_metrics(); self.metrics diff --git a/crates/net/network/src/metrics.rs b/crates/net/network/src/metrics.rs index 6da8deced2..1a15866346 100644 --- a/crates/net/network/src/metrics.rs +++ b/crates/net/network/src/metrics.rs @@ -2,7 +2,7 @@ use metrics::Histogram; use reth_eth_wire::DisconnectReason; use reth_ethereum_primitives::TxType; use reth_metrics::{ - metrics::{Counter, Gauge}, + metrics::{self, Counter, Gauge}, Metrics, }; @@ -22,12 +22,6 @@ pub struct NetworkMetrics { /// Number of peers known to the node pub(crate) tracked_peers: Gauge, - /// Cumulative number of failures of pending sessions - pub(crate) pending_session_failures: Counter, - - /// Total number of sessions closed - pub(crate) closed_sessions: Counter, - /// Number of active incoming connections pub(crate) incoming_connections: Gauge, @@ -77,6 +71,45 @@ pub struct NetworkMetrics { pub(crate) acc_duration_poll_swarm: Gauge, } +/// Metrics for closed sessions, split by direction. +#[derive(Debug)] +pub struct ClosedSessionsMetrics { + /// Sessions closed from active (established) connections. + pub active: Counter, + /// Sessions closed from incoming pending connections. + pub incoming_pending: Counter, + /// Sessions closed from outgoing pending connections. + pub outgoing_pending: Counter, +} + +impl Default for ClosedSessionsMetrics { + fn default() -> Self { + Self { + active: metrics::counter!("network_closed_sessions", "direction" => "active"), + incoming_pending: metrics::counter!("network_closed_sessions", "direction" => "incoming_pending"), + outgoing_pending: metrics::counter!("network_closed_sessions", "direction" => "outgoing_pending"), + } + } +} + +/// Metrics for pending session failures, split by direction. +#[derive(Debug)] +pub struct PendingSessionFailureMetrics { + /// Failures on incoming pending sessions. + pub inbound: Counter, + /// Failures on outgoing pending sessions. + pub outbound: Counter, +} + +impl Default for PendingSessionFailureMetrics { + fn default() -> Self { + Self { + inbound: metrics::counter!("network_pending_session_failures", "direction" => "inbound"), + outbound: metrics::counter!("network_pending_session_failures", "direction" => "outbound"), + } + } +} + /// Metrics for `SessionManager` #[derive(Metrics)] #[metrics(scope = "network")]