use std::sync::{
atomic::{AtomicU64, Ordering},
Arc,
};
#[derive(Clone, Debug, Default)]
pub struct Diagnostics(pub(super) Arc<Counters>);
#[derive(Debug, Default)]
pub(super) struct Counters {
pub accepted_connections: AtomicU64,
pub completed_connections: AtomicU64,
pub connection_errors: AtomicU64,
pub connection_timeouts: AtomicU64,
pub task_failures: AtomicU64,
pub request_rejections: AtomicU64,
pub body_timeouts: AtomicU64,
pub handler_timeouts: AtomicU64,
pub response_rejections: AtomicU64,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct Snapshot {
pub accepted_connections: u64,
pub completed_connections: u64,
pub connection_errors: u64,
pub connection_timeouts: u64,
pub task_failures: u64,
pub request_rejections: u64,
pub body_timeouts: u64,
pub handler_timeouts: u64,
pub response_rejections: u64,
}
impl Diagnostics {
pub fn snapshot(&self) -> Snapshot {
let c = &self.0;
Snapshot {
accepted_connections: c.accepted_connections.load(Ordering::Relaxed),
completed_connections: c.completed_connections.load(Ordering::Relaxed),
connection_errors: c.connection_errors.load(Ordering::Relaxed),
connection_timeouts: c.connection_timeouts.load(Ordering::Relaxed),
task_failures: c.task_failures.load(Ordering::Relaxed),
request_rejections: c.request_rejections.load(Ordering::Relaxed),
body_timeouts: c.body_timeouts.load(Ordering::Relaxed),
handler_timeouts: c.handler_timeouts.load(Ordering::Relaxed),
response_rejections: c.response_rejections.load(Ordering::Relaxed),
}
}
}
pub(super) fn increment(counter: &AtomicU64) {
let _ = counter.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |n| {
Some(n.saturating_add(1))
});
}