Skip to main content

kmp_observability/
quality_telemetry_observation.rs

1use std::time::{SystemTime, UNIX_EPOCH};
2
3use kmp_domain::{BundleQualityMetrics, QualityObservationContext};
4use serde::{Deserialize, Serialize};
5
6/// One typed, timestamped quality observation persisted by local telemetry.
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
8pub struct QualityTelemetryObservation {
9    observed_at_millis: u64,
10    rpc: String,
11    root_node_id: String,
12    role: String,
13    raw_equivalent_tokens: u32,
14    compression_ratio: f64,
15    causal_density: f64,
16    noise_ratio: f64,
17    detail_coverage: f64,
18}
19
20impl QualityTelemetryObservation {
21    pub fn capture(metrics: &BundleQualityMetrics, context: &QualityObservationContext) -> Self {
22        Self {
23            observed_at_millis: SystemTime::now()
24                .duration_since(UNIX_EPOCH)
25                .map(|elapsed| u64::try_from(elapsed.as_millis()).unwrap_or(u64::MAX))
26                .unwrap_or(0),
27            rpc: context.rpc.clone(),
28            root_node_id: context.root_node_id.clone(),
29            role: context.role.clone(),
30            raw_equivalent_tokens: metrics.raw_equivalent_tokens(),
31            compression_ratio: metrics.compression_ratio(),
32            causal_density: metrics.causal_density(),
33            noise_ratio: metrics.noise_ratio(),
34            detail_coverage: metrics.detail_coverage(),
35        }
36    }
37
38    pub fn observed_at_millis(&self) -> u64 {
39        self.observed_at_millis
40    }
41
42    pub fn rpc(&self) -> &str {
43        &self.rpc
44    }
45
46    pub fn root_node_id(&self) -> &str {
47        &self.root_node_id
48    }
49
50    pub fn role(&self) -> &str {
51        &self.role
52    }
53
54    pub fn raw_equivalent_tokens(&self) -> u32 {
55        self.raw_equivalent_tokens
56    }
57
58    pub fn compression_ratio(&self) -> f64 {
59        self.compression_ratio
60    }
61
62    pub fn causal_density(&self) -> f64 {
63        self.causal_density
64    }
65
66    pub fn noise_ratio(&self) -> f64 {
67        self.noise_ratio
68    }
69
70    pub fn detail_coverage(&self) -> f64 {
71        self.detail_coverage
72    }
73}