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