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, average_prepare_connection_us) = if successful_packets > 0 {
92            (
93                self.total_client_stats
94                    .send_packets_us
95                    .swap(0, Ordering::Relaxed)
96                    / successful_packets,
97                self.total_client_stats
98                    .prepare_connection_us
99                    .swap(0, Ordering::Relaxed)
100                    / successful_packets,
101            )
102        } else {
103            (0, 0)
104        };
105
106        datapoint_info!(
107            name,
108            (
109                "cache_hits",
110                self.cache_hits.swap(0, Ordering::Relaxed),
111                i64
112            ),
113            (
114                "cache_misses",
115                self.cache_misses.swap(0, Ordering::Relaxed),
116                i64
117            ),
118            (
119                "cache_evictions",
120                self.cache_evictions.swap(0, Ordering::Relaxed),
121                i64
122            ),
123            (
124                "eviction_time_ms",
125                self.eviction_time_ms.swap(0, Ordering::Relaxed),
126                i64
127            ),
128            (
129                "get_connection_ms",
130                self.get_connection_ms.swap(0, Ordering::Relaxed),
131                i64
132            ),
133            (
134                "get_connection_lock_ms",
135                self.get_connection_lock_ms.swap(0, Ordering::Relaxed),
136                i64
137            ),
138            (
139                "get_connection_hit_ms",
140                self.get_connection_hit_ms.swap(0, Ordering::Relaxed),
141                i64
142            ),
143            (
144                "get_connection_miss_ms",
145                self.get_connection_miss_ms.swap(0, Ordering::Relaxed),
146                i64
147            ),
148            (
149                "make_connection_ms",
150                self.total_client_stats
151                    .make_connection_ms
152                    .swap(0, Ordering::Relaxed),
153                i64
154            ),
155            (
156                "total_connections",
157                self.total_client_stats
158                    .total_connections
159                    .swap(0, Ordering::Relaxed),
160                i64
161            ),
162            (
163                "connection_reuse",
164                self.total_client_stats
165                    .connection_reuse
166                    .swap(0, Ordering::Relaxed),
167                i64
168            ),
169            (
170                "connection_errors",
171                self.total_client_stats
172                    .connection_errors
173                    .swap(0, Ordering::Relaxed),
174                i64
175            ),
176            (
177                "zero_rtt_accepts",
178                self.total_client_stats
179                    .zero_rtt_accepts
180                    .swap(0, Ordering::Relaxed),
181                i64
182            ),
183            (
184                "zero_rtt_rejects",
185                self.total_client_stats
186                    .zero_rtt_rejects
187                    .swap(0, Ordering::Relaxed),
188                i64
189            ),
190            (
191                "congestion_events",
192                self.total_client_stats.congestion_events.load_and_reset(),
193                i64
194            ),
195            (
196                "streams_blocked_uni",
197                self.total_client_stats.streams_blocked_uni.load_and_reset(),
198                i64
199            ),
200            (
201                "data_blocked",
202                self.total_client_stats.data_blocked.load_and_reset(),
203                i64
204            ),
205            ("acks", self.total_client_stats.acks.load_and_reset(), i64),
206            (
207                "num_packets",
208                self.sent_packets.swap(0, Ordering::Relaxed),
209                i64
210            ),
211            (
212                "total_batches",
213                self.total_batches.swap(0, Ordering::Relaxed),
214                i64
215            ),
216            (
217                "batch_failure",
218                self.batch_failure.swap(0, Ordering::Relaxed),
219                i64
220            ),
221            (
222                "send_timeout",
223                self.total_client_stats
224                    .send_timeout
225                    .swap(0, Ordering::Relaxed),
226                i64
227            ),
228            ("average_send_packet_us", average_send_packet_us, i64),
229            ("successful_packets", successful_packets, i64),
230            (
231                "average_prepare_connection_us",
232                average_prepare_connection_us,
233                i64
234            ),
235        );
236    }
237}