Skip to main content

agentic_reality/cache/
metrics.rs

1use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering};
2
3pub struct CacheMetrics {
4    hits: AtomicU64,
5    misses: AtomicU64,
6    evictions: AtomicU64,
7    current_size: AtomicUsize,
8}
9impl CacheMetrics {
10    pub fn new() -> Self {
11        Self {
12            hits: AtomicU64::new(0),
13            misses: AtomicU64::new(0),
14            evictions: AtomicU64::new(0),
15            current_size: AtomicUsize::new(0),
16        }
17    }
18    pub fn record_hit(&self) {
19        self.hits.fetch_add(1, Ordering::Relaxed);
20    }
21    pub fn record_miss(&self) {
22        self.misses.fetch_add(1, Ordering::Relaxed);
23    }
24    pub fn record_eviction(&self) {
25        self.evictions.fetch_add(1, Ordering::Relaxed);
26    }
27    pub fn set_size(&self, size: usize) {
28        self.current_size.store(size, Ordering::Relaxed);
29    }
30    pub fn hits(&self) -> u64 {
31        self.hits.load(Ordering::Relaxed)
32    }
33    pub fn misses(&self) -> u64 {
34        self.misses.load(Ordering::Relaxed)
35    }
36    pub fn evictions(&self) -> u64 {
37        self.evictions.load(Ordering::Relaxed)
38    }
39    pub fn current_size(&self) -> usize {
40        self.current_size.load(Ordering::Relaxed)
41    }
42    pub fn hit_rate(&self) -> f64 {
43        let t = self.hits() + self.misses();
44        if t == 0 {
45            0.0
46        } else {
47            self.hits() as f64 / t as f64
48        }
49    }
50}
51impl Default for CacheMetrics {
52    fn default() -> Self {
53        Self::new()
54    }
55}