nmbrs_metrics/instruments/
counter.rs1use 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}