Skip to main content

moqtap_trace/
metrics.rs

1use crate::event::{TraceEvent, TraceEventType};
2
3/// Aggregated metrics computed from a sequence of trace events.
4#[derive(Debug, Clone, Default, PartialEq)]
5pub struct SessionMetrics {
6    pub total_objects_sent: u64,
7    pub total_objects_received: u64,
8    pub total_bytes_sent: u64,
9    pub total_bytes_received: u64,
10    pub control_messages_sent: u64,
11    pub control_messages_received: u64,
12    pub session_duration_us: u64,
13    pub error_count: u64,
14}
15
16impl SessionMetrics {
17    /// Compute metrics from a slice of trace events.
18    pub fn compute(events: &[TraceEvent]) -> Self {
19        let mut metrics = SessionMetrics::default();
20
21        for event in events {
22            match &event.event_type {
23                TraceEventType::ObjectSent => {
24                    metrics.total_objects_sent += 1;
25                    metrics.total_bytes_sent += event.payload_size.unwrap_or(0);
26                }
27                TraceEventType::ObjectReceived => {
28                    metrics.total_objects_received += 1;
29                    metrics.total_bytes_received += event.payload_size.unwrap_or(0);
30                }
31                TraceEventType::ControlMessageSent => {
32                    metrics.control_messages_sent += 1;
33                }
34                TraceEventType::ControlMessageReceived => {
35                    metrics.control_messages_received += 1;
36                }
37                TraceEventType::Error => {
38                    metrics.error_count += 1;
39                }
40                _ => {}
41            }
42        }
43
44        if events.len() >= 2 {
45            let first = events.first().unwrap().timestamp_us;
46            let last = events.last().unwrap().timestamp_us;
47            metrics.session_duration_us = last - first;
48        }
49
50        metrics
51    }
52}