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