1use std::collections::HashMap;
4
5pub trait Metrics: Send + Sync {
7 fn record_latency(&self, operation: &str, duration_ms: f64);
9
10 fn increment_counter(&self, name: &str, delta: u64);
12
13 fn record_gauge(&self, name: &str, value: f64);
15}
16
17pub struct NoopMetrics;
19
20impl Metrics for NoopMetrics {
21 fn record_latency(&self, _operation: &str, _duration_ms: f64) {}
22 fn increment_counter(&self, _name: &str, _delta: u64) {}
23 fn record_gauge(&self, _name: &str, _value: f64) {}
24}
25
26#[derive(Debug, Clone, Default, serde::Serialize)]
28pub struct MetricsSnapshot {
29 pub latencies: HashMap<String, LatencyStats>,
31 pub counters: HashMap<String, u64>,
33 pub gauges: HashMap<String, f64>,
35}
36
37#[derive(Debug, Clone, Default, serde::Serialize)]
39pub struct LatencyStats {
40 pub count: u64,
41 pub total_ms: f64,
42 pub min_ms: f64,
43 pub max_ms: f64,
44 pub p50_ms: f64,
45 pub p95_ms: f64,
46 pub p99_ms: f64,
47}
48
49#[cfg(test)]
50#[path = "tests/metrics_tests.rs"]
51mod tests;