• 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 <grpc/support/port_platform.h>
18 
19 #include "src/core/lib/debug/stats_data.h"
20 
21 #include <stdint.h>
22 
23 namespace grpc_core {
24 namespace {
25 union DblUint {
26   double dbl;
27   uint64_t uint;
28 };
29 }  // namespace
Collect(Histogram_100000_20 * result) const30 void HistogramCollector_100000_20::Collect(Histogram_100000_20* result) const {
31   for (int i = 0; i < 20; i++) {
32     result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
33   }
34 }
operator -(const Histogram_100000_20 & left,const Histogram_100000_20 & right)35 Histogram_100000_20 operator-(const Histogram_100000_20& left,
36                               const Histogram_100000_20& right) {
37   Histogram_100000_20 result;
38   for (int i = 0; i < 20; i++) {
39     result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
40   }
41   return result;
42 }
Collect(Histogram_65536_26 * result) const43 void HistogramCollector_65536_26::Collect(Histogram_65536_26* result) const {
44   for (int i = 0; i < 26; i++) {
45     result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
46   }
47 }
operator -(const Histogram_65536_26 & left,const Histogram_65536_26 & right)48 Histogram_65536_26 operator-(const Histogram_65536_26& left,
49                              const Histogram_65536_26& right) {
50   Histogram_65536_26 result;
51   for (int i = 0; i < 26; i++) {
52     result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
53   }
54   return result;
55 }
Collect(Histogram_100_20 * result) const56 void HistogramCollector_100_20::Collect(Histogram_100_20* result) const {
57   for (int i = 0; i < 20; i++) {
58     result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
59   }
60 }
operator -(const Histogram_100_20 & left,const Histogram_100_20 & right)61 Histogram_100_20 operator-(const Histogram_100_20& left,
62                            const Histogram_100_20& right) {
63   Histogram_100_20 result;
64   for (int i = 0; i < 20; i++) {
65     result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
66   }
67   return result;
68 }
Collect(Histogram_16777216_20 * result) const69 void HistogramCollector_16777216_20::Collect(
70     Histogram_16777216_20* result) const {
71   for (int i = 0; i < 20; i++) {
72     result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
73   }
74 }
operator -(const Histogram_16777216_20 & left,const Histogram_16777216_20 & right)75 Histogram_16777216_20 operator-(const Histogram_16777216_20& left,
76                                 const Histogram_16777216_20& right) {
77   Histogram_16777216_20 result;
78   for (int i = 0; i < 20; i++) {
79     result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
80   }
81   return result;
82 }
Collect(Histogram_80_10 * result) const83 void HistogramCollector_80_10::Collect(Histogram_80_10* result) const {
84   for (int i = 0; i < 10; i++) {
85     result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
86   }
87 }
operator -(const Histogram_80_10 & left,const Histogram_80_10 & right)88 Histogram_80_10 operator-(const Histogram_80_10& left,
89                           const Histogram_80_10& right) {
90   Histogram_80_10 result;
91   for (int i = 0; i < 10; i++) {
92     result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
93   }
94   return result;
95 }
Collect(Histogram_10000_20 * result) const96 void HistogramCollector_10000_20::Collect(Histogram_10000_20* result) const {
97   for (int i = 0; i < 20; i++) {
98     result->buckets_[i] += buckets_[i].load(std::memory_order_relaxed);
99   }
100 }
operator -(const Histogram_10000_20 & left,const Histogram_10000_20 & right)101 Histogram_10000_20 operator-(const Histogram_10000_20& left,
102                              const Histogram_10000_20& right) {
103   Histogram_10000_20 result;
104   for (int i = 0; i < 20; i++) {
105     result.buckets_[i] = left.buckets_[i] - right.buckets_[i];
106   }
107   return result;
108 }
109 const absl::string_view
110     GlobalStats::counter_name[static_cast<int>(Counter::COUNT)] = {
111         "client_calls_created",
112         "server_calls_created",
113         "client_channels_created",
114         "client_subchannels_created",
115         "server_channels_created",
116         "insecure_connections_created",
117         "syscall_write",
118         "syscall_read",
119         "tcp_read_alloc_8k",
120         "tcp_read_alloc_64k",
121         "http2_settings_writes",
122         "http2_pings_sent",
123         "http2_writes_begun",
124         "http2_transport_stalls",
125         "http2_stream_stalls",
126         "cq_pluck_creates",
127         "cq_next_creates",
128         "cq_callback_creates",
129         "wrr_updates",
130         "work_serializer_items_enqueued",
131         "work_serializer_items_dequeued",
132         "econnaborted_count",
133         "econnreset_count",
134         "epipe_count",
135         "etimedout_count",
136         "econnrefused_count",
137         "enetunreach_count",
138         "enomsg_count",
139         "enotconn_count",
140         "enobufs_count",
141         "uncommon_io_error_count",
142         "msg_errqueue_error_count",
143 };
144 const absl::string_view GlobalStats::counter_doc[static_cast<int>(
145     Counter::COUNT)] = {
146     "Number of client side calls created by this process",
147     "Number of server side calls created by this process",
148     "Number of client channels created",
149     "Number of client subchannels created",
150     "Number of server channels created",
151     "Number of insecure connections created",
152     "Number of write syscalls (or equivalent - eg sendmsg) made by this "
153     "process",
154     "Number of read syscalls (or equivalent - eg recvmsg) made by this process",
155     "Number of 8k allocations by the TCP subsystem for reading",
156     "Number of 64k allocations by the TCP subsystem for reading",
157     "Number of settings frames sent",
158     "Number of HTTP2 pings sent by process",
159     "Number of HTTP2 writes initiated",
160     "Number of times sending was completely stalled by the transport flow "
161     "control window",
162     "Number of times sending was completely stalled by the stream flow control "
163     "window",
164     "Number of completion queues created for cq_pluck (indicates sync api "
165     "usage)",
166     "Number of completion queues created for cq_next (indicates cq async api "
167     "usage)",
168     "Number of completion queues created for cq_callback (indicates callback "
169     "api usage)",
170     "Number of wrr updates that have been received",
171     "Number of items enqueued onto work serializers",
172     "Number of items dequeued from work serializers",
173     "Number of ECONNABORTED errors",
174     "Number of ECONNRESET errors",
175     "Number of EPIPE errors",
176     "Number of ETIMEDOUT errors",
177     "Number of ECONNREFUSED errors",
178     "Number of ENETUNREACH errors",
179     "Number of ENOMSG errors",
180     "Number of ENOTCONN errors",
181     "Number of ENOBUFS errors",
182     "Number of uncommon io errors",
183     "Number of uncommon errors returned by MSG_ERRQUEUE",
184 };
185 const absl::string_view
186     GlobalStats::histogram_name[static_cast<int>(Histogram::COUNT)] = {
187         "call_initial_size",
188         "tcp_write_size",
189         "tcp_write_iov_size",
190         "tcp_read_size",
191         "tcp_read_offer",
192         "tcp_read_offer_iov_size",
193         "http2_send_message_size",
194         "http2_metadata_size",
195         "wrr_subchannel_list_size",
196         "wrr_subchannel_ready_size",
197         "work_serializer_run_time_ms",
198         "work_serializer_work_time_ms",
199         "work_serializer_work_time_per_item_ms",
200         "work_serializer_items_per_run",
201         "chaotic_good_sendmsgs_per_write_control",
202         "chaotic_good_recvmsgs_per_read_control",
203         "chaotic_good_sendmsgs_per_write_data",
204         "chaotic_good_recvmsgs_per_read_data",
205         "chaotic_good_thread_hops_per_write_control",
206         "chaotic_good_thread_hops_per_read_control",
207         "chaotic_good_thread_hops_per_write_data",
208         "chaotic_good_thread_hops_per_read_data",
209         "chaotic_good_tcp_read_size_data",
210         "chaotic_good_tcp_read_size_control",
211         "chaotic_good_tcp_read_offer_data",
212         "chaotic_good_tcp_read_offer_control",
213         "chaotic_good_tcp_write_size_data",
214         "chaotic_good_tcp_write_size_control",
215 };
216 const absl::string_view GlobalStats::histogram_doc[static_cast<int>(
217     Histogram::COUNT)] = {
218     "Initial size of the grpc_call arena created at call start",
219     "Number of bytes offered to each syscall_write",
220     "Number of byte segments offered to each syscall_write",
221     "Number of bytes received by each syscall_read",
222     "Number of bytes offered to each syscall_read",
223     "Number of byte segments offered to each syscall_read",
224     "Size of messages received by HTTP2 transport",
225     "Number of bytes consumed by metadata, according to HPACK accounting rules",
226     "Number of subchannels in a subchannel list at picker creation time",
227     "Number of READY subchannels in a subchannel list at picker creation time",
228     "Number of milliseconds work serializers run for",
229     "When running, how many milliseconds are work serializers actually doing "
230     "work",
231     "How long do individual items take to process in work serializers",
232     "How many callbacks are executed when a work serializer runs",
233     "Number of sendmsgs per control channel endpoint write",
234     "Number of recvmsgs per control channel endpoint read",
235     "Number of sendmsgs per data channel endpoint write",
236     "Number of recvmsgs per data channel endpoint read",
237     "Number of thread hops per control channel endpoint write",
238     "Number of thread hops per control channel endpoint read",
239     "Number of thread hops per data channel endpoint write",
240     "Number of thread hops per data channel endpoint read",
241     "Number of bytes received by each syscall_read in the data channel",
242     "Number of bytes received by each syscall_read in the control channel",
243     "Number of bytes offered to each syscall_read in the data channel",
244     "Number of bytes offered to each syscall_read in the control channel",
245     "Number of bytes offered to each syscall_write in the data channel",
246     "Number of bytes offered to each syscall_write in the control channel",
247 };
248 namespace {
249 const int kStatsTable0[21] = {0,    1,    2,    4,     8,     15,    27,
250                               49,   89,   160,  288,   517,   928,   1666,
251                               2991, 5369, 9637, 17297, 31045, 55719, 100000};
252 const uint8_t kStatsTable1[30] = {3,  3,  4,  4,  5,  6,  6,  7,  7,  8,
253                                   9,  9,  10, 10, 11, 11, 12, 13, 13, 14,
254                                   15, 15, 16, 16, 17, 17, 18, 19, 19, 20};
255 const int kStatsTable2[27] = {0,    1,     2,     4,     7,     11,   17,
256                               26,   40,    61,    92,    139,   210,  317,
257                               478,  721,   1087,  1638,  2468,  3719, 5604,
258                               8443, 12721, 19166, 28875, 43502, 65536};
259 const uint8_t kStatsTable3[29] = {3,  3,  4,  5,  6,  6,  7,  8,  9,  10,
260                                   11, 11, 12, 13, 14, 15, 16, 16, 17, 18,
261                                   19, 20, 21, 21, 22, 23, 24, 25, 26};
262 const int kStatsTable4[21] = {0,  1,  2,  3,  4,  5,  7,  9,  11, 14, 17,
263                               21, 25, 30, 36, 43, 51, 61, 72, 85, 100};
264 const uint8_t kStatsTable5[16] = {6,  6,  7,  8,  9,  9,  10, 11,
265                                   12, 13, 14, 15, 16, 17, 18, 19};
266 const int kStatsTable6[21] = {
267     0,     1,      3,      8,       19,      45,      106,
268     250,   588,    1383,   3252,    7646,    17976,   42262,
269     99359, 233593, 549177, 1291113, 3035402, 7136218, 16777216};
270 const uint8_t kStatsTable7[23] = {2,  3,  3,  4,  5,  6,  7,  8,
271                                   8,  9,  10, 11, 12, 12, 13, 14,
272                                   15, 16, 16, 17, 18, 19, 20};
273 const int kStatsTable8[11] = {0, 1, 2, 4, 7, 11, 17, 26, 38, 56, 80};
274 const uint8_t kStatsTable9[9] = {3, 3, 4, 5, 6, 6, 7, 8, 9};
275 const int kStatsTable10[21] = {0,   1,    2,    4,    7,    12,   19,
276                                30,  47,   74,   116,  182,  285,  445,
277                                695, 1084, 1691, 2637, 4113, 6414, 10000};
278 const uint8_t kStatsTable11[23] = {3,  3,  4,  5,  5,  6,  7,  8,
279                                    9,  9,  10, 11, 12, 12, 13, 14,
280                                    15, 15, 16, 17, 18, 18, 19};
281 }  // namespace
BucketFor(int value)282 int Histogram_100000_20::BucketFor(int value) {
283   if (value < 3) {
284     if (value < 0) {
285       return 0;
286     } else {
287       return value;
288     }
289   } else {
290     if (value < 65537) {
291       DblUint val;
292       val.dbl = value;
293       const int bucket =
294           kStatsTable1[((val.uint - 4613937818241073152ull) >> 51)];
295       return bucket - (value < kStatsTable0[bucket]);
296     } else {
297       return 19;
298     }
299   }
300 }
BucketFor(int value)301 int Histogram_65536_26::BucketFor(int value) {
302   if (value < 3) {
303     if (value < 0) {
304       return 0;
305     } else {
306       return value;
307     }
308   } else {
309     if (value < 49153) {
310       DblUint val;
311       val.dbl = value;
312       const int bucket =
313           kStatsTable3[((val.uint - 4613937818241073152ull) >> 51)];
314       return bucket - (value < kStatsTable2[bucket]);
315     } else {
316       return 25;
317     }
318   }
319 }
BucketFor(int value)320 int Histogram_100_20::BucketFor(int value) {
321   if (value < 6) {
322     if (value < 0) {
323       return 0;
324     } else {
325       return value;
326     }
327   } else {
328     if (value < 81) {
329       DblUint val;
330       val.dbl = value;
331       const int bucket =
332           kStatsTable5[((val.uint - 4618441417868443648ull) >> 50)];
333       return bucket - (value < kStatsTable4[bucket]);
334     } else {
335       if (value < 85) {
336         return 18;
337       } else {
338         return 19;
339       }
340     }
341   }
342 }
BucketFor(int value)343 int Histogram_16777216_20::BucketFor(int value) {
344   if (value < 2) {
345     if (value < 0) {
346       return 0;
347     } else {
348       return value;
349     }
350   } else {
351     if (value < 8388609) {
352       DblUint val;
353       val.dbl = value;
354       const int bucket =
355           kStatsTable7[((val.uint - 4611686018427387904ull) >> 52)];
356       return bucket - (value < kStatsTable6[bucket]);
357     } else {
358       return 19;
359     }
360   }
361 }
BucketFor(int value)362 int Histogram_80_10::BucketFor(int value) {
363   if (value < 3) {
364     if (value < 0) {
365       return 0;
366     } else {
367       return value;
368     }
369   } else {
370     if (value < 49) {
371       DblUint val;
372       val.dbl = value;
373       const int bucket =
374           kStatsTable9[((val.uint - 4613937818241073152ull) >> 51)];
375       return bucket - (value < kStatsTable8[bucket]);
376     } else {
377       if (value < 56) {
378         return 8;
379       } else {
380         return 9;
381       }
382     }
383   }
384 }
BucketFor(int value)385 int Histogram_10000_20::BucketFor(int value) {
386   if (value < 3) {
387     if (value < 0) {
388       return 0;
389     } else {
390       return value;
391     }
392   } else {
393     if (value < 6145) {
394       DblUint val;
395       val.dbl = value;
396       const int bucket =
397           kStatsTable11[((val.uint - 4613937818241073152ull) >> 51)];
398       return bucket - (value < kStatsTable10[bucket]);
399     } else {
400       if (value < 6414) {
401         return 18;
402       } else {
403         return 19;
404       }
405     }
406   }
407 }
GlobalStats()408 GlobalStats::GlobalStats()
409     : client_calls_created{0},
410       server_calls_created{0},
411       client_channels_created{0},
412       client_subchannels_created{0},
413       server_channels_created{0},
414       insecure_connections_created{0},
415       syscall_write{0},
416       syscall_read{0},
417       tcp_read_alloc_8k{0},
418       tcp_read_alloc_64k{0},
419       http2_settings_writes{0},
420       http2_pings_sent{0},
421       http2_writes_begun{0},
422       http2_transport_stalls{0},
423       http2_stream_stalls{0},
424       cq_pluck_creates{0},
425       cq_next_creates{0},
426       cq_callback_creates{0},
427       wrr_updates{0},
428       work_serializer_items_enqueued{0},
429       work_serializer_items_dequeued{0},
430       econnaborted_count{0},
431       econnreset_count{0},
432       epipe_count{0},
433       etimedout_count{0},
434       econnrefused_count{0},
435       enetunreach_count{0},
436       enomsg_count{0},
437       enotconn_count{0},
438       enobufs_count{0},
439       uncommon_io_error_count{0},
440       msg_errqueue_error_count{0} {}
histogram(Histogram which) const441 HistogramView GlobalStats::histogram(Histogram which) const {
442   switch (which) {
443     default:
444       GPR_UNREACHABLE_CODE(return HistogramView());
445     case Histogram::kCallInitialSize:
446       return HistogramView{&Histogram_65536_26::BucketFor, kStatsTable2, 26,
447                            call_initial_size.buckets()};
448     case Histogram::kTcpWriteSize:
449       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
450                            tcp_write_size.buckets()};
451     case Histogram::kTcpWriteIovSize:
452       return HistogramView{&Histogram_80_10::BucketFor, kStatsTable8, 10,
453                            tcp_write_iov_size.buckets()};
454     case Histogram::kTcpReadSize:
455       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
456                            tcp_read_size.buckets()};
457     case Histogram::kTcpReadOffer:
458       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
459                            tcp_read_offer.buckets()};
460     case Histogram::kTcpReadOfferIovSize:
461       return HistogramView{&Histogram_80_10::BucketFor, kStatsTable8, 10,
462                            tcp_read_offer_iov_size.buckets()};
463     case Histogram::kHttp2SendMessageSize:
464       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
465                            http2_send_message_size.buckets()};
466     case Histogram::kHttp2MetadataSize:
467       return HistogramView{&Histogram_65536_26::BucketFor, kStatsTable2, 26,
468                            http2_metadata_size.buckets()};
469     case Histogram::kWrrSubchannelListSize:
470       return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20,
471                            wrr_subchannel_list_size.buckets()};
472     case Histogram::kWrrSubchannelReadySize:
473       return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20,
474                            wrr_subchannel_ready_size.buckets()};
475     case Histogram::kWorkSerializerRunTimeMs:
476       return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
477                            work_serializer_run_time_ms.buckets()};
478     case Histogram::kWorkSerializerWorkTimeMs:
479       return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
480                            work_serializer_work_time_ms.buckets()};
481     case Histogram::kWorkSerializerWorkTimePerItemMs:
482       return HistogramView{&Histogram_100000_20::BucketFor, kStatsTable0, 20,
483                            work_serializer_work_time_per_item_ms.buckets()};
484     case Histogram::kWorkSerializerItemsPerRun:
485       return HistogramView{&Histogram_10000_20::BucketFor, kStatsTable10, 20,
486                            work_serializer_items_per_run.buckets()};
487     case Histogram::kChaoticGoodSendmsgsPerWriteControl:
488       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
489                            chaotic_good_sendmsgs_per_write_control.buckets()};
490     case Histogram::kChaoticGoodRecvmsgsPerReadControl:
491       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
492                            chaotic_good_recvmsgs_per_read_control.buckets()};
493     case Histogram::kChaoticGoodSendmsgsPerWriteData:
494       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
495                            chaotic_good_sendmsgs_per_write_data.buckets()};
496     case Histogram::kChaoticGoodRecvmsgsPerReadData:
497       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
498                            chaotic_good_recvmsgs_per_read_data.buckets()};
499     case Histogram::kChaoticGoodThreadHopsPerWriteControl:
500       return HistogramView{
501           &Histogram_100_20::BucketFor, kStatsTable4, 20,
502           chaotic_good_thread_hops_per_write_control.buckets()};
503     case Histogram::kChaoticGoodThreadHopsPerReadControl:
504       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
505                            chaotic_good_thread_hops_per_read_control.buckets()};
506     case Histogram::kChaoticGoodThreadHopsPerWriteData:
507       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
508                            chaotic_good_thread_hops_per_write_data.buckets()};
509     case Histogram::kChaoticGoodThreadHopsPerReadData:
510       return HistogramView{&Histogram_100_20::BucketFor, kStatsTable4, 20,
511                            chaotic_good_thread_hops_per_read_data.buckets()};
512     case Histogram::kChaoticGoodTcpReadSizeData:
513       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
514                            chaotic_good_tcp_read_size_data.buckets()};
515     case Histogram::kChaoticGoodTcpReadSizeControl:
516       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
517                            chaotic_good_tcp_read_size_control.buckets()};
518     case Histogram::kChaoticGoodTcpReadOfferData:
519       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
520                            chaotic_good_tcp_read_offer_data.buckets()};
521     case Histogram::kChaoticGoodTcpReadOfferControl:
522       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
523                            chaotic_good_tcp_read_offer_control.buckets()};
524     case Histogram::kChaoticGoodTcpWriteSizeData:
525       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
526                            chaotic_good_tcp_write_size_data.buckets()};
527     case Histogram::kChaoticGoodTcpWriteSizeControl:
528       return HistogramView{&Histogram_16777216_20::BucketFor, kStatsTable6, 20,
529                            chaotic_good_tcp_write_size_control.buckets()};
530   }
531 }
Collect() const532 std::unique_ptr<GlobalStats> GlobalStatsCollector::Collect() const {
533   auto result = std::make_unique<GlobalStats>();
534   for (const auto& data : data_) {
535     result->client_calls_created +=
536         data.client_calls_created.load(std::memory_order_relaxed);
537     result->server_calls_created +=
538         data.server_calls_created.load(std::memory_order_relaxed);
539     result->client_channels_created +=
540         data.client_channels_created.load(std::memory_order_relaxed);
541     result->client_subchannels_created +=
542         data.client_subchannels_created.load(std::memory_order_relaxed);
543     result->server_channels_created +=
544         data.server_channels_created.load(std::memory_order_relaxed);
545     result->insecure_connections_created +=
546         data.insecure_connections_created.load(std::memory_order_relaxed);
547     result->syscall_write += data.syscall_write.load(std::memory_order_relaxed);
548     result->syscall_read += data.syscall_read.load(std::memory_order_relaxed);
549     result->tcp_read_alloc_8k +=
550         data.tcp_read_alloc_8k.load(std::memory_order_relaxed);
551     result->tcp_read_alloc_64k +=
552         data.tcp_read_alloc_64k.load(std::memory_order_relaxed);
553     result->http2_settings_writes +=
554         data.http2_settings_writes.load(std::memory_order_relaxed);
555     result->http2_pings_sent +=
556         data.http2_pings_sent.load(std::memory_order_relaxed);
557     result->http2_writes_begun +=
558         data.http2_writes_begun.load(std::memory_order_relaxed);
559     result->http2_transport_stalls +=
560         data.http2_transport_stalls.load(std::memory_order_relaxed);
561     result->http2_stream_stalls +=
562         data.http2_stream_stalls.load(std::memory_order_relaxed);
563     result->cq_pluck_creates +=
564         data.cq_pluck_creates.load(std::memory_order_relaxed);
565     result->cq_next_creates +=
566         data.cq_next_creates.load(std::memory_order_relaxed);
567     result->cq_callback_creates +=
568         data.cq_callback_creates.load(std::memory_order_relaxed);
569     result->wrr_updates += data.wrr_updates.load(std::memory_order_relaxed);
570     result->work_serializer_items_enqueued +=
571         data.work_serializer_items_enqueued.load(std::memory_order_relaxed);
572     result->work_serializer_items_dequeued +=
573         data.work_serializer_items_dequeued.load(std::memory_order_relaxed);
574     result->econnaborted_count +=
575         data.econnaborted_count.load(std::memory_order_relaxed);
576     result->econnreset_count +=
577         data.econnreset_count.load(std::memory_order_relaxed);
578     result->epipe_count += data.epipe_count.load(std::memory_order_relaxed);
579     result->etimedout_count +=
580         data.etimedout_count.load(std::memory_order_relaxed);
581     result->econnrefused_count +=
582         data.econnrefused_count.load(std::memory_order_relaxed);
583     result->enetunreach_count +=
584         data.enetunreach_count.load(std::memory_order_relaxed);
585     result->enomsg_count += data.enomsg_count.load(std::memory_order_relaxed);
586     result->enotconn_count +=
587         data.enotconn_count.load(std::memory_order_relaxed);
588     result->enobufs_count += data.enobufs_count.load(std::memory_order_relaxed);
589     result->uncommon_io_error_count +=
590         data.uncommon_io_error_count.load(std::memory_order_relaxed);
591     result->msg_errqueue_error_count +=
592         data.msg_errqueue_error_count.load(std::memory_order_relaxed);
593     data.call_initial_size.Collect(&result->call_initial_size);
594     data.tcp_write_size.Collect(&result->tcp_write_size);
595     data.tcp_write_iov_size.Collect(&result->tcp_write_iov_size);
596     data.tcp_read_size.Collect(&result->tcp_read_size);
597     data.tcp_read_offer.Collect(&result->tcp_read_offer);
598     data.tcp_read_offer_iov_size.Collect(&result->tcp_read_offer_iov_size);
599     data.http2_send_message_size.Collect(&result->http2_send_message_size);
600     data.http2_metadata_size.Collect(&result->http2_metadata_size);
601     data.wrr_subchannel_list_size.Collect(&result->wrr_subchannel_list_size);
602     data.wrr_subchannel_ready_size.Collect(&result->wrr_subchannel_ready_size);
603     data.work_serializer_run_time_ms.Collect(
604         &result->work_serializer_run_time_ms);
605     data.work_serializer_work_time_ms.Collect(
606         &result->work_serializer_work_time_ms);
607     data.work_serializer_work_time_per_item_ms.Collect(
608         &result->work_serializer_work_time_per_item_ms);
609     data.work_serializer_items_per_run.Collect(
610         &result->work_serializer_items_per_run);
611     data.chaotic_good_sendmsgs_per_write_control.Collect(
612         &result->chaotic_good_sendmsgs_per_write_control);
613     data.chaotic_good_recvmsgs_per_read_control.Collect(
614         &result->chaotic_good_recvmsgs_per_read_control);
615     data.chaotic_good_sendmsgs_per_write_data.Collect(
616         &result->chaotic_good_sendmsgs_per_write_data);
617     data.chaotic_good_recvmsgs_per_read_data.Collect(
618         &result->chaotic_good_recvmsgs_per_read_data);
619     data.chaotic_good_thread_hops_per_write_control.Collect(
620         &result->chaotic_good_thread_hops_per_write_control);
621     data.chaotic_good_thread_hops_per_read_control.Collect(
622         &result->chaotic_good_thread_hops_per_read_control);
623     data.chaotic_good_thread_hops_per_write_data.Collect(
624         &result->chaotic_good_thread_hops_per_write_data);
625     data.chaotic_good_thread_hops_per_read_data.Collect(
626         &result->chaotic_good_thread_hops_per_read_data);
627     data.chaotic_good_tcp_read_size_data.Collect(
628         &result->chaotic_good_tcp_read_size_data);
629     data.chaotic_good_tcp_read_size_control.Collect(
630         &result->chaotic_good_tcp_read_size_control);
631     data.chaotic_good_tcp_read_offer_data.Collect(
632         &result->chaotic_good_tcp_read_offer_data);
633     data.chaotic_good_tcp_read_offer_control.Collect(
634         &result->chaotic_good_tcp_read_offer_control);
635     data.chaotic_good_tcp_write_size_data.Collect(
636         &result->chaotic_good_tcp_write_size_data);
637     data.chaotic_good_tcp_write_size_control.Collect(
638         &result->chaotic_good_tcp_write_size_control);
639   }
640   return result;
641 }
Diff(const GlobalStats & other) const642 std::unique_ptr<GlobalStats> GlobalStats::Diff(const GlobalStats& other) const {
643   auto result = std::make_unique<GlobalStats>();
644   result->client_calls_created =
645       client_calls_created - other.client_calls_created;
646   result->server_calls_created =
647       server_calls_created - other.server_calls_created;
648   result->client_channels_created =
649       client_channels_created - other.client_channels_created;
650   result->client_subchannels_created =
651       client_subchannels_created - other.client_subchannels_created;
652   result->server_channels_created =
653       server_channels_created - other.server_channels_created;
654   result->insecure_connections_created =
655       insecure_connections_created - other.insecure_connections_created;
656   result->syscall_write = syscall_write - other.syscall_write;
657   result->syscall_read = syscall_read - other.syscall_read;
658   result->tcp_read_alloc_8k = tcp_read_alloc_8k - other.tcp_read_alloc_8k;
659   result->tcp_read_alloc_64k = tcp_read_alloc_64k - other.tcp_read_alloc_64k;
660   result->http2_settings_writes =
661       http2_settings_writes - other.http2_settings_writes;
662   result->http2_pings_sent = http2_pings_sent - other.http2_pings_sent;
663   result->http2_writes_begun = http2_writes_begun - other.http2_writes_begun;
664   result->http2_transport_stalls =
665       http2_transport_stalls - other.http2_transport_stalls;
666   result->http2_stream_stalls = http2_stream_stalls - other.http2_stream_stalls;
667   result->cq_pluck_creates = cq_pluck_creates - other.cq_pluck_creates;
668   result->cq_next_creates = cq_next_creates - other.cq_next_creates;
669   result->cq_callback_creates = cq_callback_creates - other.cq_callback_creates;
670   result->wrr_updates = wrr_updates - other.wrr_updates;
671   result->work_serializer_items_enqueued =
672       work_serializer_items_enqueued - other.work_serializer_items_enqueued;
673   result->work_serializer_items_dequeued =
674       work_serializer_items_dequeued - other.work_serializer_items_dequeued;
675   result->econnaborted_count = econnaborted_count - other.econnaborted_count;
676   result->econnreset_count = econnreset_count - other.econnreset_count;
677   result->epipe_count = epipe_count - other.epipe_count;
678   result->etimedout_count = etimedout_count - other.etimedout_count;
679   result->econnrefused_count = econnrefused_count - other.econnrefused_count;
680   result->enetunreach_count = enetunreach_count - other.enetunreach_count;
681   result->enomsg_count = enomsg_count - other.enomsg_count;
682   result->enotconn_count = enotconn_count - other.enotconn_count;
683   result->enobufs_count = enobufs_count - other.enobufs_count;
684   result->uncommon_io_error_count =
685       uncommon_io_error_count - other.uncommon_io_error_count;
686   result->msg_errqueue_error_count =
687       msg_errqueue_error_count - other.msg_errqueue_error_count;
688   result->call_initial_size = call_initial_size - other.call_initial_size;
689   result->tcp_write_size = tcp_write_size - other.tcp_write_size;
690   result->tcp_write_iov_size = tcp_write_iov_size - other.tcp_write_iov_size;
691   result->tcp_read_size = tcp_read_size - other.tcp_read_size;
692   result->tcp_read_offer = tcp_read_offer - other.tcp_read_offer;
693   result->tcp_read_offer_iov_size =
694       tcp_read_offer_iov_size - other.tcp_read_offer_iov_size;
695   result->http2_send_message_size =
696       http2_send_message_size - other.http2_send_message_size;
697   result->http2_metadata_size = http2_metadata_size - other.http2_metadata_size;
698   result->wrr_subchannel_list_size =
699       wrr_subchannel_list_size - other.wrr_subchannel_list_size;
700   result->wrr_subchannel_ready_size =
701       wrr_subchannel_ready_size - other.wrr_subchannel_ready_size;
702   result->work_serializer_run_time_ms =
703       work_serializer_run_time_ms - other.work_serializer_run_time_ms;
704   result->work_serializer_work_time_ms =
705       work_serializer_work_time_ms - other.work_serializer_work_time_ms;
706   result->work_serializer_work_time_per_item_ms =
707       work_serializer_work_time_per_item_ms -
708       other.work_serializer_work_time_per_item_ms;
709   result->work_serializer_items_per_run =
710       work_serializer_items_per_run - other.work_serializer_items_per_run;
711   result->chaotic_good_sendmsgs_per_write_control =
712       chaotic_good_sendmsgs_per_write_control -
713       other.chaotic_good_sendmsgs_per_write_control;
714   result->chaotic_good_recvmsgs_per_read_control =
715       chaotic_good_recvmsgs_per_read_control -
716       other.chaotic_good_recvmsgs_per_read_control;
717   result->chaotic_good_sendmsgs_per_write_data =
718       chaotic_good_sendmsgs_per_write_data -
719       other.chaotic_good_sendmsgs_per_write_data;
720   result->chaotic_good_recvmsgs_per_read_data =
721       chaotic_good_recvmsgs_per_read_data -
722       other.chaotic_good_recvmsgs_per_read_data;
723   result->chaotic_good_thread_hops_per_write_control =
724       chaotic_good_thread_hops_per_write_control -
725       other.chaotic_good_thread_hops_per_write_control;
726   result->chaotic_good_thread_hops_per_read_control =
727       chaotic_good_thread_hops_per_read_control -
728       other.chaotic_good_thread_hops_per_read_control;
729   result->chaotic_good_thread_hops_per_write_data =
730       chaotic_good_thread_hops_per_write_data -
731       other.chaotic_good_thread_hops_per_write_data;
732   result->chaotic_good_thread_hops_per_read_data =
733       chaotic_good_thread_hops_per_read_data -
734       other.chaotic_good_thread_hops_per_read_data;
735   result->chaotic_good_tcp_read_size_data =
736       chaotic_good_tcp_read_size_data - other.chaotic_good_tcp_read_size_data;
737   result->chaotic_good_tcp_read_size_control =
738       chaotic_good_tcp_read_size_control -
739       other.chaotic_good_tcp_read_size_control;
740   result->chaotic_good_tcp_read_offer_data =
741       chaotic_good_tcp_read_offer_data - other.chaotic_good_tcp_read_offer_data;
742   result->chaotic_good_tcp_read_offer_control =
743       chaotic_good_tcp_read_offer_control -
744       other.chaotic_good_tcp_read_offer_control;
745   result->chaotic_good_tcp_write_size_data =
746       chaotic_good_tcp_write_size_data - other.chaotic_good_tcp_write_size_data;
747   result->chaotic_good_tcp_write_size_control =
748       chaotic_good_tcp_write_size_control -
749       other.chaotic_good_tcp_write_size_control;
750   return result;
751 }
752 }  // namespace grpc_core
753