Skip to main content

Mountain/IPC/Common/ServiceInfo/
ServicePerformance.rs

1//! Per-service request/error counters and a rolling-mean response
2//! latency. `RecordRequest` updates the running average using
3//! `(prev * (n-1) + new) / n` so the value stays bounded under high
4//! request volume.
5
6use std::time::Instant;
7
8use serde::Serialize;
9
10#[derive(Debug, Clone, Serialize)]
11pub struct Struct {
12	pub RequestCount:u64,
13
14	pub ErrorCount:u64,
15
16	pub AverageResponseTimeMs:f64,
17
18	#[serde(skip)]
19	pub LastUpdated:Instant,
20}
21
22impl Struct {
23	pub fn new() -> Self {
24		Self {
25			RequestCount:0,
26
27			ErrorCount:0,
28
29			AverageResponseTimeMs:0.0,
30
31			LastUpdated:Instant::now(),
32		}
33	}
34
35	pub fn RecordRequest(&mut self, ResponseTimeMs:f64) {
36		self.RequestCount += 1;
37
38		if self.AverageResponseTimeMs == 0.0 {
39			self.AverageResponseTimeMs = ResponseTimeMs;
40		} else {
41			self.AverageResponseTimeMs = (self.AverageResponseTimeMs * (self.RequestCount - 1) as f64 + ResponseTimeMs)
42				/ self.RequestCount as f64;
43		}
44
45		self.LastUpdated = Instant::now();
46	}
47
48	pub fn RecordError(&mut self) {
49		self.ErrorCount += 1;
50
51		self.LastUpdated = Instant::now();
52	}
53
54	pub fn ErrorRate(&self) -> f64 {
55		if self.RequestCount == 0 {
56			return 0.0;
57		}
58
59		self.ErrorCount as f64 / self.RequestCount as f64
60	}
61}
62
63impl Default for Struct {
64	fn default() -> Self { Self::new() }
65}