Home | History | Annotate | Download | only in performance
      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 # Autogenerated by tools/codegen/core/gen_stats_data.py
     16 
     17 import massage_qps_stats_helpers
     18 
     19 
     20 def massage_qps_stats(scenario_result):
     21     for stats in scenario_result["serverStats"] + scenario_result["clientStats"]:
     22         if "coreStats" in stats:
     23             # Get rid of the "coreStats" element and replace it by statistics
     24             # that correspond to columns in the bigquery schema.
     25             core_stats = stats["coreStats"]
     26             del stats["coreStats"]
     27             stats[
     28                 "core_client_calls_created"] = massage_qps_stats_helpers.counter(
     29                     core_stats, "client_calls_created")
     30             stats[
     31                 "core_server_calls_created"] = massage_qps_stats_helpers.counter(
     32                     core_stats, "server_calls_created")
     33             stats["core_cqs_created"] = massage_qps_stats_helpers.counter(
     34                 core_stats, "cqs_created")
     35             stats[
     36                 "core_client_channels_created"] = massage_qps_stats_helpers.counter(
     37                     core_stats, "client_channels_created")
     38             stats[
     39                 "core_client_subchannels_created"] = massage_qps_stats_helpers.counter(
     40                     core_stats, "client_subchannels_created")
     41             stats[
     42                 "core_server_channels_created"] = massage_qps_stats_helpers.counter(
     43                     core_stats, "server_channels_created")
     44             stats["core_syscall_poll"] = massage_qps_stats_helpers.counter(
     45                 core_stats, "syscall_poll")
     46             stats["core_syscall_wait"] = massage_qps_stats_helpers.counter(
     47                 core_stats, "syscall_wait")
     48             stats["core_pollset_kick"] = massage_qps_stats_helpers.counter(
     49                 core_stats, "pollset_kick")
     50             stats[
     51                 "core_pollset_kicked_without_poller"] = massage_qps_stats_helpers.counter(
     52                     core_stats, "pollset_kicked_without_poller")
     53             stats[
     54                 "core_pollset_kicked_again"] = massage_qps_stats_helpers.counter(
     55                     core_stats, "pollset_kicked_again")
     56             stats[
     57                 "core_pollset_kick_wakeup_fd"] = massage_qps_stats_helpers.counter(
     58                     core_stats, "pollset_kick_wakeup_fd")
     59             stats[
     60                 "core_pollset_kick_wakeup_cv"] = massage_qps_stats_helpers.counter(
     61                     core_stats, "pollset_kick_wakeup_cv")
     62             stats[
     63                 "core_pollset_kick_own_thread"] = massage_qps_stats_helpers.counter(
     64                     core_stats, "pollset_kick_own_thread")
     65             stats["core_syscall_epoll_ctl"] = massage_qps_stats_helpers.counter(
     66                 core_stats, "syscall_epoll_ctl")
     67             stats[
     68                 "core_pollset_fd_cache_hits"] = massage_qps_stats_helpers.counter(
     69                     core_stats, "pollset_fd_cache_hits")
     70             stats[
     71                 "core_histogram_slow_lookups"] = massage_qps_stats_helpers.counter(
     72                     core_stats, "histogram_slow_lookups")
     73             stats["core_syscall_write"] = massage_qps_stats_helpers.counter(
     74                 core_stats, "syscall_write")
     75             stats["core_syscall_read"] = massage_qps_stats_helpers.counter(
     76                 core_stats, "syscall_read")
     77             stats[
     78                 "core_tcp_backup_pollers_created"] = massage_qps_stats_helpers.counter(
     79                     core_stats, "tcp_backup_pollers_created")
     80             stats[
     81                 "core_tcp_backup_poller_polls"] = massage_qps_stats_helpers.counter(
     82                     core_stats, "tcp_backup_poller_polls")
     83             stats["core_http2_op_batches"] = massage_qps_stats_helpers.counter(
     84                 core_stats, "http2_op_batches")
     85             stats["core_http2_op_cancel"] = massage_qps_stats_helpers.counter(
     86                 core_stats, "http2_op_cancel")
     87             stats[
     88                 "core_http2_op_send_initial_metadata"] = massage_qps_stats_helpers.counter(
     89                     core_stats, "http2_op_send_initial_metadata")
     90             stats[
     91                 "core_http2_op_send_message"] = massage_qps_stats_helpers.counter(
     92                     core_stats, "http2_op_send_message")
     93             stats[
     94                 "core_http2_op_send_trailing_metadata"] = massage_qps_stats_helpers.counter(
     95                     core_stats, "http2_op_send_trailing_metadata")
     96             stats[
     97                 "core_http2_op_recv_initial_metadata"] = massage_qps_stats_helpers.counter(
     98                     core_stats, "http2_op_recv_initial_metadata")
     99             stats[
    100                 "core_http2_op_recv_message"] = massage_qps_stats_helpers.counter(
    101                     core_stats, "http2_op_recv_message")
    102             stats[
    103                 "core_http2_op_recv_trailing_metadata"] = massage_qps_stats_helpers.counter(
    104                     core_stats, "http2_op_recv_trailing_metadata")
    105             stats[
    106                 "core_http2_settings_writes"] = massage_qps_stats_helpers.counter(
    107                     core_stats, "http2_settings_writes")
    108             stats["core_http2_pings_sent"] = massage_qps_stats_helpers.counter(
    109                 core_stats, "http2_pings_sent")
    110             stats[
    111                 "core_http2_writes_begun"] = massage_qps_stats_helpers.counter(
    112                     core_stats, "http2_writes_begun")
    113             stats[
    114                 "core_http2_writes_offloaded"] = massage_qps_stats_helpers.counter(
    115                     core_stats, "http2_writes_offloaded")
    116             stats[
    117                 "core_http2_writes_continued"] = massage_qps_stats_helpers.counter(
    118                     core_stats, "http2_writes_continued")
    119             stats[
    120                 "core_http2_partial_writes"] = massage_qps_stats_helpers.counter(
    121                     core_stats, "http2_partial_writes")
    122             stats[
    123                 "core_http2_initiate_write_due_to_initial_write"] = massage_qps_stats_helpers.counter(
    124                     core_stats, "http2_initiate_write_due_to_initial_write")
    125             stats[
    126                 "core_http2_initiate_write_due_to_start_new_stream"] = massage_qps_stats_helpers.counter(
    127                     core_stats, "http2_initiate_write_due_to_start_new_stream")
    128             stats[
    129                 "core_http2_initiate_write_due_to_send_message"] = massage_qps_stats_helpers.counter(
    130                     core_stats, "http2_initiate_write_due_to_send_message")
    131             stats[
    132                 "core_http2_initiate_write_due_to_send_initial_metadata"] = massage_qps_stats_helpers.counter(
    133                     core_stats,
    134                     "http2_initiate_write_due_to_send_initial_metadata")
    135             stats[
    136                 "core_http2_initiate_write_due_to_send_trailing_metadata"] = massage_qps_stats_helpers.counter(
    137                     core_stats,
    138                     "http2_initiate_write_due_to_send_trailing_metadata")
    139             stats[
    140                 "core_http2_initiate_write_due_to_retry_send_ping"] = massage_qps_stats_helpers.counter(
    141                     core_stats, "http2_initiate_write_due_to_retry_send_ping")
    142             stats[
    143                 "core_http2_initiate_write_due_to_continue_pings"] = massage_qps_stats_helpers.counter(
    144                     core_stats, "http2_initiate_write_due_to_continue_pings")
    145             stats[
    146                 "core_http2_initiate_write_due_to_goaway_sent"] = massage_qps_stats_helpers.counter(
    147                     core_stats, "http2_initiate_write_due_to_goaway_sent")
    148             stats[
    149                 "core_http2_initiate_write_due_to_rst_stream"] = massage_qps_stats_helpers.counter(
    150                     core_stats, "http2_initiate_write_due_to_rst_stream")
    151             stats[
    152                 "core_http2_initiate_write_due_to_close_from_api"] = massage_qps_stats_helpers.counter(
    153                     core_stats, "http2_initiate_write_due_to_close_from_api")
    154             stats[
    155                 "core_http2_initiate_write_due_to_stream_flow_control"] = massage_qps_stats_helpers.counter(
    156                     core_stats,
    157                     "http2_initiate_write_due_to_stream_flow_control")
    158             stats[
    159                 "core_http2_initiate_write_due_to_transport_flow_control"] = massage_qps_stats_helpers.counter(
    160                     core_stats,
    161                     "http2_initiate_write_due_to_transport_flow_control")
    162             stats[
    163                 "core_http2_initiate_write_due_to_send_settings"] = massage_qps_stats_helpers.counter(
    164                     core_stats, "http2_initiate_write_due_to_send_settings")
    165             stats[
    166                 "core_http2_initiate_write_due_to_bdp_estimator_ping"] = massage_qps_stats_helpers.counter(
    167                     core_stats,
    168                     "http2_initiate_write_due_to_bdp_estimator_ping")
    169             stats[
    170                 "core_http2_initiate_write_due_to_flow_control_unstalled_by_setting"] = massage_qps_stats_helpers.counter(
    171                     core_stats,
    172                     "http2_initiate_write_due_to_flow_control_unstalled_by_setting"
    173                 )
    174             stats[
    175                 "core_http2_initiate_write_due_to_flow_control_unstalled_by_update"] = massage_qps_stats_helpers.counter(
    176                     core_stats,
    177                     "http2_initiate_write_due_to_flow_control_unstalled_by_update"
    178                 )
    179             stats[
    180                 "core_http2_initiate_write_due_to_application_ping"] = massage_qps_stats_helpers.counter(
    181                     core_stats, "http2_initiate_write_due_to_application_ping")
    182             stats[
    183                 "core_http2_initiate_write_due_to_keepalive_ping"] = massage_qps_stats_helpers.counter(
    184                     core_stats, "http2_initiate_write_due_to_keepalive_ping")
    185             stats[
    186                 "core_http2_initiate_write_due_to_transport_flow_control_unstalled"] = massage_qps_stats_helpers.counter(
    187                     core_stats,
    188                     "http2_initiate_write_due_to_transport_flow_control_unstalled"
    189                 )
    190             stats[
    191                 "core_http2_initiate_write_due_to_ping_response"] = massage_qps_stats_helpers.counter(
    192                     core_stats, "http2_initiate_write_due_to_ping_response")
    193             stats[
    194                 "core_http2_initiate_write_due_to_force_rst_stream"] = massage_qps_stats_helpers.counter(
    195                     core_stats, "http2_initiate_write_due_to_force_rst_stream")
    196             stats[
    197                 "core_http2_spurious_writes_begun"] = massage_qps_stats_helpers.counter(
    198                     core_stats, "http2_spurious_writes_begun")
    199             stats[
    200                 "core_hpack_recv_indexed"] = massage_qps_stats_helpers.counter(
    201                     core_stats, "hpack_recv_indexed")
    202             stats[
    203                 "core_hpack_recv_lithdr_incidx"] = massage_qps_stats_helpers.counter(
    204                     core_stats, "hpack_recv_lithdr_incidx")
    205             stats[
    206                 "core_hpack_recv_lithdr_incidx_v"] = massage_qps_stats_helpers.counter(
    207                     core_stats, "hpack_recv_lithdr_incidx_v")
    208             stats[
    209                 "core_hpack_recv_lithdr_notidx"] = massage_qps_stats_helpers.counter(
    210                     core_stats, "hpack_recv_lithdr_notidx")
    211             stats[
    212                 "core_hpack_recv_lithdr_notidx_v"] = massage_qps_stats_helpers.counter(
    213                     core_stats, "hpack_recv_lithdr_notidx_v")
    214             stats[
    215                 "core_hpack_recv_lithdr_nvridx"] = massage_qps_stats_helpers.counter(
    216                     core_stats, "hpack_recv_lithdr_nvridx")
    217             stats[
    218                 "core_hpack_recv_lithdr_nvridx_v"] = massage_qps_stats_helpers.counter(
    219                     core_stats, "hpack_recv_lithdr_nvridx_v")
    220             stats[
    221                 "core_hpack_recv_uncompressed"] = massage_qps_stats_helpers.counter(
    222                     core_stats, "hpack_recv_uncompressed")
    223             stats[
    224                 "core_hpack_recv_huffman"] = massage_qps_stats_helpers.counter(
    225                     core_stats, "hpack_recv_huffman")
    226             stats["core_hpack_recv_binary"] = massage_qps_stats_helpers.counter(
    227                 core_stats, "hpack_recv_binary")
    228             stats[
    229                 "core_hpack_recv_binary_base64"] = massage_qps_stats_helpers.counter(
    230                     core_stats, "hpack_recv_binary_base64")
    231             stats[
    232                 "core_hpack_send_indexed"] = massage_qps_stats_helpers.counter(
    233                     core_stats, "hpack_send_indexed")
    234             stats[
    235                 "core_hpack_send_lithdr_incidx"] = massage_qps_stats_helpers.counter(
    236                     core_stats, "hpack_send_lithdr_incidx")
    237             stats[
    238                 "core_hpack_send_lithdr_incidx_v"] = massage_qps_stats_helpers.counter(
    239                     core_stats, "hpack_send_lithdr_incidx_v")
    240             stats[
    241                 "core_hpack_send_lithdr_notidx"] = massage_qps_stats_helpers.counter(
    242                     core_stats, "hpack_send_lithdr_notidx")
    243             stats[
    244                 "core_hpack_send_lithdr_notidx_v"] = massage_qps_stats_helpers.counter(
    245                     core_stats, "hpack_send_lithdr_notidx_v")
    246             stats[
    247                 "core_hpack_send_lithdr_nvridx"] = massage_qps_stats_helpers.counter(
    248                     core_stats, "hpack_send_lithdr_nvridx")
    249             stats[
    250                 "core_hpack_send_lithdr_nvridx_v"] = massage_qps_stats_helpers.counter(
    251                     core_stats, "hpack_send_lithdr_nvridx_v")
    252             stats[
    253                 "core_hpack_send_uncompressed"] = massage_qps_stats_helpers.counter(
    254                     core_stats, "hpack_send_uncompressed")
    255             stats[
    256                 "core_hpack_send_huffman"] = massage_qps_stats_helpers.counter(
    257                     core_stats, "hpack_send_huffman")
    258             stats["core_hpack_send_binary"] = massage_qps_stats_helpers.counter(
    259                 core_stats, "hpack_send_binary")
    260             stats[
    261                 "core_hpack_send_binary_base64"] = massage_qps_stats_helpers.counter(
    262                     core_stats, "hpack_send_binary_base64")
    263             stats[
    264                 "core_combiner_locks_initiated"] = massage_qps_stats_helpers.counter(
    265                     core_stats, "combiner_locks_initiated")
    266             stats[
    267                 "core_combiner_locks_scheduled_items"] = massage_qps_stats_helpers.counter(
    268                     core_stats, "combiner_locks_scheduled_items")
    269             stats[
    270                 "core_combiner_locks_scheduled_final_items"] = massage_qps_stats_helpers.counter(
    271                     core_stats, "combiner_locks_scheduled_final_items")
    272             stats[
    273                 "core_combiner_locks_offloaded"] = massage_qps_stats_helpers.counter(
    274                     core_stats, "combiner_locks_offloaded")
    275             stats[
    276                 "core_call_combiner_locks_initiated"] = massage_qps_stats_helpers.counter(
    277                     core_stats, "call_combiner_locks_initiated")
    278             stats[
    279                 "core_call_combiner_locks_scheduled_items"] = massage_qps_stats_helpers.counter(
    280                     core_stats, "call_combiner_locks_scheduled_items")
    281             stats[
    282                 "core_call_combiner_set_notify_on_cancel"] = massage_qps_stats_helpers.counter(
    283                     core_stats, "call_combiner_set_notify_on_cancel")
    284             stats[
    285                 "core_call_combiner_cancelled"] = massage_qps_stats_helpers.counter(
    286                     core_stats, "call_combiner_cancelled")
    287             stats[
    288                 "core_executor_scheduled_short_items"] = massage_qps_stats_helpers.counter(
    289                     core_stats, "executor_scheduled_short_items")
    290             stats[
    291                 "core_executor_scheduled_long_items"] = massage_qps_stats_helpers.counter(
    292                     core_stats, "executor_scheduled_long_items")
    293             stats[
    294                 "core_executor_scheduled_to_self"] = massage_qps_stats_helpers.counter(
    295                     core_stats, "executor_scheduled_to_self")
    296             stats[
    297                 "core_executor_wakeup_initiated"] = massage_qps_stats_helpers.counter(
    298                     core_stats, "executor_wakeup_initiated")
    299             stats[
    300                 "core_executor_queue_drained"] = massage_qps_stats_helpers.counter(
    301                     core_stats, "executor_queue_drained")
    302             stats[
    303                 "core_executor_push_retries"] = massage_qps_stats_helpers.counter(
    304                     core_stats, "executor_push_retries")
    305             stats[
    306                 "core_server_requested_calls"] = massage_qps_stats_helpers.counter(
    307                     core_stats, "server_requested_calls")
    308             stats[
    309                 "core_server_slowpath_requests_queued"] = massage_qps_stats_helpers.counter(
    310                     core_stats, "server_slowpath_requests_queued")
    311             stats[
    312                 "core_cq_ev_queue_trylock_failures"] = massage_qps_stats_helpers.counter(
    313                     core_stats, "cq_ev_queue_trylock_failures")
    314             stats[
    315                 "core_cq_ev_queue_trylock_successes"] = massage_qps_stats_helpers.counter(
    316                     core_stats, "cq_ev_queue_trylock_successes")
    317             stats[
    318                 "core_cq_ev_queue_transient_pop_failures"] = massage_qps_stats_helpers.counter(
    319                     core_stats, "cq_ev_queue_transient_pop_failures")
    320             h = massage_qps_stats_helpers.histogram(core_stats,
    321                                                     "call_initial_size")
    322             stats["core_call_initial_size"] = ",".join(
    323                 "%f" % x for x in h.buckets)
    324             stats["core_call_initial_size_bkts"] = ",".join(
    325                 "%f" % x for x in h.boundaries)
    326             stats[
    327                 "core_call_initial_size_50p"] = massage_qps_stats_helpers.percentile(
    328                     h.buckets, 50, h.boundaries)
    329             stats[
    330                 "core_call_initial_size_95p"] = massage_qps_stats_helpers.percentile(
    331                     h.buckets, 95, h.boundaries)
    332             stats[
    333                 "core_call_initial_size_99p"] = massage_qps_stats_helpers.percentile(
    334                     h.buckets, 99, h.boundaries)
    335             h = massage_qps_stats_helpers.histogram(core_stats,
    336                                                     "poll_events_returned")
    337             stats["core_poll_events_returned"] = ",".join(
    338                 "%f" % x for x in h.buckets)
    339             stats["core_poll_events_returned_bkts"] = ",".join(
    340                 "%f" % x for x in h.boundaries)
    341             stats[
    342                 "core_poll_events_returned_50p"] = massage_qps_stats_helpers.percentile(
    343                     h.buckets, 50, h.boundaries)
    344             stats[
    345                 "core_poll_events_returned_95p"] = massage_qps_stats_helpers.percentile(
    346                     h.buckets, 95, h.boundaries)
    347             stats[
    348                 "core_poll_events_returned_99p"] = massage_qps_stats_helpers.percentile(
    349                     h.buckets, 99, h.boundaries)
    350             h = massage_qps_stats_helpers.histogram(core_stats,
    351                                                     "tcp_write_size")
    352             stats["core_tcp_write_size"] = ",".join("%f" % x for x in h.buckets)
    353             stats["core_tcp_write_size_bkts"] = ",".join(
    354                 "%f" % x for x in h.boundaries)
    355             stats[
    356                 "core_tcp_write_size_50p"] = massage_qps_stats_helpers.percentile(
    357                     h.buckets, 50, h.boundaries)
    358             stats[
    359                 "core_tcp_write_size_95p"] = massage_qps_stats_helpers.percentile(
    360                     h.buckets, 95, h.boundaries)
    361             stats[
    362                 "core_tcp_write_size_99p"] = massage_qps_stats_helpers.percentile(
    363                     h.buckets, 99, h.boundaries)
    364             h = massage_qps_stats_helpers.histogram(core_stats,
    365                                                     "tcp_write_iov_size")
    366             stats["core_tcp_write_iov_size"] = ",".join(
    367                 "%f" % x for x in h.buckets)
    368             stats["core_tcp_write_iov_size_bkts"] = ",".join(
    369                 "%f" % x for x in h.boundaries)
    370             stats[
    371                 "core_tcp_write_iov_size_50p"] = massage_qps_stats_helpers.percentile(
    372                     h.buckets, 50, h.boundaries)
    373             stats[
    374                 "core_tcp_write_iov_size_95p"] = massage_qps_stats_helpers.percentile(
    375                     h.buckets, 95, h.boundaries)
    376             stats[
    377                 "core_tcp_write_iov_size_99p"] = massage_qps_stats_helpers.percentile(
    378                     h.buckets, 99, h.boundaries)
    379             h = massage_qps_stats_helpers.histogram(core_stats, "tcp_read_size")
    380             stats["core_tcp_read_size"] = ",".join("%f" % x for x in h.buckets)
    381             stats["core_tcp_read_size_bkts"] = ",".join(
    382                 "%f" % x for x in h.boundaries)
    383             stats[
    384                 "core_tcp_read_size_50p"] = massage_qps_stats_helpers.percentile(
    385                     h.buckets, 50, h.boundaries)
    386             stats[
    387                 "core_tcp_read_size_95p"] = massage_qps_stats_helpers.percentile(
    388                     h.buckets, 95, h.boundaries)
    389             stats[
    390                 "core_tcp_read_size_99p"] = massage_qps_stats_helpers.percentile(
    391                     h.buckets, 99, h.boundaries)
    392             h = massage_qps_stats_helpers.histogram(core_stats,
    393                                                     "tcp_read_offer")
    394             stats["core_tcp_read_offer"] = ",".join("%f" % x for x in h.buckets)
    395             stats["core_tcp_read_offer_bkts"] = ",".join(
    396                 "%f" % x for x in h.boundaries)
    397             stats[
    398                 "core_tcp_read_offer_50p"] = massage_qps_stats_helpers.percentile(
    399                     h.buckets, 50, h.boundaries)
    400             stats[
    401                 "core_tcp_read_offer_95p"] = massage_qps_stats_helpers.percentile(
    402                     h.buckets, 95, h.boundaries)
    403             stats[
    404                 "core_tcp_read_offer_99p"] = massage_qps_stats_helpers.percentile(
    405                     h.buckets, 99, h.boundaries)
    406             h = massage_qps_stats_helpers.histogram(core_stats,
    407                                                     "tcp_read_offer_iov_size")
    408             stats["core_tcp_read_offer_iov_size"] = ",".join(
    409                 "%f" % x for x in h.buckets)
    410             stats["core_tcp_read_offer_iov_size_bkts"] = ",".join(
    411                 "%f" % x for x in h.boundaries)
    412             stats[
    413                 "core_tcp_read_offer_iov_size_50p"] = massage_qps_stats_helpers.percentile(
    414                     h.buckets, 50, h.boundaries)
    415             stats[
    416                 "core_tcp_read_offer_iov_size_95p"] = massage_qps_stats_helpers.percentile(
    417                     h.buckets, 95, h.boundaries)
    418             stats[
    419                 "core_tcp_read_offer_iov_size_99p"] = massage_qps_stats_helpers.percentile(
    420                     h.buckets, 99, h.boundaries)
    421             h = massage_qps_stats_helpers.histogram(core_stats,
    422                                                     "http2_send_message_size")
    423             stats["core_http2_send_message_size"] = ",".join(
    424                 "%f" % x for x in h.buckets)
    425             stats["core_http2_send_message_size_bkts"] = ",".join(
    426                 "%f" % x for x in h.boundaries)
    427             stats[
    428                 "core_http2_send_message_size_50p"] = massage_qps_stats_helpers.percentile(
    429                     h.buckets, 50, h.boundaries)
    430             stats[
    431                 "core_http2_send_message_size_95p"] = massage_qps_stats_helpers.percentile(
    432                     h.buckets, 95, h.boundaries)
    433             stats[
    434                 "core_http2_send_message_size_99p"] = massage_qps_stats_helpers.percentile(
    435                     h.buckets, 99, h.boundaries)
    436             h = massage_qps_stats_helpers.histogram(
    437                 core_stats, "http2_send_initial_metadata_per_write")
    438             stats["core_http2_send_initial_metadata_per_write"] = ",".join(
    439                 "%f" % x for x in h.buckets)
    440             stats["core_http2_send_initial_metadata_per_write_bkts"] = ",".join(
    441                 "%f" % x for x in h.boundaries)
    442             stats[
    443                 "core_http2_send_initial_metadata_per_write_50p"] = massage_qps_stats_helpers.percentile(
    444                     h.buckets, 50, h.boundaries)
    445             stats[
    446                 "core_http2_send_initial_metadata_per_write_95p"] = massage_qps_stats_helpers.percentile(
    447                     h.buckets, 95, h.boundaries)
    448             stats[
    449                 "core_http2_send_initial_metadata_per_write_99p"] = massage_qps_stats_helpers.percentile(
    450                     h.buckets, 99, h.boundaries)
    451             h = massage_qps_stats_helpers.histogram(
    452                 core_stats, "http2_send_message_per_write")
    453             stats["core_http2_send_message_per_write"] = ",".join(
    454                 "%f" % x for x in h.buckets)
    455             stats["core_http2_send_message_per_write_bkts"] = ",".join(
    456                 "%f" % x for x in h.boundaries)
    457             stats[
    458                 "core_http2_send_message_per_write_50p"] = massage_qps_stats_helpers.percentile(
    459                     h.buckets, 50, h.boundaries)
    460             stats[
    461                 "core_http2_send_message_per_write_95p"] = massage_qps_stats_helpers.percentile(
    462                     h.buckets, 95, h.boundaries)
    463             stats[
    464                 "core_http2_send_message_per_write_99p"] = massage_qps_stats_helpers.percentile(
    465                     h.buckets, 99, h.boundaries)
    466             h = massage_qps_stats_helpers.histogram(
    467                 core_stats, "http2_send_trailing_metadata_per_write")
    468             stats["core_http2_send_trailing_metadata_per_write"] = ",".join(
    469                 "%f" % x for x in h.buckets)
    470             stats[
    471                 "core_http2_send_trailing_metadata_per_write_bkts"] = ",".join(
    472                     "%f" % x for x in h.boundaries)
    473             stats[
    474                 "core_http2_send_trailing_metadata_per_write_50p"] = massage_qps_stats_helpers.percentile(
    475                     h.buckets, 50, h.boundaries)
    476             stats[
    477                 "core_http2_send_trailing_metadata_per_write_95p"] = massage_qps_stats_helpers.percentile(
    478                     h.buckets, 95, h.boundaries)
    479             stats[
    480                 "core_http2_send_trailing_metadata_per_write_99p"] = massage_qps_stats_helpers.percentile(
    481                     h.buckets, 99, h.boundaries)
    482             h = massage_qps_stats_helpers.histogram(
    483                 core_stats, "http2_send_flowctl_per_write")
    484             stats["core_http2_send_flowctl_per_write"] = ",".join(
    485                 "%f" % x for x in h.buckets)
    486             stats["core_http2_send_flowctl_per_write_bkts"] = ",".join(
    487                 "%f" % x for x in h.boundaries)
    488             stats[
    489                 "core_http2_send_flowctl_per_write_50p"] = massage_qps_stats_helpers.percentile(
    490                     h.buckets, 50, h.boundaries)
    491             stats[
    492                 "core_http2_send_flowctl_per_write_95p"] = massage_qps_stats_helpers.percentile(
    493                     h.buckets, 95, h.boundaries)
    494             stats[
    495                 "core_http2_send_flowctl_per_write_99p"] = massage_qps_stats_helpers.percentile(
    496                     h.buckets, 99, h.boundaries)
    497             h = massage_qps_stats_helpers.histogram(core_stats,
    498                                                     "server_cqs_checked")
    499             stats["core_server_cqs_checked"] = ",".join(
    500                 "%f" % x for x in h.buckets)
    501             stats["core_server_cqs_checked_bkts"] = ",".join(
    502                 "%f" % x for x in h.boundaries)
    503             stats[
    504                 "core_server_cqs_checked_50p"] = massage_qps_stats_helpers.percentile(
    505                     h.buckets, 50, h.boundaries)
    506             stats[
    507                 "core_server_cqs_checked_95p"] = massage_qps_stats_helpers.percentile(
    508                     h.buckets, 95, h.boundaries)
    509             stats[
    510                 "core_server_cqs_checked_99p"] = massage_qps_stats_helpers.percentile(
    511                     h.buckets, 99, h.boundaries)
    512