Mountain/IPC/Common/PerformanceMetrics/
PerformanceMetrics.rs1#![allow(non_snake_case)]
2
3use 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}