Skip to main content

Mountain/IPC/Common/ServiceInfo/
ServicePerformance.rs

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