metrics_util/registry/
storage.rs

1use std::sync::Arc;
2
3use metrics::{atomics::AtomicU64, CounterFn, GaugeFn, HistogramFn};
4
5use crate::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`.
32pub struct AtomicStorage;
33
34impl<K> Storage<K> for AtomicStorage {
35    type Counter = Arc<AtomicU64>;
36    type Gauge = Arc<AtomicU64>;
37    type Histogram = Arc<AtomicBucket<f64>>;
38
39    fn counter(&self, _: &K) -> Self::Counter {
40        Arc::new(AtomicU64::new(0))
41    }
42
43    fn gauge(&self, _: &K) -> Self::Gauge {
44        Arc::new(AtomicU64::new(0))
45    }
46
47    fn histogram(&self, _: &K) -> Self::Histogram {
48        Arc::new(AtomicBucket::new())
49    }
50}