metrics_util/registry/
storage.rs

1use std::sync::Arc;
2
3use metrics::{atomics::AtomicU64, CounterFn, GaugeFn, HistogramFn};
4
5use crate::storage::AtomicBucket;
6
7/// Defines the underlying storage for metrics as well as how to create them.
8pub trait Storage<K> {
9    /// The type used for counters.
10    type Counter: CounterFn + Clone;
11
12    /// The type used for gauges.
13    type Gauge: GaugeFn + Clone;
14
15    /// The type used for histograms.
16    type Histogram: HistogramFn + Clone;
17
18    /// Creates an empty counter.
19    fn counter(&self, key: &K) -> Self::Counter;
20
21    /// Creates an empty gauge.
22    fn gauge(&self, key: &K) -> Self::Gauge;
23
24    /// Creates an empty histogram.
25    fn histogram(&self, key: &K) -> Self::Histogram;
26}
27
28/// Atomic metric storage.
29///
30/// Utilizes atomics for storing the value(s) of a given metric.  Shared access to the actual atomic
31/// is handling via `Arc`.
32#[derive(Debug)]
33pub struct AtomicStorage;
34
35impl<K> Storage<K> for AtomicStorage {
36    type Counter = Arc<AtomicU64>;
37    type Gauge = Arc<AtomicU64>;
38    type Histogram = Arc<AtomicBucket<f64>>;
39
40    fn counter(&self, _: &K) -> Self::Counter {
41        Arc::new(AtomicU64::new(0))
42    }
43
44    fn gauge(&self, _: &K) -> Self::Gauge {
45        Arc::new(AtomicU64::new(0))
46    }
47
48    fn histogram(&self, _: &K) -> Self::Histogram {
49        Arc::new(AtomicBucket::new())
50    }
51}