use commonware_runtime::{
telemetry::metrics::{histogram, status},
Clock, Metrics as RuntimeMetrics,
};
use prometheus_client::metrics::{counter::Counter, gauge::Gauge, histogram::Histogram};
use std::sync::Arc;
pub struct Metrics<E: RuntimeMetrics + Clock> {
pub tip: Gauge,
pub digest: status::Counter,
pub acks: status::Counter,
pub certificates: Counter,
pub digest_duration: histogram::Timed<E>,
}
impl<E: RuntimeMetrics + Clock> Metrics<E> {
pub fn init(context: E) -> Self {
let tip = Gauge::default();
context.register("tip", "Lowest height without a certificate", tip.clone());
let digest = status::Counter::default();
context.register(
"digest",
"Number of digests returned by the automaton by status",
digest.clone(),
);
let acks = status::Counter::default();
context.register(
"acks",
"Number of Ack messages processed by status",
acks.clone(),
);
let certificates = Counter::default();
context.register(
"certificates",
"Number of certificates produced",
certificates.clone(),
);
let rebroadcast = status::Counter::default();
context.register(
"rebroadcast",
"Number of rebroadcast attempts by status",
rebroadcast,
);
let digest_duration = Histogram::new(histogram::Buckets::LOCAL);
context.register(
"digest_duration",
"Histogram of application digest durations",
digest_duration.clone(),
);
let clock = Arc::new(context);
Self {
tip,
digest,
acks,
certificates,
digest_duration: histogram::Timed::new(digest_duration, clock),
}
}
}