Skip to main content

solana_connection_cache/
connection_cache_stats.rs

1use {
2    crate::client_connection::ClientStats,
3    std::sync::atomic::{AtomicU64, Ordering},
4};
5
6#[derive(Default)]
7pub struct ConnectionCacheStats {
8    pub cache_hits: AtomicU64,
9    pub cache_misses: AtomicU64,
10    pub cache_evictions: AtomicU64,
11    pub eviction_time_ms: AtomicU64,
12    pub sent_packets: AtomicU64,
13    pub total_batches: AtomicU64,
14    pub batch_success: AtomicU64,
15    pub batch_failure: AtomicU64,
16    pub get_connection_ms: AtomicU64,
17    pub get_connection_lock_ms: AtomicU64,
18    pub get_connection_hit_ms: AtomicU64,
19    pub get_connection_miss_ms: AtomicU64,
20
21    // Need to track these separately per-connection
22    // because we need to track the base stat value from quinn
23    pub total_client_stats: ClientStats,
24}
25
26pub const CONNECTION_STAT_SUBMISSION_INTERVAL: u64 = 2000;
27
28impl ConnectionCacheStats {
29    pub fn add_client_stats(
30        &self,
31        client_stats: &ClientStats,
32        num_packets: usize,
33        is_success: bool,
34    ) {
35        self.total_client_stats.total_connections.fetch_add(
36            client_stats.total_connections.load(Ordering::Relaxed),
37            Ordering::Relaxed,
38        );
39        self.total_client_stats.connection_reuse.fetch_add(
40            client_stats.connection_reuse.load(Ordering::Relaxed),
41            Ordering::Relaxed,
42        );
43        self.total_client_stats.connection_errors.fetch_add(
44            client_stats.connection_errors.load(Ordering::Relaxed),
45            Ordering::Relaxed,
46        );
47        self.total_client_stats.zero_rtt_accepts.fetch_add(
48            client_stats.zero_rtt_accepts.load(Ordering::Relaxed),
49            Ordering::Relaxed,
50        );
51        self.total_client_stats.zero_rtt_rejects.fetch_add(
52            client_stats.zero_rtt_rejects.load(Ordering::Relaxed),
53            Ordering::Relaxed,
54        );
55        self.total_client_stats.make_connection_ms.fetch_add(
56            client_stats.make_connection_ms.load(Ordering::Relaxed),
57            Ordering::Relaxed,
58        );
59        self.total_client_stats.send_timeout.fetch_add(
60            client_stats.send_timeout.load(Ordering::Relaxed),
61            Ordering::Relaxed,
62        );
63        self.total_client_stats.send_packets_us.fetch_add(
64            client_stats.send_packets_us.load(Ordering::Relaxed),
65            Ordering::Relaxed,
66        );
67        self.total_client_stats.successful_packets.fetch_add(
68            client_stats.successful_packets.load(Ordering::Relaxed),
69            Ordering::Relaxed,
70        );
71        self.total_client_stats.prepare_connection_us.fetch_add(
72            client_stats.prepare_connection_us.load(Ordering::Relaxed),
73            Ordering::Relaxed,
74        );
75        self.sent_packets
76            .fetch_add(num_packets as u64, Ordering::Relaxed);
77        self.total_batches.fetch_add(1, Ordering::Relaxed);
78        if is_success {
79            self.batch_success.fetch_add(1, Ordering::Relaxed);
80        } else {
81            self.batch_failure.fetch_add(1, Ordering::Relaxed);
82        }
83    }
84
85    pub(super) fn report(&self, name: &'static str) {
86        let successful_packets = self
87            .total_client_stats
88            .successful_packets
89            .swap(0, Ordering::Relaxed);
90
91        let average_send_packet_us = self
92            .total_client_stats
93            .send_packets_us
94            .swap(0, Ordering::Relaxed)
95            .checked_div(successful_packets)
96            .unwrap_or_default();
97        let average_prepare_connection_us = self
98            .total_client_stats
99            .prepare_connection_us
100            .swap(0, Ordering::Relaxed)
101            .checked_div(successful_packets)
102            .unwrap_or_default();
103
104        datapoint_info!(
105            name,
106            (
107                "cache_hits",
108                self.cache_hits.swap(0, Ordering::Relaxed),
109                i64
110            ),
111            (
112                "cache_misses",
113                self.cache_misses.swap(0, Ordering::Relaxed),
114                i64
115            ),
116            (
117                "cache_evictions",
118                self.cache_evictions.swap(0, Ordering::Relaxed),
119                i64
120            ),
121            (
122                "eviction_time_ms",
123                self.eviction_time_ms.swap(0, Ordering::Relaxed),
124                i64
125            ),
126            (
127                "get_connection_ms",
128                self.get_connection_ms.swap(0, Ordering::Relaxed),
129                i64
130            ),
131            (
132                "get_connection_lock_ms",
133                self.get_connection_lock_ms.swap(0, Ordering::Relaxed),
134                i64
135            ),
136            (
137                "get_connection_hit_ms",
138                self.get_connection_hit_ms.swap(0, Ordering::Relaxed),
139                i64
140            ),
141            (
142                "get_connection_miss_ms",
143                self.get_connection_miss_ms.swap(0, Ordering::Relaxed),
144                i64
145            ),
146            (
147                "make_connection_ms",
148                self.total_client_stats
149                    .make_connection_ms
150                    .swap(0, Ordering::Relaxed),
151                i64
152            ),
153            (
154                "total_connections",
155                self.total_client_stats
156                    .total_connections
157                    .swap(0, Ordering::Relaxed),
158                i64
159            ),
160            (
161                "connection_reuse",
162                self.total_client_stats
163                    .connection_reuse
164                    .swap(0, Ordering::Relaxed),
165                i64
166            ),
167            (
168                "connection_errors",
169                self.total_client_stats
170                    .connection_errors
171                    .swap(0, Ordering::Relaxed),
172                i64
173            ),
174            (
175                "zero_rtt_accepts",
176                self.total_client_stats
177                    .zero_rtt_accepts
178                    .swap(0, Ordering::Relaxed),
179                i64
180            ),
181            (
182                "zero_rtt_rejects",
183                self.total_client_stats
184                    .zero_rtt_rejects
185                    .swap(0, Ordering::Relaxed),
186                i64
187            ),
188            (
189                "congestion_events",
190                self.total_client_stats.congestion_events.load_and_reset(),
191                i64
192            ),
193            (
194                "streams_blocked_uni",
195                self.total_client_stats.streams_blocked_uni.load_and_reset(),
196                i64
197            ),
198            (
199                "data_blocked",
200                self.total_client_stats.data_blocked.load_and_reset(),
201                i64
202            ),
203            ("acks", self.total_client_stats.acks.load_and_reset(), i64),
204            (
205                "num_packets",
206                self.sent_packets.swap(0, Ordering::Relaxed),
207                i64
208            ),
209            (
210                "total_batches",
211                self.total_batches.swap(0, Ordering::Relaxed),
212                i64
213            ),
214            (
215                "batch_failure",
216                self.batch_failure.swap(0, Ordering::Relaxed),
217                i64
218            ),
219            (
220                "send_timeout",
221                self.total_client_stats
222                    .send_timeout
223                    .swap(0, Ordering::Relaxed),
224                i64
225            ),
226            ("average_send_packet_us", average_send_packet_us, i64),
227            ("successful_packets", successful_packets, i64),
228            (
229                "average_prepare_connection_us",
230                average_prepare_connection_us,
231                i64
232            ),
233        );
234    }
235}