• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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