0g-storage-node/version-meld/discv5/src/metrics.rs
2024-01-04 18:05:32 +08:00

73 lines
2.6 KiB
Rust

use std::sync::atomic::{AtomicUsize, Ordering};
lazy_static! {
pub static ref METRICS: InternalMetrics = InternalMetrics::default();
}
/// A collection of metrics used throughout the server.
pub struct InternalMetrics {
/// The number of active UDP sessions that are currently established.
pub active_sessions: AtomicUsize,
/// The number of seconds to store received packets to taking a moving average over.
pub moving_window: u64,
/// The number of unsolicited requests received per moving window.
pub unsolicited_requests_per_window: AtomicUsize,
/// The number of bytes sent.
pub bytes_sent: AtomicUsize,
/// The number of bytes received.
pub bytes_recv: AtomicUsize,
}
impl Default for InternalMetrics {
fn default() -> Self {
InternalMetrics {
moving_window: 5,
active_sessions: AtomicUsize::new(0),
unsolicited_requests_per_window: AtomicUsize::new(0),
bytes_sent: AtomicUsize::new(0),
bytes_recv: AtomicUsize::new(0),
}
}
}
impl InternalMetrics {
pub fn add_recv_bytes(&self, bytes: usize) {
let current_bytes_recv = self.bytes_recv.load(Ordering::Relaxed);
self.bytes_recv
.store(current_bytes_recv.saturating_add(bytes), Ordering::Relaxed);
}
pub fn add_sent_bytes(&self, bytes: usize) {
let current_bytes_sent = self.bytes_sent.load(Ordering::Relaxed);
self.bytes_sent
.store(current_bytes_sent.saturating_add(bytes), Ordering::Relaxed);
}
}
#[derive(Clone, Debug)]
/// The publicly accessible metrics that can be obtained from the Discv5 server.
pub struct Metrics {
/// The number of active UDP sessions that are currently established.
pub active_sessions: usize,
/// The number of unsolicited requests received per second (averaged over a moving window).
pub unsolicited_requests_per_second: f64,
/// The number of bytes sent.
pub bytes_sent: usize,
/// The number of bytes received.
pub bytes_recv: usize,
}
impl From<&METRICS> for Metrics {
fn from(internal_metrics: &METRICS) -> Self {
Metrics {
active_sessions: internal_metrics.active_sessions.load(Ordering::Relaxed),
unsolicited_requests_per_second: internal_metrics
.unsolicited_requests_per_window
.load(Ordering::Relaxed) as f64
/ internal_metrics.moving_window as f64,
bytes_sent: internal_metrics.bytes_sent.load(Ordering::Relaxed),
bytes_recv: internal_metrics.bytes_recv.load(Ordering::Relaxed),
}
}
}