aboutsummaryrefslogtreecommitdiffstats
path: root/src/api/stats.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/stats.rs')
-rw-r--r--src/api/stats.rs16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/api/stats.rs b/src/api/stats.rs
index 13610dd..d274fd9 100644
--- a/src/api/stats.rs
+++ b/src/api/stats.rs
@@ -13,9 +13,10 @@ use std::collections::BTreeMap;
use serde::Serialize;
-use super::peers::{PeerListResponse, peer_list};
+use super::peers::{PeerListResponse, PeerLivenessStatus, peer_list};
use crate::document::replica::EpochRecord;
use crate::state::{AppState, Incidents};
+use crate::swarm::skew::{self, Skew};
use crate::swarm::{members, stability, topology};
use crate::transport::stats::TransportStats;
use crate::transport::traffic::PeerTraffic;
@@ -44,6 +45,8 @@ pub(crate) struct StatsResponse {
/// The peers listed in /peers together (a forgotten peer's are gone).
incidents: Incidents,
propagation: PropagationStats,
+ /// This node's clock against its active peers' (`swarm::skew`).
+ clock: Skew,
/// This node's own files (`files`), by kind.
disk: BTreeMap<&'static str, DiskStats>,
/// How the transports find and reach peers (`Transport::stats`).
@@ -271,6 +274,16 @@ pub(crate) async fn collect(state: &AppState, list: &PeerListResponse) -> StatsR
let (connected_fraction, observed) = stability::measured(state);
+ let clock = skew::of(
+ &list
+ .peers
+ .values()
+ .filter(|peer| !matches!(peer.status, PeerLivenessStatus::Dormant))
+ .filter_map(|peer| peer.clock)
+ .collect::<Vec<_>>(),
+ state.clock_skew_warn,
+ );
+
let mut incidents = Incidents::default();
let mut last_from_neighbour_secs: Option<u64> = None;
let mut diverged_peers = 0;
@@ -347,6 +360,7 @@ pub(crate) async fn collect(state: &AppState, list: &PeerListResponse) -> StatsR
stale_hello_replies: node.stale_hello_replies,
traffic: state.traffic.total(),
incidents,
+ clock,
propagation: PropagationStats {
count: node.propagation.count,
sum_ms: node.propagation.sum_ms,