1use std::sync::atomic::{AtomicU64, Ordering};
2
3#[derive(Debug, Default)]
14pub struct Metrics {
15 hits: AtomicU64,
16 misses: AtomicU64,
17 allocations: AtomicU64,
18 backpressure: AtomicU64,
19}
20
21impl Metrics {
22 pub fn hit(&self) {
24 self.hits.fetch_add(1, Ordering::Relaxed);
25 }
26
27 pub fn miss(&self) {
29 self.misses.fetch_add(1, Ordering::Relaxed);
30 }
31
32 pub fn alloc(&self) {
34 self.allocations.fetch_add(1, Ordering::Relaxed);
35 }
36
37 pub fn backpressure(&self) {
39 self.backpressure.fetch_add(1, Ordering::Relaxed);
40 }
41
42 pub fn hits(&self) -> u64 {
44 self.hits.load(Ordering::Relaxed)
45 }
46
47 pub fn misses(&self) -> u64 {
49 self.misses.load(Ordering::Relaxed)
50 }
51
52 pub fn allocations(&self) -> u64 {
54 self.allocations.load(Ordering::Relaxed)
55 }
56
57 pub fn backpressure_count(&self) -> u64 {
59 self.backpressure.load(Ordering::Relaxed)
60 }
61}
62
63impl Clone for Metrics {
64 fn clone(&self) -> Self {
65 let cloned = Metrics::default();
66 cloned.hits.store(self.hits(), Ordering::Relaxed);
67 cloned.misses.store(self.misses(), Ordering::Relaxed);
68 cloned
69 .allocations
70 .store(self.allocations(), Ordering::Relaxed);
71 cloned
72 .backpressure
73 .store(self.backpressure_count(), Ordering::Relaxed);
74 cloned
75 }
76}