sentinel_proxy/agents/
metrics.rs1use std::sync::atomic::{AtomicU64, Ordering};
4
5#[derive(Default)]
9pub struct AgentMetrics {
10 pub calls_total: AtomicU64,
12 pub calls_success: AtomicU64,
14 pub calls_failed: AtomicU64,
16 pub calls_timeout: AtomicU64,
18 pub circuit_breaker_trips: AtomicU64,
20 pub duration_total_us: AtomicU64,
22 pub decisions_allow: AtomicU64,
24 pub decisions_block: AtomicU64,
25 pub decisions_redirect: AtomicU64,
26 pub decisions_challenge: AtomicU64,
27}
28
29impl AgentMetrics {
30 pub fn new() -> Self {
32 Self::default()
33 }
34
35 pub fn record_success(&self, duration_us: u64) {
37 self.calls_total.fetch_add(1, Ordering::Relaxed);
38 self.calls_success.fetch_add(1, Ordering::Relaxed);
39 self.duration_total_us.fetch_add(duration_us, Ordering::Relaxed);
40 }
41
42 pub fn record_failure(&self) {
44 self.calls_total.fetch_add(1, Ordering::Relaxed);
45 self.calls_failed.fetch_add(1, Ordering::Relaxed);
46 }
47
48 pub fn record_timeout(&self) {
50 self.calls_total.fetch_add(1, Ordering::Relaxed);
51 self.calls_timeout.fetch_add(1, Ordering::Relaxed);
52 }
53
54 pub fn average_duration_us(&self) -> f64 {
56 let total = self.duration_total_us.load(Ordering::Relaxed) as f64;
57 let success = self.calls_success.load(Ordering::Relaxed) as f64;
58 if success > 0.0 {
59 total / success
60 } else {
61 0.0
62 }
63 }
64}