use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
#[derive(Debug, Default)]
pub struct GatewayMetrics {
active_workers: AtomicU64,
active_clients: AtomicU64,
messages_routed: AtomicU64,
routing_failures: AtomicU64,
}
impl GatewayMetrics {
pub fn new() -> Arc<Self> {
Arc::new(Self::default())
}
pub fn worker_connected(&self) {
self.active_workers.fetch_add(1, Ordering::Relaxed);
}
pub fn worker_disconnected(&self) {
saturating_decrement(&self.active_workers);
}
pub fn client_connected(&self) {
self.active_clients.fetch_add(1, Ordering::Relaxed);
}
pub fn client_disconnected(&self) {
saturating_decrement(&self.active_clients);
}
pub fn message_routed(&self) {
self.messages_routed.fetch_add(1, Ordering::Relaxed);
}
pub fn routing_failure(&self) {
self.routing_failures.fetch_add(1, Ordering::Relaxed);
}
pub fn active_workers(&self) -> u64 {
self.active_workers.load(Ordering::Relaxed)
}
pub fn active_clients(&self) -> u64 {
self.active_clients.load(Ordering::Relaxed)
}
pub fn messages_routed(&self) -> u64 {
self.messages_routed.load(Ordering::Relaxed)
}
pub fn routing_failures(&self) -> u64 {
self.routing_failures.load(Ordering::Relaxed)
}
}
fn saturating_decrement(counter: &AtomicU64) {
let _ = counter.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |value| {
Some(value.saturating_sub(1))
});
}