1use std::sync::atomic::{AtomicU64, Ordering};
4use std::time::Duration;
5
6#[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 #[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}