agentic_reality/cache/
metrics.rs1use 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}