use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Default)]
pub struct AgentMetrics {
pub calls_total: AtomicU64,
pub calls_success: AtomicU64,
pub calls_failed: AtomicU64,
pub calls_timeout: AtomicU64,
pub circuit_breaker_trips: AtomicU64,
pub duration_total_us: AtomicU64,
pub decisions_allow: AtomicU64,
pub decisions_block: AtomicU64,
pub decisions_redirect: AtomicU64,
pub decisions_challenge: AtomicU64,
}
impl AgentMetrics {
pub fn new() -> Self {
Self::default()
}
pub fn record_success(&self, duration_us: u64) {
self.calls_total.fetch_add(1, Ordering::Relaxed);
self.calls_success.fetch_add(1, Ordering::Relaxed);
self.duration_total_us
.fetch_add(duration_us, Ordering::Relaxed);
}
pub fn record_failure(&self) {
self.calls_total.fetch_add(1, Ordering::Relaxed);
self.calls_failed.fetch_add(1, Ordering::Relaxed);
}
pub fn record_timeout(&self) {
self.calls_total.fetch_add(1, Ordering::Relaxed);
self.calls_timeout.fetch_add(1, Ordering::Relaxed);
}
pub fn average_duration_us(&self) -> f64 {
let total = self.duration_total_us.load(Ordering::Relaxed) as f64;
let success = self.calls_success.load(Ordering::Relaxed) as f64;
if success > 0.0 {
total / success
} else {
0.0
}
}
}