statsig_client/
cache_metrics.rs1use std::sync::atomic::{AtomicU64, Ordering};
6
7#[derive(Debug, Default)]
9pub struct CacheMetrics {
10 hits: AtomicU64,
12 misses: AtomicU64,
14 inserts: AtomicU64,
16 evictions: AtomicU64,
18}
19
20impl CacheMetrics {
21 pub fn new() -> Self {
23 Self::default()
24 }
25
26 pub fn record_hit(&self) {
28 self.hits.fetch_add(1, Ordering::Relaxed);
29 }
30
31 pub fn record_miss(&self) {
33 self.misses.fetch_add(1, Ordering::Relaxed);
34 }
35
36 pub fn record_insert(&self) {
38 self.inserts.fetch_add(1, Ordering::Relaxed);
39 }
40
41 pub fn record_eviction(&self) {
43 self.evictions.fetch_add(1, Ordering::Relaxed);
44 }
45
46 pub fn hits(&self) -> u64 {
48 self.hits.load(Ordering::Relaxed)
49 }
50
51 pub fn misses(&self) -> u64 {
53 self.misses.load(Ordering::Relaxed)
54 }
55
56 pub fn inserts(&self) -> u64 {
58 self.inserts.load(Ordering::Relaxed)
59 }
60
61 pub fn evictions(&self) -> u64 {
63 self.evictions.load(Ordering::Relaxed)
64 }
65
66 pub fn total_requests(&self) -> u64 {
68 self.hits() + self.misses()
69 }
70
71 pub fn hit_ratio(&self) -> f64 {
73 let total = self.total_requests();
74 if total == 0 {
75 0.0
76 } else {
77 (self.hits() as f64 / total as f64) * 100.0
78 }
79 }
80
81 pub fn reset(&self) {
83 self.hits.store(0, Ordering::Relaxed);
84 self.misses.store(0, Ordering::Relaxed);
85 self.inserts.store(0, Ordering::Relaxed);
86 self.evictions.store(0, Ordering::Relaxed);
87 }
88
89 pub fn summary(&self) -> CacheMetricsSummary {
91 CacheMetricsSummary {
92 hits: self.hits(),
93 misses: self.misses(),
94 inserts: self.inserts(),
95 evictions: self.evictions(),
96 total_requests: self.total_requests(),
97 hit_ratio: self.hit_ratio(),
98 }
99 }
100}
101
102#[derive(Debug, Clone)]
104pub struct CacheMetricsSummary {
105 pub hits: u64,
106 pub misses: u64,
107 pub inserts: u64,
108 pub evictions: u64,
109 pub total_requests: u64,
110 pub hit_ratio: f64,
111}
112
113impl std::fmt::Display for CacheMetricsSummary {
114 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
115 write!(
116 f,
117 "Cache Metrics: {} hits, {} misses, {:.2}% hit ratio, {} inserts, {} evictions",
118 self.hits, self.misses, self.hit_ratio, self.inserts, self.evictions
119 )
120 }
121}