Skip to main content

corium_peer/
metrics.rs

1//! Peer-server Prometheus metrics.
2
3use std::sync::atomic::{AtomicU64, Ordering};
4use std::time::Duration;
5
6/// Query counters recorded by a peer server.
7#[derive(Default)]
8pub struct Metrics {
9    queries: AtomicU64,
10    query_latency_micros: AtomicU64,
11    query_fuel: AtomicU64,
12}
13
14impl Metrics {
15    pub(crate) fn record_query(&self, elapsed: Duration, fuel: usize) {
16        self.queries.fetch_add(1, Ordering::Relaxed);
17        self.query_latency_micros.fetch_add(
18            u64::try_from(elapsed.as_micros()).unwrap_or(u64::MAX),
19            Ordering::Relaxed,
20        );
21        self.query_fuel
22            .fetch_add(u64::try_from(fuel).unwrap_or(u64::MAX), Ordering::Relaxed);
23    }
24
25    /// Renders Prometheus's text exposition format.
26    #[must_use]
27    pub fn prometheus(&self) -> String {
28        let queries = self.queries.load(Ordering::Relaxed);
29        let latency = self.query_latency_micros.load(Ordering::Relaxed);
30        let fuel = self.query_fuel.load(Ordering::Relaxed);
31        let (seconds, subseconds) = (latency / 1_000_000, latency % 1_000_000);
32        format!(
33            "# TYPE corium_peer_queries_total counter\n\
34corium_peer_queries_total {queries}\n\
35# TYPE corium_peer_query_latency_seconds summary\n\
36corium_peer_query_latency_seconds_count {queries}\n\
37corium_peer_query_latency_seconds_sum {seconds}.{subseconds:06}\n\
38# TYPE corium_peer_query_fuel_spent_total counter\n\
39corium_peer_query_fuel_spent_total {fuel}\n",
40        )
41    }
42}