use commonware_runtime::{
telemetry::metrics::{
histogram::{ScopedTimer, Timed},
Counter, Gauge, GaugeExt as _, MetricsExt as _,
},
Clock, Metrics as RuntimeMetrics,
};
use std::sync::Arc;
pub(crate) struct Metrics<E: Clock> {
size: Gauge,
pruning_boundary: Gauge,
retained: Gauge,
inactivity_floor: Gauge,
last_commit: Gauge,
pub apply_batch_calls: Counter,
apply_batch_duration: Timed,
pub operations_applied: Counter,
pub get_calls: Counter,
get_duration: Timed,
pub get_many_calls: Counter,
get_many_duration: Timed,
pub lookups_requested: Counter,
pub commit_calls: Counter,
commit_duration: Timed,
pub sync_calls: Counter,
sync_duration: Timed,
pub prune_calls: Counter,
prune_duration: Timed,
clock: Arc<E>,
}
impl<E: RuntimeMetrics + Clock> Metrics<E> {
pub(crate) fn new(context: E) -> Self {
Self {
size: context.gauge("size", "Logical operation end"),
pruning_boundary: context
.gauge("pruning_boundary", "Oldest retained operation location"),
retained: context.gauge("retained", "Number of retained operations"),
inactivity_floor: context.gauge(
"inactivity_floor",
"Application-declared pruning floor location",
),
last_commit: context.gauge("last_commit", "Most recent commit operation location"),
apply_batch_calls: context.counter("apply_batch_calls", "Number of apply-batch calls"),
apply_batch_duration: Timed::register(
&context,
"apply_batch_duration",
"Duration of apply-batch calls",
),
operations_applied: context.counter(
"operations_applied",
"Number of operations written by completed batch applications",
),
get_calls: context.counter("get_calls", "Number of get calls"),
get_duration: Timed::register(&context, "get_duration", "Duration of get calls"),
get_many_calls: context.counter("get_many_calls", "Number of non-empty get-many calls"),
get_many_duration: Timed::register(
&context,
"get_many_duration",
"Duration of non-empty get-many calls",
),
lookups_requested: context.counter(
"lookups_requested",
"Number of lookups requested by get/get-many calls, including misses",
),
commit_calls: context.counter("commit_calls", "Number of commit calls"),
commit_duration: Timed::register(
&context,
"commit_duration",
"Duration of commit calls",
),
sync_calls: context.counter("sync_calls", "Number of sync calls"),
sync_duration: Timed::register(&context, "sync_duration", "Duration of sync calls"),
prune_calls: context.counter("prune_calls", "Number of prune calls"),
prune_duration: Timed::register(&context, "prune_duration", "Duration of prune calls"),
clock: Arc::new(context),
}
}
}
impl<E: Clock> Metrics<E> {
pub(crate) fn apply_batch_timer(&self) -> ScopedTimer<E> {
self.apply_batch_duration.scoped(&self.clock)
}
pub(crate) fn get_timer(&self) -> ScopedTimer<E> {
self.get_duration.scoped(&self.clock)
}
pub(crate) fn get_many_timer(&self) -> ScopedTimer<E> {
self.get_many_duration.scoped(&self.clock)
}
pub(crate) fn commit_timer(&self) -> ScopedTimer<E> {
self.commit_duration.scoped(&self.clock)
}
pub(crate) fn sync_timer(&self) -> ScopedTimer<E> {
self.sync_duration.scoped(&self.clock)
}
pub(crate) fn prune_timer(&self) -> ScopedTimer<E> {
self.prune_duration.scoped(&self.clock)
}
pub(crate) fn update(
&self,
size: u64,
pruning_boundary: u64,
inactivity_floor: u64,
last_commit: u64,
) {
let _ = self.size.try_set(size);
let _ = self.pruning_boundary.try_set(pruning_boundary);
let _ = self.retained.try_set(size.saturating_sub(pruning_boundary));
let _ = self.inactivity_floor.try_set(inactivity_floor);
let _ = self.last_commit.try_set(last_commit);
}
}