1 // Copyright 2017 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 // Automatically generated by tools/codegen/core/gen_stats_data.py
16
17 #include "src/core/telemetry/stats_data.h"
18
19 #include <grpc/support/port_platform.h>
20 #include <stdint.h>
21
22 namespace grpc_core {
23 namespace {
24 union DblUint {
25 double dbl;
26 uint64_t uint;
27 };
28 } // namespace
Collect(Histogram_100000_20 * result) const29 void HistogramCollector_100000_20::Collect(Histogram_100000_20* result) const {
30 for (int i = 0; i < 20; i++) {
31 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
32 }
33 }
operator -(const Histogram_100000_20 & left,const Histogram_100000_20 & right)34 Histogram_100000_20 operator-(const Histogram_100000_20& left,
35 const Histogram_100000_20& right) {
36 Histogram_100000_20 result;
37 for (int i = 0; i < 20; i++) {
38 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
39 }
40 return result;
41 }
Collect(Histogram_65536_26 * result) const42 void HistogramCollector_65536_26::Collect(Histogram_65536_26* result) const {
43 for (int i = 0; i < 26; i++) {
44 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
45 }
46 }
operator -(const Histogram_65536_26 & left,const Histogram_65536_26 & right)47 Histogram_65536_26 operator-(const Histogram_65536_26& left,
48 const Histogram_65536_26& right) {
49 Histogram_65536_26 result;
50 for (int i = 0; i < 26; i++) {
51 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
52 }
53 return result;
54 }
Collect(Histogram_100_20 * result) const55 void HistogramCollector_100_20::Collect(Histogram_100_20* result) const {
56 for (int i = 0; i < 20; i++) {
57 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
58 }
59 }
operator -(const Histogram_100_20 & left,const Histogram_100_20 & right)60 Histogram_100_20 operator-(const Histogram_100_20& left,
61 const Histogram_100_20& right) {
62 Histogram_100_20 result;
63 for (int i = 0; i < 20; i++) {
64 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
65 }
66 return result;
67 }
Collect(Histogram_16777216_20 * result) const68 void HistogramCollector_16777216_20::Collect(
69 Histogram_16777216_20* result) const {
70 for (int i = 0; i < 20; i++) {
71 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
72 }
73 }
operator -(const Histogram_16777216_20 & left,const Histogram_16777216_20 & right)74 Histogram_16777216_20 operator-(const Histogram_16777216_20& left,
75 const Histogram_16777216_20& right) {
76 Histogram_16777216_20 result;
77 for (int i = 0; i < 20; i++) {
78 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
79 }
80 return result;
81 }
Collect(Histogram_80_10 * result) const82 void HistogramCollector_80_10::Collect(Histogram_80_10* result) const {
83 for (int i = 0; i < 10; i++) {
84 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
85 }
86 }
operator -(const Histogram_80_10 & left,const Histogram_80_10 & right)87 Histogram_80_10 operator-(const Histogram_80_10& left,
88 const Histogram_80_10& right) {
89 Histogram_80_10 result;
90 for (int i = 0; i < 10; i++) {
91 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
92 }
93 return result;
94 }
Collect(Histogram_10000_20 * result) const95 void HistogramCollector_10000_20::Collect(Histogram_10000_20* result) const {
96 for (int i = 0; i < 20; i++) {
97 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
98 }
99 }
operator -(const Histogram_10000_20 & left,const Histogram_10000_20 & right)100 Histogram_10000_20 operator-(const Histogram_10000_20& left,
101 const Histogram_10000_20& right) {
102 Histogram_10000_20 result;
103 for (int i = 0; i < 20; i++) {
104 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
105 }
106 return result;
107 }
Collect(Histogram_1800000_40 * result) const108 void HistogramCollector_1800000_40::Collect(
109 Histogram_1800000_40* result) const {
110 for (int i = 0; i < 40; i++) {
111 result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
112 }
113 }
operator -(const Histogram_1800000_40 & left,const Histogram_1800000_40 & right)114 Histogram_1800000_40 operator-(const Histogram_1800000_40& left,
115 const Histogram_1800000_40& right) {
116 Histogram_1800000_40 result;
117 for (int i = 0; i < 40; i++) {
118 result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
119 }
120 return result;
121 }
122 const absl::string_view
123 GlobalStats::counter_name[static_cast<int>(Counter::COUNT)] = {
124 "client_calls_created",
125 "server_calls_created",
126 "client_channels_created",
127 "client_subchannels_created",
128 "server_channels_created",
129 "insecure_connections_created",
130 "rq_connections_dropped",
131 "rq_calls_dropped",
132 "rq_calls_rejected",
133 "syscall_write",
134 "syscall_read",
135 "tcp_read_alloc_8k",
136 "tcp_read_alloc_64k",
137 "http2_settings_writes",
138 "http2_pings_sent",
139 "http2_writes_begun",
140 "http2_transport_stalls",
141 "http2_stream_stalls",
142 "http2_hpack_hits",
143 "http2_hpack_misses",
144 "cq_pluck_creates",
145 "cq_next_creates",
146 "cq_callback_creates",
147 "wrr_updates",
148 "work_serializer_items_enqueued",
149 "work_serializer_items_dequeued",
150 "econnaborted_count",
151 "econnreset_count",
152 "epipe_count",
153 "etimedout_count",
154 "econnrefused_count",
155 "enetunreach_count",
156 "enomsg_count",
157 "enotconn_count",
158 "enobufs_count",
159 "uncommon_io_error_count",
160 "msg_errqueue_error_count",
161 };
162 const absl::string_view GlobalStats::counter_doc[static_cast<int>(
163 Counter::COUNT)] = {
164 "Number of client side calls created by this process",
165 "Number of server side calls created by this process",
166 "Number of client channels created",
167 "Number of client subchannels created",
168 "Number of server channels created",
169 "Number of insecure connections created",
170 "Number of connections dropped due to resource quota exceeded",
171 "Number of calls dropped due to resource quota exceeded",
172 "Number of calls rejected (never started) due to resource quota exceeded",
173 "Number of write syscalls (or equivalent - eg sendmsg) made by this "
174 "process",
175 "Number of read syscalls (or equivalent - eg recvmsg) made by this process",
176 "Number of 8k allocations by the TCP subsystem for reading",
177 "Number of 64k allocations by the TCP subsystem for reading",
178 "Number of settings frames sent",
179 "Number of HTTP2 pings sent by process",
180 "Number of HTTP2 writes initiated",
181 "Number of times sending was completely stalled by the transport flow "
182 "control window",
183 "Number of times sending was completely stalled by the stream flow control "
184 "window",
185 "Number of HPACK cache hits",
186 "Number of HPACK cache misses (entries added but never used)",
187 "Number of completion queues created for cq_pluck (indicates sync api "
188 "usage)",
189 "Number of completion queues created for cq_next (indicates cq async api "
190 "usage)",
191 "Number of completion queues created for cq_callback (indicates callback "
192 "api usage)",
193 "Number of wrr updates that have been received",
194 "Number of items enqueued onto work serializers",
195 "Number of items dequeued from work serializers",
196 "Number of ECONNABORTED errors",
197 "Number of ECONNRESET errors",
198 "Number of EPIPE errors",
199 "Number of ETIMEDOUT errors",
200 "Number of ECONNREFUSED errors",
201 "Number of ENETUNREACH errors",
202 "Number of ENOMSG errors",
203 "Number of ENOTCONN errors",
204 "Number of ENOBUFS errors",
205 "Number of uncommon io errors",
206 "Number of uncommon errors returned by MSG_ERRQUEUE",
207 };
208 const absl::string_view
209 GlobalStats::histogram_name[static_cast<int>(Histogram::COUNT)] = {
210 "call_initial_size",
211 "tcp_write_size",
212 "tcp_write_iov_size",
213 "tcp_read_size",
214 "tcp_read_offer",
215 "tcp_read_offer_iov_size",
216 "http2_send_message_size",
217 "http2_metadata_size",
218 "http2_hpack_entry_lifetime",
219 "http2_header_table_size",
220 "http2_initial_window_size",
221 "http2_max_concurrent_streams",
222 "http2_max_frame_size",
223 "http2_max_header_list_size",
224 "http2_preferred_receive_crypto_message_size",
225 "http2_stream_remote_window_update",
226 "http2_transport_remote_window_update",
227 "http2_transport_window_update_period",
228 "http2_stream_window_update_period",
229 "wrr_subchannel_list_size",
230 "wrr_subchannel_ready_size",
231 "work_serializer_run_time_ms",
232 "work_serializer_work_time_ms",
233 "work_serializer_work_time_per_item_ms",
234 "work_serializer_items_per_run",
235 "chaotic_good_sendmsgs_per_write_control",
236 "chaotic_good_recvmsgs_per_read_control",
237 "chaotic_good_sendmsgs_per_write_data",
238 "chaotic_good_recvmsgs_per_read_data",
239 "chaotic_good_thread_hops_per_write_control",
240 "chaotic_good_thread_hops_per_read_control",
241 "chaotic_good_thread_hops_per_write_data",
242 "chaotic_good_thread_hops_per_read_data",
243 "chaotic_good_tcp_read_size_data",
244 "chaotic_good_tcp_read_size_control",
245 "chaotic_good_tcp_read_offer_data",
246 "chaotic_good_tcp_read_offer_control",
247 "chaotic_good_tcp_write_size_data",
248 "chaotic_good_tcp_write_size_control",
249 };
250 const absl::string_view GlobalStats::histogram_doc[static_cast<int>(
251 Histogram::COUNT)] = {
252 "Initial size of the grpc_call arena created at call start",
253 "Number of bytes offered to each syscall_write",
254 "Number of byte segments offered to each syscall_write",
255 "Number of bytes received by each syscall_read",
256 "Number of bytes offered to each syscall_read",
257 "Number of byte segments offered to each syscall_read",
258 "Size of messages received by HTTP2 transport",
259 "Number of bytes consumed by metadata, according to HPACK accounting rules",
260 "Lifetime of HPACK entries in the cache (in milliseconds)",
261 "Http2 header table size received through SETTINGS frame",
262 "Http2 initial window size received through SETTINGS frame",
263 "Http2 max concurrent streams received through SETTINGS frame",
264 "Http2 max frame size received through SETTINGS frame",
265 "Http2 max header list size received through SETTINGS frame",
266 "Http2 preferred receive crypto message size received through SETTINGS "
267 "frame",
268 "Stream window update sent by peer",
269 "Transport window update sent by peer",
270 "Period in milliseconds at which peer sends transport window update",
271 "Period in milliseconds at which peer sends stream window update",
272 "Number of subchannels in a subchannel list at picker creation time",
273 "Number of READY subchannels in a subchannel list at picker creation time",
274 "Number of milliseconds work serializers run for",
275 "When running, how many milliseconds are work serializers actually doing "
276 "work",
277 "How long do individual items take to process in work serializers",
278 "How many callbacks are executed when a work serializer runs",
279 "Number of sendmsgs per control channel endpoint write",
280 "Number of recvmsgs per control channel endpoint read",
281 "Number of sendmsgs per data channel endpoint write",
282 "Number of recvmsgs per data channel endpoint read",
283 "Number of thread hops per control channel endpoint write",
284 "Number of thread hops per control channel endpoint read",
285 "Number of thread hops per data channel endpoint write",
286 "Number of thread hops per data channel endpoint read",
287 "Number of bytes received by each syscall_read in the data channel",
288 "Number of bytes received by each syscall_read in the control channel",
289 "Number of bytes offered to each syscall_read in the data channel",
290 "Number of bytes offered to each syscall_read in the control channel",
291 "Number of bytes offered to each syscall_write in the data channel",
292 "Number of bytes offered to each syscall_write in the control channel",
293 };
294 namespace {
295 const int kStatsTable0[21] = {0, 1, 2, 4, 8, 15, 27,
296 49, 89, 160, 288, 517, 928, 1666,
297 2991, 5369, 9637, 17297, 31045, 55719, 100000};
298 const uint8_t kStatsTable1[30] = {3, 3, 4, 4, 5, 6, 6, 7, 7, 8,
299 9, 9, 10, 10, 11, 11, 12, 13, 13, 14,
300 15, 15, 16, 16, 17, 17, 18, 19, 19, 20};
301 const int kStatsTable2[27] = {0, 1, 2, 4, 7, 11, 17,
302 26, 40, 61, 92, 139, 210, 317,
303 478, 721, 1087, 1638, 2468, 3719, 5604,
304 8443, 12721, 19166, 28875, 43502, 65536};
305 const uint8_t kStatsTable3[29] = {3, 3, 4, 5, 6, 6, 7, 8, 9, 10,
306 11, 11, 12, 13, 14, 15, 16, 16, 17, 18,
307 19, 20, 21, 21, 22, 23, 24, 25, 26};
308 const int kStatsTable4[21] = {0, 1, 2, 3, 4, 5, 7, 9, 11, 14, 17,
309 21, 25, 30, 36, 43, 51, 61, 72, 85, 100};
310 const uint8_t kStatsTable5[16] = {6, 6, 7, 8, 9, 9, 10, 11,
311 12, 13, 14, 15, 16, 17, 18, 19};
312 const int kStatsTable6[21] = {
313 0, 1, 3, 8, 19, 45, 106,
314 250, 588, 1383, 3252, 7646, 17976, 42262,
315 99359, 233593, 549177, 1291113, 3035402, 7136218, 16777216};
316 const uint8_t kStatsTable7[23] = {2, 3, 3, 4, 5, 6, 7, 8,
317 8, 9, 10, 11, 12, 12, 13, 14,
318 15, 16, 16, 17, 18, 19, 20};
319 const int kStatsTable8[11] = {0, 1, 2, 4, 7, 11, 17, 26, 38, 56, 80};
320 const uint8_t kStatsTable9[9] = {3, 3, 4, 5, 6, 6, 7, 8, 9};
321 const int kStatsTable10[21] = {0, 1, 2, 4, 7, 12, 19,
322 30, 47, 74, 116, 182, 285, 445,
323 695, 1084, 1691, 2637, 4113, 6414, 10000};
324 const uint8_t kStatsTable11[23] = {3, 3, 4, 5, 5, 6, 7, 8,
325 9, 9, 10, 11, 12, 12, 13, 14,
326 15, 15, 16, 17, 18, 18, 19};
327 const int kStatsTable12[41] = {
328 0, 1, 2, 3, 5, 8, 12, 18, 26,
329 37, 53, 76, 108, 153, 217, 308, 436, 617,
330 873, 1235, 1748, 2473, 3499, 4950, 7003, 9907, 14015,
331 19825, 28044, 39670, 56116, 79379, 112286, 158835, 224680, 317821,
332 449574, 635945, 899575, 1272492, 1800000};
333 const uint8_t kStatsTable13[37] = {
334 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
335 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39};
336 } // namespace
BucketFor(int value)337 int Histogram_100000_20::BucketFor(int value) {
338 if (value < 3) {
339 if (value < 0) {
340 return 0;
341 } else {
342 return value;
343 }
344 } else {
345 if (value < 65537) {
346 DblUint val;
347 val.dbl = value;
348 const int bucket =
349 kStatsTable1[((val.uint - 4613937818241073152ull) >> 51)];
350 return bucket - (value < kStatsTable0[bucket]);
351 } else {
352 return 19;
353 }
354 }
355 }
BucketFor(int value)356 int Histogram_65536_26::BucketFor(int value) {
357 if (value < 3) {
358 if (value < 0) {
359 return 0;
360 } else {
361 return value;
362 }
363 } else {
364 if (value < 49153) {
365 DblUint val;
366 val.dbl = value;
367 const int bucket =
368 kStatsTable3[((val.uint - 4613937818241073152ull) >> 51)];
369 return bucket - (value < kStatsTable2[bucket]);
370 } else {
371 return 25;
372 }
373 }
374 }
BucketFor(int value)375 int Histogram_100_20::BucketFor(int value) {
376 if (value < 6) {
377 if (value < 0) {
378 return 0;
379 } else {
380 return value;
381 }
382 } else {
383 if (value < 81) {
384 DblUint val;
385 val.dbl = value;
386 const int bucket =
387 kStatsTable5[((val.uint - 4618441417868443648ull) >> 50)];
388 return bucket - (value < kStatsTable4[bucket]);
389 } else {
390 if (value < 85) {
391 return 18;
392 } else {
393 return 19;
394 }
395 }
396 }
397 }
BucketFor(int value)398 int Histogram_16777216_20::BucketFor(int value) {
399 if (value < 2) {
400 if (value < 0) {
401 return 0;
402 } else {
403 return value;
404 }
405 } else {
406 if (value < 8388609) {
407 DblUint val;
408 val.dbl = value;
409 const int bucket =
410 kStatsTable7[((val.uint - 4611686018427387904ull) >> 52)];
411 return bucket - (value < kStatsTable6[bucket]);
412 } else {
413 return 19;
414 }
415 }
416 }
BucketFor(int value)417 int Histogram_80_10::BucketFor(int value) {
418 if (value < 3) {
419 if (value < 0) {
420 return 0;
421 } else {
422 return value;
423 }
424 } else {
425 if (value < 49) {
426 DblUint val;
427 val.dbl = value;
428 const int bucket =
429 kStatsTable9[((val.uint - 4613937818241073152ull) >> 51)];
430 return bucket - (value < kStatsTable8[bucket]);
431 } else {
432 if (value < 56) {
433 return 8;
434 } else {
435 return 9;
436 }
437 }
438 }
439 }
BucketFor(int value)440 int Histogram_10000_20::BucketFor(int value) {
441 if (value < 3) {
442 if (value < 0) {
443 return 0;
444 } else {
445 return value;
446 }
447 } else {
448 if (value < 6145) {
449 DblUint val;
450 val.dbl = value;
451 const int bucket =
452 kStatsTable11[((val.uint - 4613937818241073152ull) >> 51)];
453 return bucket - (value < kStatsTable10[bucket]);
454 } else {
455 if (value < 6414) {
456 return 18;
457 } else {
458 return 19;
459 }
460 }
461 }
462 }
BucketFor(int value)463 int Histogram_1800000_40::BucketFor(int value) {
464 if (value < 4) {
465 if (value < 0) {
466 return 0;
467 } else {
468 return value;
469 }
470 } else {
471 if (value < 1048577) {
472 DblUint val;
473 val.dbl = value;
474 const int bucket =
475 kStatsTable13[((val.uint - 4616189618054758400ull) >> 51)];
476 return bucket - (value < kStatsTable12[bucket]);
477 } else {
478 if (value < 1272492) {
479 return 38;
480 } else {
481 return 39;
482 }
483 }
484 }
485 }
GlobalStats()486 GlobalStats::GlobalStats()
487 : client_calls_created{0},
488 server_calls_created{0},
489 client_channels_created{0},
490 client_subchannels_created{0},
491 server_channels_created{0},
492 insecure_connections_created{0},
493 rq_connections_dropped{0},
494 rq_calls_dropped{0},
495 rq_calls_rejected{0},
496 syscall_write{0},
497 syscall_read{0},
498 tcp_read_alloc_8k{0},
499 tcp_read_alloc_64k{0},
500 http2_settings_writes{0},
501 http2_pings_sent{0},
502 http2_writes_begun{0},
503 http2_transport_stalls{0},
504 http2_stream_stalls{0},
505 http2_hpack_hits{0},
506 http2_hpack_misses{0},
507 cq_pluck_creates{0},
508 cq_next_creates{0},
509 cq_callback_creates{0},
510 wrr_updates{0},
511 work_serializer_items_enqueued{0},
512 work_serializer_items_dequeued{0},
513 econnaborted_count{0},
514 econnreset_count{0},
515 epipe_count{0},
516 etimedout_count{0},
517 econnrefused_count{0},
518 enetunreach_count{0},
519 enomsg_count{0},
520 enotconn_count{0},
521 enobufs_count{0},
522 uncommon_io_error_count{0},
523 msg_errqueue_error_count{0} {}
histogram(Histogram which) const524 HistogramView GlobalStats::histogram(Histogram which) const {
525 switch (which) {
526 default:
527 GPR_UNREACHABLE_CODE(return HistogramView());
528 case Histogram::kCallInitialSize:
529 return HistogramView{&Histogram_65536_26::BucketFor, kStatsTable2, 26,
530 call_initial_size.buckets()};
531 case Histogram::kTcpWriteSize:
532 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
533 tcp_write_size.buckets()};
534 case Histogram::kTcpWriteIovSize:
535 return HistogramView{&Histogram_80_10::BucketFor, kStatsTable8, 10,
536 tcp_write_iov_size.buckets()};
537 case Histogram::kTcpReadSize:
538 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
539 tcp_read_size.buckets()};
540 case Histogram::kTcpReadOffer:
541 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
542 tcp_read_offer.buckets()};
543 case Histogram::kTcpReadOfferIovSize:
544 return HistogramView{&Histogram_80_10::BucketFor, kStatsTable8, 10,
545 tcp_read_offer_iov_size.buckets()};
546 case Histogram::kHttp2SendMessageSize:
547 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
548 http2_send_message_size.buckets()};
549 case Histogram::kHttp2MetadataSize:
550 return HistogramView{&Histogram_65536_26::BucketFor, kStatsTable2, 26,
551 http2_metadata_size.buckets()};
552 case Histogram::kHttp2HpackEntryLifetime:
553 return HistogramView{&Histogram_1800000_40::BucketFor, kStatsTable12, 40,
554 http2_hpack_entry_lifetime.buckets()};
555 case Histogram::kHttp2HeaderTableSize:
556 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
557 http2_header_table_size.buckets()};
558 case Histogram::kHttp2InitialWindowSize:
559 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
560 http2_initial_window_size.buckets()};
561 case Histogram::kHttp2MaxConcurrentStreams:
562 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
563 http2_max_concurrent_streams.buckets()};
564 case Histogram::kHttp2MaxFrameSize:
565 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
566 http2_max_frame_size.buckets()};
567 case Histogram::kHttp2MaxHeaderListSize:
568 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
569 http2_max_header_list_size.buckets()};
570 case Histogram::kHttp2PreferredReceiveCryptoMessageSize:
571 return HistogramView{
572 &Histogram_16777216_20::BucketFor, kStatsTable6, 20,
573 http2_preferred_receive_crypto_message_size.buckets()};
574 case Histogram::kHttp2StreamRemoteWindowUpdate:
575 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
576 http2_stream_remote_window_update.buckets()};
577 case Histogram::kHttp2TransportRemoteWindowUpdate:
578 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
579 http2_transport_remote_window_update.buckets()};
580 case Histogram::kHttp2TransportWindowUpdatePeriod:
581 return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
582 http2_transport_window_update_period.buckets()};
583 case Histogram::kHttp2StreamWindowUpdatePeriod:
584 return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
585 http2_stream_window_update_period.buckets()};
586 case Histogram::kWrrSubchannelListSize:
587 return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20,
588 wrr_subchannel_list_size.buckets()};
589 case Histogram::kWrrSubchannelReadySize:
590 return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20,
591 wrr_subchannel_ready_size.buckets()};
592 case Histogram::kWorkSerializerRunTimeMs:
593 return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
594 work_serializer_run_time_ms.buckets()};
595 case Histogram::kWorkSerializerWorkTimeMs:
596 return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
597 work_serializer_work_time_ms.buckets()};
598 case Histogram::kWorkSerializerWorkTimePerItemMs:
599 return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
600 work_serializer_work_time_per_item_ms.buckets()};
601 case Histogram::kWorkSerializerItemsPerRun:
602 return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20,
603 work_serializer_items_per_run.buckets()};
604 case Histogram::kChaoticGoodSendmsgsPerWriteControl:
605 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
606 chaotic_good_sendmsgs_per_write_control.buckets()};
607 case Histogram::kChaoticGoodRecvmsgsPerReadControl:
608 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
609 chaotic_good_recvmsgs_per_read_control.buckets()};
610 case Histogram::kChaoticGoodSendmsgsPerWriteData:
611 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
612 chaotic_good_sendmsgs_per_write_data.buckets()};
613 case Histogram::kChaoticGoodRecvmsgsPerReadData:
614 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
615 chaotic_good_recvmsgs_per_read_data.buckets()};
616 case Histogram::kChaoticGoodThreadHopsPerWriteControl:
617 return HistogramView{
618 &Histogram_100_20::BucketFor, kStatsTable4, 20,
619 chaotic_good_thread_hops_per_write_control.buckets()};
620 case Histogram::kChaoticGoodThreadHopsPerReadControl:
621 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
622 chaotic_good_thread_hops_per_read_control.buckets()};
623 case Histogram::kChaoticGoodThreadHopsPerWriteData:
624 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
625 chaotic_good_thread_hops_per_write_data.buckets()};
626 case Histogram::kChaoticGoodThreadHopsPerReadData:
627 return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
628 chaotic_good_thread_hops_per_read_data.buckets()};
629 case Histogram::kChaoticGoodTcpReadSizeData:
630 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
631 chaotic_good_tcp_read_size_data.buckets()};
632 case Histogram::kChaoticGoodTcpReadSizeControl:
633 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
634 chaotic_good_tcp_read_size_control.buckets()};
635 case Histogram::kChaoticGoodTcpReadOfferData:
636 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
637 chaotic_good_tcp_read_offer_data.buckets()};
638 case Histogram::kChaoticGoodTcpReadOfferControl:
639 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
640 chaotic_good_tcp_read_offer_control.buckets()};
641 case Histogram::kChaoticGoodTcpWriteSizeData:
642 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
643 chaotic_good_tcp_write_size_data.buckets()};
644 case Histogram::kChaoticGoodTcpWriteSizeControl:
645 return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
646 chaotic_good_tcp_write_size_control.buckets()};
647 }
648 }
Collect() const649 std::unique_ptr<GlobalStats> GlobalStatsCollector::Collect() const {
650 auto result = std::make_unique<GlobalStats>();
651 for (const auto& data : data_) {
652 result->client_calls_created +=
653 data.client_calls_created.load(std::memory_order_relaxed);
654 result->server_calls_created +=
655 data.server_calls_created.load(std::memory_order_relaxed);
656 result->client_channels_created +=
657 data.client_channels_created.load(std::memory_order_relaxed);
658 result->client_subchannels_created +=
659 data.client_subchannels_created.load(std::memory_order_relaxed);
660 result->server_channels_created +=
661 data.server_channels_created.load(std::memory_order_relaxed);
662 result->insecure_connections_created +=
663 data.insecure_connections_created.load(std::memory_order_relaxed);
664 result->rq_connections_dropped +=
665 data.rq_connections_dropped.load(std::memory_order_relaxed);
666 result->rq_calls_dropped +=
667 data.rq_calls_dropped.load(std::memory_order_relaxed);
668 result->rq_calls_rejected +=
669 data.rq_calls_rejected.load(std::memory_order_relaxed);
670 result->syscall_write += data.syscall_write.load(std::memory_order_relaxed);
671 result->syscall_read += data.syscall_read.load(std::memory_order_relaxed);
672 result->tcp_read_alloc_8k +=
673 data.tcp_read_alloc_8k.load(std::memory_order_relaxed);
674 result->tcp_read_alloc_64k +=
675 data.tcp_read_alloc_64k.load(std::memory_order_relaxed);
676 result->http2_settings_writes +=
677 data.http2_settings_writes.load(std::memory_order_relaxed);
678 result->http2_pings_sent +=
679 data.http2_pings_sent.load(std::memory_order_relaxed);
680 result->http2_writes_begun +=
681 data.http2_writes_begun.load(std::memory_order_relaxed);
682 result->http2_transport_stalls +=
683 data.http2_transport_stalls.load(std::memory_order_relaxed);
684 result->http2_stream_stalls +=
685 data.http2_stream_stalls.load(std::memory_order_relaxed);
686 result->http2_hpack_hits +=
687 data.http2_hpack_hits.load(std::memory_order_relaxed);
688 result->http2_hpack_misses +=
689 data.http2_hpack_misses.load(std::memory_order_relaxed);
690 result->cq_pluck_creates +=
691 data.cq_pluck_creates.load(std::memory_order_relaxed);
692 result->cq_next_creates +=
693 data.cq_next_creates.load(std::memory_order_relaxed);
694 result->cq_callback_creates +=
695 data.cq_callback_creates.load(std::memory_order_relaxed);
696 result->wrr_updates += data.wrr_updates.load(std::memory_order_relaxed);
697 result->work_serializer_items_enqueued +=
698 data.work_serializer_items_enqueued.load(std::memory_order_relaxed);
699 result->work_serializer_items_dequeued +=
700 data.work_serializer_items_dequeued.load(std::memory_order_relaxed);
701 result->econnaborted_count +=
702 data.econnaborted_count.load(std::memory_order_relaxed);
703 result->econnreset_count +=
704 data.econnreset_count.load(std::memory_order_relaxed);
705 result->epipe_count += data.epipe_count.load(std::memory_order_relaxed);
706 result->etimedout_count +=
707 data.etimedout_count.load(std::memory_order_relaxed);
708 result->econnrefused_count +=
709 data.econnrefused_count.load(std::memory_order_relaxed);
710 result->enetunreach_count +=
711 data.enetunreach_count.load(std::memory_order_relaxed);
712 result->enomsg_count += data.enomsg_count.load(std::memory_order_relaxed);
713 result->enotconn_count +=
714 data.enotconn_count.load(std::memory_order_relaxed);
715 result->enobufs_count += data.enobufs_count.load(std::memory_order_relaxed);
716 result->uncommon_io_error_count +=
717 data.uncommon_io_error_count.load(std::memory_order_relaxed);
718 result->msg_errqueue_error_count +=
719 data.msg_errqueue_error_count.load(std::memory_order_relaxed);
720 data.call_initial_size.Collect(&result->call_initial_size);
721 data.tcp_write_size.Collect(&result->tcp_write_size);
722 data.tcp_write_iov_size.Collect(&result->tcp_write_iov_size);
723 data.tcp_read_size.Collect(&result->tcp_read_size);
724 data.tcp_read_offer.Collect(&result->tcp_read_offer);
725 data.tcp_read_offer_iov_size.Collect(&result->tcp_read_offer_iov_size);
726 data.http2_send_message_size.Collect(&result->http2_send_message_size);
727 data.http2_metadata_size.Collect(&result->http2_metadata_size);
728 data.http2_hpack_entry_lifetime.Collect(
729 &result->http2_hpack_entry_lifetime);
730 data.http2_header_table_size.Collect(&result->http2_header_table_size);
731 data.http2_initial_window_size.Collect(&result->http2_initial_window_size);
732 data.http2_max_concurrent_streams.Collect(
733 &result->http2_max_concurrent_streams);
734 data.http2_max_frame_size.Collect(&result->http2_max_frame_size);
735 data.http2_max_header_list_size.Collect(
736 &result->http2_max_header_list_size);
737 data.http2_preferred_receive_crypto_message_size.Collect(
738 &result->http2_preferred_receive_crypto_message_size);
739 data.http2_stream_remote_window_update.Collect(
740 &result->http2_stream_remote_window_update);
741 data.http2_transport_remote_window_update.Collect(
742 &result->http2_transport_remote_window_update);
743 data.http2_transport_window_update_period.Collect(
744 &result->http2_transport_window_update_period);
745 data.http2_stream_window_update_period.Collect(
746 &result->http2_stream_window_update_period);
747 data.wrr_subchannel_list_size.Collect(&result->wrr_subchannel_list_size);
748 data.wrr_subchannel_ready_size.Collect(&result->wrr_subchannel_ready_size);
749 data.work_serializer_run_time_ms.Collect(
750 &result->work_serializer_run_time_ms);
751 data.work_serializer_work_time_ms.Collect(
752 &result->work_serializer_work_time_ms);
753 data.work_serializer_work_time_per_item_ms.Collect(
754 &result->work_serializer_work_time_per_item_ms);
755 data.work_serializer_items_per_run.Collect(
756 &result->work_serializer_items_per_run);
757 data.chaotic_good_sendmsgs_per_write_control.Collect(
758 &result->chaotic_good_sendmsgs_per_write_control);
759 data.chaotic_good_recvmsgs_per_read_control.Collect(
760 &result->chaotic_good_recvmsgs_per_read_control);
761 data.chaotic_good_sendmsgs_per_write_data.Collect(
762 &result->chaotic_good_sendmsgs_per_write_data);
763 data.chaotic_good_recvmsgs_per_read_data.Collect(
764 &result->chaotic_good_recvmsgs_per_read_data);
765 data.chaotic_good_thread_hops_per_write_control.Collect(
766 &result->chaotic_good_thread_hops_per_write_control);
767 data.chaotic_good_thread_hops_per_read_control.Collect(
768 &result->chaotic_good_thread_hops_per_read_control);
769 data.chaotic_good_thread_hops_per_write_data.Collect(
770 &result->chaotic_good_thread_hops_per_write_data);
771 data.chaotic_good_thread_hops_per_read_data.Collect(
772 &result->chaotic_good_thread_hops_per_read_data);
773 data.chaotic_good_tcp_read_size_data.Collect(
774 &result->chaotic_good_tcp_read_size_data);
775 data.chaotic_good_tcp_read_size_control.Collect(
776 &result->chaotic_good_tcp_read_size_control);
777 data.chaotic_good_tcp_read_offer_data.Collect(
778 &result->chaotic_good_tcp_read_offer_data);
779 data.chaotic_good_tcp_read_offer_control.Collect(
780 &result->chaotic_good_tcp_read_offer_control);
781 data.chaotic_good_tcp_write_size_data.Collect(
782 &result->chaotic_good_tcp_write_size_data);
783 data.chaotic_good_tcp_write_size_control.Collect(
784 &result->chaotic_good_tcp_write_size_control);
785 }
786 return result;
787 }
Diff(const GlobalStats & other) const788 std::unique_ptr<GlobalStats> GlobalStats::Diff(const GlobalStats& other) const {
789 auto result = std::make_unique<GlobalStats>();
790 result->client_calls_created =
791 client_calls_created - other.client_calls_created;
792 result->server_calls_created =
793 server_calls_created - other.server_calls_created;
794 result->client_channels_created =
795 client_channels_created - other.client_channels_created;
796 result->client_subchannels_created =
797 client_subchannels_created - other.client_subchannels_created;
798 result->server_channels_created =
799 server_channels_created - other.server_channels_created;
800 result->insecure_connections_created =
801 insecure_connections_created - other.insecure_connections_created;
802 result->rq_connections_dropped =
803 rq_connections_dropped - other.rq_connections_dropped;
804 result->rq_calls_dropped = rq_calls_dropped - other.rq_calls_dropped;
805 result->rq_calls_rejected = rq_calls_rejected - other.rq_calls_rejected;
806 result->syscall_write = syscall_write - other.syscall_write;
807 result->syscall_read = syscall_read - other.syscall_read;
808 result->tcp_read_alloc_8k = tcp_read_alloc_8k - other.tcp_read_alloc_8k;
809 result->tcp_read_alloc_64k = tcp_read_alloc_64k - other.tcp_read_alloc_64k;
810 result->http2_settings_writes =
811 http2_settings_writes - other.http2_settings_writes;
812 result->http2_pings_sent = http2_pings_sent - other.http2_pings_sent;
813 result->http2_writes_begun = http2_writes_begun - other.http2_writes_begun;
814 result->http2_transport_stalls =
815 http2_transport_stalls - other.http2_transport_stalls;
816 result->http2_stream_stalls = http2_stream_stalls - other.http2_stream_stalls;
817 result->http2_hpack_hits = http2_hpack_hits - other.http2_hpack_hits;
818 result->http2_hpack_misses = http2_hpack_misses - other.http2_hpack_misses;
819 result->cq_pluck_creates = cq_pluck_creates - other.cq_pluck_creates;
820 result->cq_next_creates = cq_next_creates - other.cq_next_creates;
821 result->cq_callback_creates = cq_callback_creates - other.cq_callback_creates;
822 result->wrr_updates = wrr_updates - other.wrr_updates;
823 result->work_serializer_items_enqueued =
824 work_serializer_items_enqueued - other.work_serializer_items_enqueued;
825 result->work_serializer_items_dequeued =
826 work_serializer_items_dequeued - other.work_serializer_items_dequeued;
827 result->econnaborted_count = econnaborted_count - other.econnaborted_count;
828 result->econnreset_count = econnreset_count - other.econnreset_count;
829 result->epipe_count = epipe_count - other.epipe_count;
830 result->etimedout_count = etimedout_count - other.etimedout_count;
831 result->econnrefused_count = econnrefused_count - other.econnrefused_count;
832 result->enetunreach_count = enetunreach_count - other.enetunreach_count;
833 result->enomsg_count = enomsg_count - other.enomsg_count;
834 result->enotconn_count = enotconn_count - other.enotconn_count;
835 result->enobufs_count = enobufs_count - other.enobufs_count;
836 result->uncommon_io_error_count =
837 uncommon_io_error_count - other.uncommon_io_error_count;
838 result->msg_errqueue_error_count =
839 msg_errqueue_error_count - other.msg_errqueue_error_count;
840 result->call_initial_size = call_initial_size - other.call_initial_size;
841 result->tcp_write_size = tcp_write_size - other.tcp_write_size;
842 result->tcp_write_iov_size = tcp_write_iov_size - other.tcp_write_iov_size;
843 result->tcp_read_size = tcp_read_size - other.tcp_read_size;
844 result->tcp_read_offer = tcp_read_offer - other.tcp_read_offer;
845 result->tcp_read_offer_iov_size =
846 tcp_read_offer_iov_size - other.tcp_read_offer_iov_size;
847 result->http2_send_message_size =
848 http2_send_message_size - other.http2_send_message_size;
849 result->http2_metadata_size = http2_metadata_size - other.http2_metadata_size;
850 result->http2_hpack_entry_lifetime =
851 http2_hpack_entry_lifetime - other.http2_hpack_entry_lifetime;
852 result->http2_header_table_size =
853 http2_header_table_size - other.http2_header_table_size;
854 result->http2_initial_window_size =
855 http2_initial_window_size - other.http2_initial_window_size;
856 result->http2_max_concurrent_streams =
857 http2_max_concurrent_streams - other.http2_max_concurrent_streams;
858 result->http2_max_frame_size =
859 http2_max_frame_size - other.http2_max_frame_size;
860 result->http2_max_header_list_size =
861 http2_max_header_list_size - other.http2_max_header_list_size;
862 result->http2_preferred_receive_crypto_message_size =
863 http2_preferred_receive_crypto_message_size -
864 other.http2_preferred_receive_crypto_message_size;
865 result->http2_stream_remote_window_update =
866 http2_stream_remote_window_update -
867 other.http2_stream_remote_window_update;
868 result->http2_transport_remote_window_update =
869 http2_transport_remote_window_update -
870 other.http2_transport_remote_window_update;
871 result->http2_transport_window_update_period =
872 http2_transport_window_update_period -
873 other.http2_transport_window_update_period;
874 result->http2_stream_window_update_period =
875 http2_stream_window_update_period -
876 other.http2_stream_window_update_period;
877 result->wrr_subchannel_list_size =
878 wrr_subchannel_list_size - other.wrr_subchannel_list_size;
879 result->wrr_subchannel_ready_size =
880 wrr_subchannel_ready_size - other.wrr_subchannel_ready_size;
881 result->work_serializer_run_time_ms =
882 work_serializer_run_time_ms - other.work_serializer_run_time_ms;
883 result->work_serializer_work_time_ms =
884 work_serializer_work_time_ms - other.work_serializer_work_time_ms;
885 result->work_serializer_work_time_per_item_ms =
886 work_serializer_work_time_per_item_ms -
887 other.work_serializer_work_time_per_item_ms;
888 result->work_serializer_items_per_run =
889 work_serializer_items_per_run - other.work_serializer_items_per_run;
890 result->chaotic_good_sendmsgs_per_write_control =
891 chaotic_good_sendmsgs_per_write_control -
892 other.chaotic_good_sendmsgs_per_write_control;
893 result->chaotic_good_recvmsgs_per_read_control =
894 chaotic_good_recvmsgs_per_read_control -
895 other.chaotic_good_recvmsgs_per_read_control;
896 result->chaotic_good_sendmsgs_per_write_data =
897 chaotic_good_sendmsgs_per_write_data -
898 other.chaotic_good_sendmsgs_per_write_data;
899 result->chaotic_good_recvmsgs_per_read_data =
900 chaotic_good_recvmsgs_per_read_data -
901 other.chaotic_good_recvmsgs_per_read_data;
902 result->chaotic_good_thread_hops_per_write_control =
903 chaotic_good_thread_hops_per_write_control -
904 other.chaotic_good_thread_hops_per_write_control;
905 result->chaotic_good_thread_hops_per_read_control =
906 chaotic_good_thread_hops_per_read_control -
907 other.chaotic_good_thread_hops_per_read_control;
908 result->chaotic_good_thread_hops_per_write_data =
909 chaotic_good_thread_hops_per_write_data -
910 other.chaotic_good_thread_hops_per_write_data;
911 result->chaotic_good_thread_hops_per_read_data =
912 chaotic_good_thread_hops_per_read_data -
913 other.chaotic_good_thread_hops_per_read_data;
914 result->chaotic_good_tcp_read_size_data =
915 chaotic_good_tcp_read_size_data - other.chaotic_good_tcp_read_size_data;
916 result->chaotic_good_tcp_read_size_control =
917 chaotic_good_tcp_read_size_control -
918 other.chaotic_good_tcp_read_size_control;
919 result->chaotic_good_tcp_read_offer_data =
920 chaotic_good_tcp_read_offer_data - other.chaotic_good_tcp_read_offer_data;
921 result->chaotic_good_tcp_read_offer_control =
922 chaotic_good_tcp_read_offer_control -
923 other.chaotic_good_tcp_read_offer_control;
924 result->chaotic_good_tcp_write_size_data =
925 chaotic_good_tcp_write_size_data - other.chaotic_good_tcp_write_size_data;
926 result->chaotic_good_tcp_write_size_control =
927 chaotic_good_tcp_write_size_control -
928 other.chaotic_good_tcp_write_size_control;
929 return result;
930 }
931 } // namespace grpc_core
932