Skip to main content

codemem_core/
metrics.rs

1//! Metrics trait and default no-op implementation for Codemem.
2
3use std::collections::HashMap;
4
5/// Trait for recording operational metrics.
6pub trait Metrics: Send + Sync {
7    /// Record a latency measurement for an operation.
8    fn record_latency(&self, operation: &str, duration_ms: f64);
9
10    /// Increment a named counter.
11    fn increment_counter(&self, name: &str, delta: u64);
12
13    /// Record a gauge (point-in-time) value.
14    fn record_gauge(&self, name: &str, value: f64);
15}
16
17/// No-op metrics implementation (default).
18pub 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/// Snapshot of collected metrics.
27#[derive(Debug, Clone, Default, serde::Serialize)]
28pub struct MetricsSnapshot {
29    /// Latency percentiles per operation (p50, p95, p99, count, total_ms).
30    pub latencies: HashMap<String, LatencyStats>,
31    /// Cumulative counter values.
32    pub counters: HashMap<String, u64>,
33    /// Last-recorded gauge values.
34    pub gauges: HashMap<String, f64>,
35}
36
37/// Latency statistics for a single operation.
38#[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)]
50mod tests {
51    use super::*;
52
53    #[test]
54    fn noop_metrics_compiles_and_runs() {
55        let m = NoopMetrics;
56        m.record_latency("test_op", 42.0);
57        m.increment_counter("test_count", 1);
58        m.record_gauge("test_gauge", 2.72);
59    }
60}