Skip to main content

Mountain/IPC/Common/PerformanceMetrics/
ThroughputMetrics.rs

1//! Per-direction message + byte counters with a fixed start time so
2//! `MessagesPerSecond*` / `BytesPerSecond*` are derivable as
3//! divisions over the elapsed period.
4
5use std::time::Instant;
6
7#[derive(Debug, Clone)]
8pub struct Struct {
9	pub MessagesReceived:u64,
10
11	pub MessagesSent:u64,
12
13	pub BytesReceived:u64,
14
15	pub BytesSent:u64,
16
17	pub StartTime:Instant,
18}
19
20impl Struct {
21	pub fn new() -> Self {
22		Self {
23			MessagesReceived:0,
24
25			MessagesSent:0,
26
27			BytesReceived:0,
28
29			BytesSent:0,
30
31			StartTime:Instant::now(),
32		}
33	}
34
35	pub fn RecordReceived(&mut self, Bytes:u64) {
36		self.MessagesReceived += 1;
37
38		self.BytesReceived += Bytes;
39	}
40
41	pub fn RecordSent(&mut self, Bytes:u64) {
42		self.MessagesSent += 1;
43
44		self.BytesSent += Bytes;
45	}
46
47	pub fn MessagesPerSecondReceived(&self) -> f64 {
48		let Elapsed = self.StartTime.elapsed().as_secs_f64();
49
50		if Elapsed > 0.0 { self.MessagesReceived as f64 / Elapsed } else { 0.0 }
51	}
52
53	pub fn MessagesPerSecondSent(&self) -> f64 {
54		let Elapsed = self.StartTime.elapsed().as_secs_f64();
55
56		if Elapsed > 0.0 { self.MessagesSent as f64 / Elapsed } else { 0.0 }
57	}
58
59	pub fn BytesPerSecondReceived(&self) -> f64 {
60		let Elapsed = self.StartTime.elapsed().as_secs_f64();
61
62		if Elapsed > 0.0 { self.BytesReceived as f64 / Elapsed } else { 0.0 }
63	}
64
65	pub fn BytesPerSecondSent(&self) -> f64 {
66		let Elapsed = self.StartTime.elapsed().as_secs_f64();
67
68		if Elapsed > 0.0 { self.BytesSent as f64 / Elapsed } else { 0.0 }
69	}
70}
71
72impl Default for Struct {
73	fn default() -> Self { Self::new() }
74}