nym_statistics_common/clients/
gateway_conn_statistics.rs

1// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
2// SPDX-License-Identifier: Apache-2.0
3
4//! # Gateway Connection statistics
5//!
6//! Metrics collected by the client while establishing and maintaining connections to the gateway.
7
8use super::ClientStatsEvents;
9use std::collections::VecDeque;
10
11use nym_metrics::{inc, inc_by};
12use serde::{Deserialize, Serialize};
13
14#[derive(Default, Debug, Clone, Serialize, Deserialize)]
15pub(crate) struct GatewayStats {
16    // Sent
17    real_packets_sent: u64,
18    real_packets_sent_size: usize,
19
20    /// failed connection statistics
21    failures: VecDeque<()>, // TODO
22}
23
24impl GatewayStats {
25    fn handle(&mut self, event: GatewayStatsEvent) {
26        match event {
27            GatewayStatsEvent::RealPacketSent(packet_size) => {
28                self.real_packets_sent += 1;
29                self.real_packets_sent_size += packet_size;
30                inc!("real_packets_sent");
31                inc_by!("real_packets_sent_size", packet_size);
32            }
33        }
34    }
35
36    fn summary(&self) -> (String, String) {
37        (
38            format!("packets sent: {}", self.real_packets_sent),
39            "packets received: todo".to_owned(),
40        )
41    }
42}
43
44impl From<GatewayStatsEvent> for ClientStatsEvents {
45    fn from(event: GatewayStatsEvent) -> ClientStatsEvents {
46        ClientStatsEvents::GatewayConn(event)
47    }
48}
49
50/// Event space for Gateway Connection Events
51#[derive(Debug)]
52pub enum GatewayStatsEvent {
53    /// The real packets sent. Recall that acks are sent by the gateway, so it's not included here.
54    RealPacketSent(usize),
55}
56
57/// Gateway Statistics Tracking
58#[derive(Default)]
59pub struct GatewayStatsControl {
60    // Keep track of packet statistics over time
61    stats: GatewayStats,
62}
63
64impl GatewayStatsControl {
65    pub(crate) fn handle_event(&mut self, event: GatewayStatsEvent) {
66        self.stats.handle(event)
67    }
68
69    pub(crate) fn report(&self) -> GatewayStats {
70        self.stats.clone()
71    }
72
73    pub(crate) fn local_report(&self) {
74        self.report_counters();
75    }
76
77    fn report_counters(&self) {
78        log::trace!("packet statistics: {:?}", &self.stats);
79        let (summary_sent, summary_recv) = self.stats.summary();
80        log::debug!("{summary_sent}");
81        log::debug!("{summary_recv}");
82    }
83}