commonware_runtime/telemetry/metrics/
status.rs1use prometheus_client::{
4 encoding::{EncodeLabelSet, EncodeLabelValue},
5 metrics::{counter::Counter as DefaultCounter, family::Family, gauge::Gauge},
6};
7use std::sync::atomic::Ordering;
8
9#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, EncodeLabelSet)]
11pub struct Label {
12 status: Status,
14}
15
16#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, EncodeLabelValue)]
18pub enum Status {
19 Success,
21 Failure,
23 Invalid,
25 Dropped,
28 Timeout,
30}
31
32pub type Counter = Family<Label, DefaultCounter>;
34
35pub trait CounterExt {
37 fn guard(&self, status: Status) -> CounterGuard;
38 fn inc(&self, status: Status);
39 fn inc_by(&self, status: Status, n: u64);
40}
41
42impl CounterExt for Counter {
43 fn guard(&self, status: Status) -> CounterGuard {
45 CounterGuard {
46 metric: self.clone(),
47 status,
48 }
49 }
50
51 fn inc(&self, status: Status) {
53 self.get_or_create(&Label { status }).inc();
54 }
55
56 fn inc_by(&self, status: Status, n: u64) {
58 self.get_or_create(&Label { status }).inc_by(n);
59 }
60}
61
62pub struct CounterGuard {
67 metric: Counter,
69
70 status: Status,
72}
73
74impl CounterGuard {
75 pub const fn set(&mut self, status: Status) {
77 self.status = status;
78 }
79}
80
81impl Drop for CounterGuard {
82 fn drop(&mut self) {
83 self.metric.inc(self.status);
84 }
85}
86
87pub trait GaugeExt {
89 fn try_set<T: TryInto<i64>>(&self, val: T) -> Result<i64, T::Error>;
91
92 fn try_set_max<T: TryInto<i64> + Copy>(&self, val: T) -> Result<i64, T::Error>;
95}
96
97impl GaugeExt for Gauge {
98 fn try_set<T: TryInto<i64>>(&self, val: T) -> Result<i64, T::Error> {
99 let val = val.try_into()?;
101 let out = self.set(val);
102 Ok(out)
103 }
104
105 fn try_set_max<T: TryInto<i64> + Copy>(&self, val: T) -> Result<i64, T::Error> {
106 let val = val.try_into()?;
107 Ok(self.inner().fetch_max(val, Ordering::Relaxed))
108 }
109}