diff options
Diffstat (limited to 'src/api/stats.rs')
| -rw-r--r-- | src/api/stats.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/api/stats.rs b/src/api/stats.rs index 838cc0f..fa11b45 100644 --- a/src/api/stats.rs +++ b/src/api/stats.rs @@ -9,6 +9,8 @@ use axum::{ http::{HeaderMap, header}, response::{IntoResponse, Response}, }; +use std::collections::BTreeMap; + use serde::Serialize; use super::peers::EpochInfo; @@ -35,6 +37,21 @@ pub(crate) struct StatsResponse { /// The peers listed in /peers together (a forgotten peer's are gone). incidents: Incidents, propagation: PropagationStats, + /// This node's own files (`files`), by kind. + disk: BTreeMap<&'static str, DiskStats>, +} + +/// Reads and writes of one kind of file, since the node started. +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +struct DiskStats { + reads: u64, + read_bytes: u64, + writes: u64, + written_bytes: u64, + appends: u64, + appended_bytes: u64, + errors: u64, } /// How long changes written elsewhere took from their commit there until applied here, @@ -195,5 +212,22 @@ async fn collect(state: &AppState) -> StatsResponse { .map(|(le_ms, count)| PropagationBucket { le_ms, count }) .collect(), }, + disk: state + .files + .counts() + .into_iter() + .map(|(kind, counts)| { + let stats = DiskStats { + reads: counts.reads, + read_bytes: counts.read_bytes, + writes: counts.writes, + written_bytes: counts.written_bytes, + appends: counts.appends, + appended_bytes: counts.appended_bytes, + errors: counts.errors, + }; + (kind.as_str(), stats) + }) + .collect(), } } |
