Skip to main content

Mountain/IPC/Common/PerformanceMetrics/
PerformanceMetrics.rs

1#![allow(non_snake_case)]
2
3//! Aggregate IPC perf snapshot: throughput, latency (avg + peak),
4//! compression ratio, pool utilisation, memory + CPU usage, and
5//! success/failure counters. `RecordMessage` updates the running mean
6//! latency without bias under high message volume.
7
8use std::time::{Duration, Instant};
9
10use serde::Serialize;
11
12#[derive(Debug, Clone, Serialize)]
13pub struct Struct {
14	pub MessagesPerSecond:f64,
15	pub AverageLatencyMs:f64,
16	pub PeakLatencyMs:f64,
17	pub CompressionRatio:f64,
18	pub PoolUtilization:f64,
19	pub MemoryUsageBytes:u64,
20	pub CpuUsagePercent:f64,
21	pub TotalMessages:u64,
22	pub FailedMessages:u64,
23	#[serde(skip)]
24	pub LastUpdated:Instant,
25}
26
27impl Struct {
28	pub fn new() -> Self {
29		Self {
30			MessagesPerSecond:0.0,
31			AverageLatencyMs:0.0,
32			PeakLatencyMs:0.0,
33			CompressionRatio:1.0,
34			PoolUtilization:0.0,
35			MemoryUsageBytes:0,
36			CpuUsagePercent:0.0,
37			TotalMessages:0,
38			FailedMessages:0,
39			LastUpdated:Instant::now(),
40		}
41	}
42
43	pub fn RecordMessage(&mut self, Latency:Duration) {
44		let LatencyMs = Latency.as_millis() as f64;
45		if self.TotalMessages > 0 {
46			self.AverageLatencyMs =
47				(self.AverageLatencyMs * self.TotalMessages as f64 + LatencyMs) / (self.TotalMessages + 1) as f64;
48		} else {
49			self.AverageLatencyMs = LatencyMs;
50		}
51		if LatencyMs > self.PeakLatencyMs {
52			self.PeakLatencyMs = LatencyMs;
53		}
54		self.TotalMessages += 1;
55		self.LastUpdated = Instant::now();
56	}
57
58	pub fn RecordFailure(&mut self) {
59		self.FailedMessages += 1;
60		self.LastUpdated = Instant::now();
61	}
62
63	pub fn SuccessRate(&self) -> f64 {
64		if self.TotalMessages == 0 {
65			return 1.0;
66		}
67		1.0 - (self.FailedMessages as f64 / self.TotalMessages as f64)
68	}
69
70	pub fn IsLatencyAcceptable(&self, ThresholdMs:f64) -> bool {
71		self.AverageLatencyMs <= ThresholdMs && self.PeakLatencyMs <= ThresholdMs * 2.0
72	}
73
74	pub fn SuccessRatePercent(&self) -> f64 { self.SuccessRate() * 100.0 }
75}
76
77impl Default for Struct {
78	fn default() -> Self { Self::new() }
79}