Skip to main content

nmbrs_metrics/instruments/
counter.rs

1// Copyright 2024-2026 Jonathan Shook
2// SPDX-License-Identifier: Apache-2.0
3
4//! Monotonic u64 counter.
5
6use crate::labels::Labels;
7use std::sync::atomic::{AtomicU64, Ordering};
8
9pub struct Counter {
10    labels: Labels,
11    value: AtomicU64,
12}
13
14impl Counter {
15    pub fn new(labels: Labels) -> Self {
16        Self {
17            labels,
18            value: AtomicU64::new(0),
19        }
20    }
21
22    pub fn inc(&self) {
23        self.value.fetch_add(1, Ordering::Relaxed);
24    }
25
26    pub fn inc_by(&self, n: u64) {
27        self.value.fetch_add(n, Ordering::Relaxed);
28    }
29
30    pub fn get(&self) -> u64 {
31        self.value.load(Ordering::Relaxed)
32    }
33
34    pub fn labels(&self) -> &Labels {
35        &self.labels
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42
43    #[test]
44    fn counter_inc() {
45        let c = Counter::new(Labels::of("name", "test"));
46        assert_eq!(c.get(), 0);
47        c.inc();
48        assert_eq!(c.get(), 1);
49        c.inc_by(5);
50        assert_eq!(c.get(), 6);
51    }
52
53    #[test]
54    fn counter_labels() {
55        let c = Counter::new(Labels::of("name", "ops_total"));
56        assert_eq!(c.labels().get("name"), Some("ops_total"));
57    }
58}