From 19bc0fbf4e148430064bd040bfe0db25ab137555 Mon Sep 17 00:00:00 2001 From: tv Date: Sat, 24 Oct 2026 06:29:59 +0200 Subject: add per peer incident stats --- src/api/mod.rs | 1 + src/api/peers.rs | 4 +++- src/api/stats.rs | 11 ++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) (limited to 'src/api') diff --git a/src/api/mod.rs b/src/api/mod.rs index d7f14b3..95d63aa 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -158,6 +158,7 @@ fn response_for_value( crate::transport::traffic::PeerTraffic, crate::transport::traffic::ByKind, crate::transport::traffic::Counter, + crate::state::Incidents, ) ), tags( diff --git a/src/api/peers.rs b/src/api/peers.rs index 9ed11c5..5b7d576 100644 --- a/src/api/peers.rs +++ b/src/api/peers.rs @@ -16,7 +16,7 @@ use utoipa::ToSchema; use super::store_status; use crate::document::replica::Epoch; use crate::document::store; -use crate::state::{AppState, HelloState, Liveness, PeerState, unix_millis}; +use crate::state::{AppState, HelloState, Incidents, Liveness, PeerState, unix_millis}; use crate::swarm::peer::forgotten_path; use crate::transport::traffic::PeerTraffic; @@ -69,6 +69,7 @@ pub(crate) struct PeerStatus { /// Messages and payload bytes exchanged with it, by kind, since we started (or /// since it was last listed). traffic: PeerTraffic, + incidents: Incidents, } #[derive(Debug, Serialize, ToSchema)] @@ -147,6 +148,7 @@ pub(crate) async fn list_peers( neighbour, rtt_ms, traffic, + incidents: ps.incidents, }); } diff --git a/src/api/stats.rs b/src/api/stats.rs index f4a368b..e426c7a 100644 --- a/src/api/stats.rs +++ b/src/api/stats.rs @@ -4,7 +4,7 @@ use axum::{Json, extract::State}; use serde::Serialize; use super::peers::EpochInfo; -use crate::state::AppState; +use crate::state::{AppState, Incidents}; use crate::swarm::{members, stability, topology}; use crate::transport::traffic::PeerTraffic; @@ -22,6 +22,8 @@ pub(crate) struct StatsResponse { stale_hello_replies: u64, /// All peers together, including ones no longer listed in /peers. traffic: PeerTraffic, + /// The peers listed in /peers together (a forgotten peer's are gone). + incidents: Incidents, } #[derive(Debug, Serialize)] @@ -96,6 +98,12 @@ pub(crate) async fn get_stats(State(state): State) -> Json = state.peer_states.read().await.values().cloned().collect(); + for peer_state in peers { + incidents.add(&peer_state.lock().await.incidents); + } + Json(StatsResponse { uptime_secs: node.uptime.as_secs(), ready: state.is_ready().await, @@ -130,5 +138,6 @@ pub(crate) async fn get_stats(State(state): State) -> Json