Skip to main content

Mountain/IPC/Common/ServiceInfo/
ServicePerformance.rs

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