kmp_observability/
quality_telemetry_observation.rs1use std::time::{SystemTime, UNIX_EPOCH};
2
3use kmp_domain::{BundleQualityMetrics, QualityObservationContext};
4use serde::{Deserialize, Serialize};
5
6#[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}