1use crate::event::{TraceEvent, TraceEventType};
2
3#[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 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}