commonware_runtime/telemetry/metrics/
status.rs1use prometheus_client::{
4 encoding::{EncodeLabelSet, EncodeLabelValue},
5 metrics::{counter::Counter as DefaultCounter, family::Family, gauge::Gauge},
6};
7
8#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, EncodeLabelSet)]
10pub struct Label {
11 status: Status,
13}
14
15#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, EncodeLabelValue)]
17pub enum Status {
18 Success,
20 Failure,
22 Invalid,
24 Dropped,
27 Timeout,
29}
30
31pub type Counter = Family<Label, DefaultCounter>;
33
34pub trait CounterExt {
36 fn guard(&self, status: Status) -> CounterGuard;
37 fn inc(&self, status: Status);
38 fn inc_by(&self, status: Status, n: u64);
39}
40
41impl CounterExt for Counter {
42 fn guard(&self, status: Status) -> CounterGuard {
44 CounterGuard {
45 metric: self.clone(),
46 status,
47 }
48 }
49
50 fn inc(&self, status: Status) {
52 self.get_or_create(&Label { status }).inc();
53 }
54
55 fn inc_by(&self, status: Status, n: u64) {
57 self.get_or_create(&Label { status }).inc_by(n);
58 }
59}
60
61pub struct CounterGuard {
66 metric: Counter,
68
69 status: Status,
71}
72
73impl CounterGuard {
74 pub const fn set(&mut self, status: Status) {
76 self.status = status;
77 }
78}
79
80impl Drop for CounterGuard {
81 fn drop(&mut self) {
82 self.metric.inc(self.status);
83 }
84}
85
86pub trait GaugeExt {
88 fn try_set<T: TryInto<i64>>(&self, val: T) -> Result<i64, T::Error>;
90}
91
92impl GaugeExt for Gauge {
93 fn try_set<T: TryInto<i64>>(&self, val: T) -> Result<i64, T::Error> {
94 let val = val.try_into()?;
96 let out = self.set(val);
97 Ok(out)
98 }
99}