moirai_core/channel/
stats.rs1use std::sync::atomic::{AtomicUsize, Ordering};
4
5#[derive(Debug)]
7pub(crate) struct ChannelStats {
8 pub(crate) messages_sent: AtomicUsize,
10 pub(crate) messages_received: AtomicUsize,
12 pub(crate) overflow_events: AtomicUsize,
14 pub(crate) contention_count: AtomicUsize,
16}
17
18impl ChannelStats {
19 pub(crate) fn new() -> Self {
20 Self {
21 messages_sent: AtomicUsize::new(0),
22 messages_received: AtomicUsize::new(0),
23 overflow_events: AtomicUsize::new(0),
24 contention_count: AtomicUsize::new(0),
25 }
26 }
27
28 pub(crate) fn record_send(&self) {
30 self.messages_sent.fetch_add(1, Ordering::Relaxed);
31 }
32
33 pub(crate) fn record_receive(&self) {
35 self.messages_received.fetch_add(1, Ordering::Relaxed);
36 }
37
38 pub(crate) fn record_overflow(&self) {
40 self.overflow_events.fetch_add(1, Ordering::Relaxed);
41 }
42
43 pub(crate) fn record_contention(&self) {
45 self.contention_count.fetch_add(1, Ordering::Relaxed);
46 }
47
48 #[allow(clippy::cast_precision_loss)]
52 pub(crate) fn get_throughput_ratio(&self) -> f64 {
53 let sent = self.messages_sent.load(Ordering::Relaxed);
54 let received = self.messages_received.load(Ordering::Relaxed);
55
56 if received == 0 {
57 return f64::INFINITY;
58 }
59
60 sent as f64 / received as f64
61 }
62}
63
64#[derive(Debug, Clone)]
66pub struct ChannelStatistics {
67 pub messages_sent: usize,
69 pub messages_received: usize,
71 pub overflow_events: usize,
73 pub contention_count: usize,
75 pub current_length: usize,
77 pub capacity: usize,
79 pub throughput_ratio: f64,
81}