use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Default)]
pub struct ServerMetrics {
pub requests_received: AtomicU64,
pub responses_sent: AtomicU64,
pub requests_dropped: AtomicU64,
pub kod_deny_sent: AtomicU64,
pub kod_rstr_sent: AtomicU64,
pub kod_rate_sent: AtomicU64,
pub interleaved_responses: AtomicU64,
pub active_clients: AtomicU64,
}
impl ServerMetrics {
pub fn new() -> Self {
Self::default()
}
pub fn snapshot(&self) -> MetricsSnapshot {
MetricsSnapshot {
requests_received: self.requests_received.load(Ordering::Relaxed),
responses_sent: self.responses_sent.load(Ordering::Relaxed),
requests_dropped: self.requests_dropped.load(Ordering::Relaxed),
kod_deny_sent: self.kod_deny_sent.load(Ordering::Relaxed),
kod_rstr_sent: self.kod_rstr_sent.load(Ordering::Relaxed),
kod_rate_sent: self.kod_rate_sent.load(Ordering::Relaxed),
interleaved_responses: self.interleaved_responses.load(Ordering::Relaxed),
active_clients: self.active_clients.load(Ordering::Relaxed),
}
}
#[inline]
pub(crate) fn inc_requests_received(&self) {
self.requests_received.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn inc_responses_sent(&self) {
self.responses_sent.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn inc_requests_dropped(&self) {
self.requests_dropped.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn inc_kod_deny(&self) {
self.kod_deny_sent.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn inc_kod_rstr(&self) {
self.kod_rstr_sent.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn inc_kod_rate(&self) {
self.kod_rate_sent.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn inc_interleaved(&self) {
self.interleaved_responses.fetch_add(1, Ordering::Relaxed);
}
#[inline]
pub(crate) fn set_active_clients(&self, count: u64) {
self.active_clients.store(count, Ordering::Relaxed);
}
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct MetricsSnapshot {
pub requests_received: u64,
pub responses_sent: u64,
pub requests_dropped: u64,
pub kod_deny_sent: u64,
pub kod_rstr_sent: u64,
pub kod_rate_sent: u64,
pub interleaved_responses: u64,
pub active_clients: u64,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metrics_default_is_zero() {
let m = ServerMetrics::new();
let s = m.snapshot();
assert_eq!(s.requests_received, 0);
assert_eq!(s.responses_sent, 0);
assert_eq!(s.requests_dropped, 0);
assert_eq!(s.kod_deny_sent, 0);
assert_eq!(s.kod_rstr_sent, 0);
assert_eq!(s.kod_rate_sent, 0);
assert_eq!(s.interleaved_responses, 0);
assert_eq!(s.active_clients, 0);
}
#[test]
fn test_metrics_increment() {
let m = ServerMetrics::new();
m.inc_requests_received();
m.inc_requests_received();
m.inc_responses_sent();
m.inc_kod_deny();
m.set_active_clients(42);
let s = m.snapshot();
assert_eq!(s.requests_received, 2);
assert_eq!(s.responses_sent, 1);
assert_eq!(s.kod_deny_sent, 1);
assert_eq!(s.active_clients, 42);
}
}