summaryrefslogtreecommitdiffstats
path: root/src/api
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-28 11:57:54 +0100
committertv <tv@krebsco.de>2026-10-28 11:57:54 +0100
commite13d027567f781c9729a518913b21ec4ee273039 (patch)
treeada25e93f6164e0ce80282616937f19fc8f1aec0 /src/api
parent8a4e5bab13069a298fa1d8c756e1a6c0bd719dfb (diff)
peers from member list start as unknown
Diffstat (limited to 'src/api')
-rw-r--r--src/api/peers.rs3
-rw-r--r--src/api/stats/prometheus.rs10
2 files changed, 13 insertions, 0 deletions
diff --git a/src/api/peers.rs b/src/api/peers.rs
index cea3644..eeb3fb2 100644
--- a/src/api/peers.rs
+++ b/src/api/peers.rs
@@ -23,6 +23,8 @@ use crate::transport::traffic::PeerTraffic;
#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub(crate) enum PeerLivenessStatus {
+ /// Nothing heard from it since this node started.
+ Unknown,
Active,
Dormant,
}
@@ -134,6 +136,7 @@ pub(crate) async fn list_peers(
let ps = peer_state_mutex.lock().await;
let (status, dormant_for_secs) = match ps.liveness {
+ Liveness::Unknown => (PeerLivenessStatus::Unknown, None),
Liveness::Active => (PeerLivenessStatus::Active, None),
Liveness::Dormant { since } => (
PeerLivenessStatus::Dormant,
diff --git a/src/api/stats/prometheus.rs b/src/api/stats/prometheus.rs
index 9cbeff4..8b37864 100644
--- a/src/api/stats/prometheus.rs
+++ b/src/api/stats/prometheus.rs
@@ -117,6 +117,7 @@ struct Peer {
key: String,
alias: Option<String>,
neighbour: bool,
+ unknown: bool,
dormant: bool,
last_seen_secs: Option<f64>,
last_sync_secs: Option<f64>,
@@ -143,6 +144,7 @@ async fn peers(state: &AppState) -> Vec<Peer> {
let peer_state = peer_state.lock().await;
peers.push(Peer {
neighbour,
+ unknown: peer_state.liveness == Liveness::Unknown,
dormant: matches!(peer_state.liveness, Liveness::Dormant { .. }),
last_seen_secs: peer_state
.last_seen
@@ -853,6 +855,14 @@ pub(super) async fn render(state: &AppState, stats: &StatsResponse) -> String {
flag(peer.neighbour),
);
}
+ out.family(
+ "peer_unknown",
+ "gauge",
+ "1 while nothing was heard from the peer since this node started.",
+ );
+ for peer in &peers {
+ out.sample("peer_unknown", &[("peer", &peer.key)], flag(peer.unknown));
+ }
out.family("peer_dormant", "gauge", "1 while the peer is dormant.");
for peer in &peers {
out.sample("peer_dormant", &[("peer", &peer.key)], flag(peer.dormant));