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 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}