use commonware_cryptography::PublicKey;
use commonware_runtime::{telemetry::metrics::status, Metrics as RuntimeMetrics};
use prometheus_client::{
encoding::EncodeLabelSet,
metrics::{counter::Counter, family::Family, gauge::Gauge},
};
#[derive(Clone, Debug, Hash, PartialEq, Eq, EncodeLabelSet)]
pub struct SequencerLabel {
pub sequencer: String,
}
impl SequencerLabel {
pub fn from<P: PublicKey>(sequencer: &P) -> Self {
Self {
sequencer: sequencer.to_string(),
}
}
}
#[derive(Default)]
pub struct Metrics {
pub peer: Family<SequencerLabel, Counter>,
pub receive: status::Counter,
pub subscribe: status::Counter,
pub get: status::Counter,
pub waiters: Gauge,
}
impl Metrics {
pub fn init<E: RuntimeMetrics>(context: E) -> Self {
let metrics = Self::default();
context.register(
"peer",
"Number of broadcasts received by peer",
metrics.peer.clone(),
);
context.register(
"receive",
"Number of received messages by status",
metrics.receive.clone(),
);
context.register(
"subscribe",
"Number of `subscribe` requests by status",
metrics.subscribe.clone(),
);
context.register(
"get",
"Number of `get` requests by status",
metrics.get.clone(),
);
context.register(
"waiters",
"Number of digests being awaited",
metrics.waiters.clone(),
);
metrics
}
}