styx_core/
metrics.rs

1use std::sync::atomic::{AtomicU64, Ordering};
2
3/// Lightweight counters for pool/queue backpressure.
4///
5/// # Example
6/// ```rust
7/// use styx_core::metrics::Metrics;
8///
9/// let metrics = Metrics::default();
10/// metrics.hit();
11/// assert_eq!(metrics.hits(), 1);
12/// ```
13#[derive(Debug, Default)]
14pub struct Metrics {
15    hits: AtomicU64,
16    misses: AtomicU64,
17    allocations: AtomicU64,
18    backpressure: AtomicU64,
19}
20
21impl Metrics {
22    /// Increment hit counter.
23    pub fn hit(&self) {
24        self.hits.fetch_add(1, Ordering::Relaxed);
25    }
26
27    /// Increment miss counter.
28    pub fn miss(&self) {
29        self.misses.fetch_add(1, Ordering::Relaxed);
30    }
31
32    /// Increment allocation counter.
33    pub fn alloc(&self) {
34        self.allocations.fetch_add(1, Ordering::Relaxed);
35    }
36
37    /// Increment backpressure counter.
38    pub fn backpressure(&self) {
39        self.backpressure.fetch_add(1, Ordering::Relaxed);
40    }
41
42    /// Snapshot of hits.
43    pub fn hits(&self) -> u64 {
44        self.hits.load(Ordering::Relaxed)
45    }
46
47    /// Snapshot of misses.
48    pub fn misses(&self) -> u64 {
49        self.misses.load(Ordering::Relaxed)
50    }
51
52    /// Snapshot of allocations.
53    pub fn allocations(&self) -> u64 {
54        self.allocations.load(Ordering::Relaxed)
55    }
56
57    /// Snapshot of backpressure events.
58    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}