grpc 1.75.0.pre1 → 1.76.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +18 -5
  3. data/include/grpc/credentials.h +21 -5
  4. data/src/core/call/call_filters.cc +4 -4
  5. data/src/core/call/call_filters.h +36 -36
  6. data/src/core/call/call_spine.h +27 -27
  7. data/src/core/call/client_call.cc +6 -5
  8. data/src/core/call/filter_fusion.h +5 -5
  9. data/src/core/call/metadata_batch.h +3 -3
  10. data/src/core/call/security_context.cc +1 -1
  11. data/src/core/call/server_call.cc +4 -4
  12. data/src/core/call/server_call.h +1 -1
  13. data/src/core/channelz/channelz.cc +12 -18
  14. data/src/core/channelz/channelz.h +32 -16
  15. data/src/core/channelz/channelz_registry.h +11 -0
  16. data/src/core/channelz/property_list.cc +18 -0
  17. data/src/core/channelz/property_list.h +10 -1
  18. data/src/core/channelz/text_encode.cc +66 -0
  19. data/src/core/channelz/text_encode.h +29 -0
  20. data/src/core/channelz/v2tov1/convert.cc +11 -0
  21. data/src/core/channelz/v2tov1/legacy_api.cc +15 -8
  22. data/src/core/channelz/ztrace_collector.h +247 -86
  23. data/src/core/client_channel/backup_poller.cc +5 -6
  24. data/src/core/client_channel/client_channel.cc +20 -13
  25. data/src/core/client_channel/client_channel_filter.cc +53 -45
  26. data/src/core/client_channel/client_channel_filter.h +2 -2
  27. data/src/core/client_channel/client_channel_internal.h +3 -4
  28. data/src/core/client_channel/config_selector.h +3 -3
  29. data/src/core/client_channel/dynamic_filters.cc +3 -3
  30. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  31. data/src/core/client_channel/global_subchannel_pool.h +0 -27
  32. data/src/core/client_channel/load_balanced_call_destination.cc +7 -7
  33. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  34. data/src/core/client_channel/retry_filter.h +3 -3
  35. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  36. data/src/core/client_channel/subchannel.cc +8 -8
  37. data/src/core/client_channel/subchannel_stream_client.cc +4 -4
  38. data/src/core/config/config_vars.cc +30 -1
  39. data/src/core/config/config_vars.h +21 -0
  40. data/src/core/config/core_configuration.cc +5 -5
  41. data/src/core/config/core_configuration.h +7 -7
  42. data/src/core/config/load_config.cc +12 -0
  43. data/src/core/config/load_config.h +2 -0
  44. data/src/core/credentials/call/call_credentials.h +2 -2
  45. data/src/core/credentials/call/call_creds_util.cc +4 -3
  46. data/src/core/credentials/call/composite/composite_call_credentials.cc +4 -4
  47. data/src/core/credentials/call/external/aws_external_account_credentials.cc +3 -3
  48. data/src/core/credentials/call/external/external_account_credentials.cc +1 -1
  49. data/src/core/credentials/call/external/url_external_account_credentials.cc +1 -1
  50. data/src/core/credentials/call/iam/iam_credentials.cc +4 -4
  51. data/src/core/credentials/call/jwt/json_token.cc +3 -3
  52. data/src/core/credentials/call/jwt/jwt_credentials.cc +2 -2
  53. data/src/core/credentials/call/jwt/jwt_verifier.cc +14 -13
  54. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +20 -12
  55. data/src/core/credentials/call/plugin/plugin_credentials.cc +2 -2
  56. data/src/core/credentials/transport/alts/alts_credentials.cc +4 -4
  57. data/src/core/credentials/transport/alts/alts_security_connector.cc +14 -12
  58. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +22 -2
  59. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  60. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  61. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  62. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +5 -5
  63. data/src/core/credentials/transport/fake/fake_security_connector.cc +2 -2
  64. data/src/core/credentials/transport/google_default/google_default_credentials.cc +78 -28
  65. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  66. data/src/core/credentials/transport/local/local_security_connector.cc +8 -8
  67. data/src/core/credentials/transport/security_connector.cc +5 -5
  68. data/src/core/credentials/transport/ssl/ssl_credentials.cc +12 -12
  69. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  70. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +3 -3
  71. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  72. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +24 -24
  73. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +5 -5
  74. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +2 -2
  75. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +2 -2
  76. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  77. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +17 -17
  78. data/src/core/credentials/transport/tls/ssl_utils.cc +14 -9
  79. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -2
  80. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -11
  81. data/src/core/credentials/transport/transport_credentials.cc +2 -2
  82. data/src/core/credentials/transport/transport_credentials.h +2 -2
  83. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  84. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +2 -0
  85. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  86. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  87. data/src/core/ext/filters/http/message_compress/compression_filter.h +3 -3
  88. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  89. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  90. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +10 -9
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +10 -7
  92. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  93. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  94. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +96 -88
  95. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  96. data/src/core/ext/transport/chttp2/transport/flow_control.h +12 -7
  97. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +60 -0
  98. data/src/core/ext/transport/chttp2/transport/frame.cc +32 -10
  99. data/src/core/ext/transport/chttp2/transport/frame.h +16 -2
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  101. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -4
  102. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -2
  103. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -2
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/header_assembler.h +28 -12
  106. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -2
  107. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -2
  108. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  109. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +2 -2
  110. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +2 -2
  111. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -27
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  114. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +543 -366
  115. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +198 -277
  116. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +3 -0
  117. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +11 -0
  118. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +179 -0
  119. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +51 -23
  120. data/src/core/ext/transport/chttp2/transport/http2_transport.h +13 -6
  121. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +115 -71
  122. data/src/core/ext/transport/chttp2/transport/internal.h +6 -14
  123. data/src/core/ext/transport/chttp2/transport/message_assembler.h +7 -7
  124. data/src/core/ext/transport/chttp2/transport/parsing.cc +17 -15
  125. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  126. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +62 -26
  127. data/src/core/ext/transport/chttp2/transport/ping_promise.h +58 -22
  128. data/src/core/ext/transport/chttp2/transport/stream.h +207 -0
  129. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +328 -187
  130. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +7 -7
  131. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  132. data/src/core/ext/transport/chttp2/transport/transport_common.h +52 -0
  133. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  134. data/src/core/ext/transport/chttp2/transport/writable_streams.h +181 -79
  135. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  136. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  137. data/src/core/ext/transport/inproc/inproc_transport.cc +1 -1
  138. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +3 -3
  139. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  140. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  141. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  142. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  143. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  144. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  145. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  146. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  147. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  148. data/src/core/filter/auth/server_auth_filter.cc +2 -2
  149. data/src/core/handshaker/handshaker.cc +3 -3
  150. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +2 -2
  151. data/src/core/handshaker/security/legacy_secure_endpoint.cc +2 -2
  152. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +31 -8
  153. data/src/core/handshaker/security/secure_endpoint.cc +16 -6
  154. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  155. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -2
  156. data/src/core/lib/channel/channel_stack.cc +8 -5
  157. data/src/core/lib/channel/channel_stack.h +3 -0
  158. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -0
  159. data/src/core/lib/channel/connected_channel.cc +2 -2
  160. data/src/core/lib/channel/promise_based_filter.cc +69 -64
  161. data/src/core/lib/channel/promise_based_filter.h +16 -15
  162. data/src/core/lib/compression/compression_internal.cc +2 -2
  163. data/src/core/lib/compression/message_compress.cc +7 -7
  164. data/src/core/lib/event_engine/ares_resolver.cc +22 -20
  165. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +2 -2
  166. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  167. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +2 -2
  168. data/src/core/lib/event_engine/extensions/channelz.h +2 -2
  169. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  170. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +8 -8
  171. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +10 -10
  172. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +2 -2
  173. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +23 -22
  174. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +11 -11
  175. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +168 -170
  176. data/src/core/lib/event_engine/posix_engine/posix_engine.h +33 -54
  177. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -3
  178. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +5 -5
  179. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  180. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  181. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +3 -3
  182. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  183. data/src/core/lib/event_engine/shim.cc +8 -11
  184. data/src/core/lib/event_engine/shim.h +2 -1
  185. data/src/core/lib/event_engine/slice.cc +2 -2
  186. data/src/core/lib/event_engine/tcp_socket_utils.cc +11 -11
  187. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +7 -7
  188. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +31 -31
  189. data/src/core/lib/event_engine/windows/iocp.cc +10 -10
  190. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  191. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -11
  192. data/src/core/lib/event_engine/windows/windows_engine.cc +16 -14
  193. data/src/core/lib/event_engine/windows/windows_listener.cc +7 -7
  194. data/src/core/lib/experiments/experiments.cc +105 -18
  195. data/src/core/lib/experiments/experiments.h +43 -11
  196. data/src/core/lib/iomgr/call_combiner.cc +3 -3
  197. data/src/core/lib/iomgr/endpoint_cfstream.cc +6 -6
  198. data/src/core/lib/iomgr/endpoint_pair_posix.cc +5 -5
  199. data/src/core/lib/iomgr/endpoint_pair_windows.cc +15 -14
  200. data/src/core/lib/iomgr/ev_epoll1_linux.cc +15 -15
  201. data/src/core/lib/iomgr/ev_poll_posix.cc +11 -11
  202. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -4
  203. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  204. data/src/core/lib/iomgr/iocp_windows.cc +8 -8
  205. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  206. data/src/core/lib/iomgr/lockfree_event.cc +2 -2
  207. data/src/core/lib/iomgr/polling_entity.cc +3 -3
  208. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  209. data/src/core/lib/iomgr/socket_windows.cc +4 -4
  210. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -4
  211. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  212. data/src/core/lib/iomgr/tcp_posix.cc +42 -42
  213. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  214. data/src/core/lib/iomgr/tcp_server.h +7 -0
  215. data/src/core/lib/iomgr/tcp_server_posix.cc +47 -27
  216. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  217. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -5
  218. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  219. data/src/core/lib/iomgr/tcp_server_windows.cc +68 -29
  220. data/src/core/lib/iomgr/tcp_windows.cc +7 -7
  221. data/src/core/lib/iomgr/timer_generic.cc +2 -2
  222. data/src/core/lib/iomgr/timer_manager.cc +2 -2
  223. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  224. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  225. data/src/core/lib/promise/activity.cc +2 -2
  226. data/src/core/lib/promise/activity.h +6 -6
  227. data/src/core/lib/promise/context.h +2 -2
  228. data/src/core/lib/promise/detail/join_state.h +9 -9
  229. data/src/core/lib/promise/detail/seq_state.h +13 -13
  230. data/src/core/lib/promise/detail/status.h +2 -2
  231. data/src/core/lib/promise/for_each.h +5 -5
  232. data/src/core/lib/promise/interceptor_list.h +2 -2
  233. data/src/core/lib/promise/latch.h +7 -7
  234. data/src/core/lib/promise/mpsc.cc +26 -26
  235. data/src/core/lib/promise/mpsc.h +2 -2
  236. data/src/core/lib/promise/observable.h +4 -4
  237. data/src/core/lib/promise/party.cc +32 -25
  238. data/src/core/lib/promise/party.h +16 -19
  239. data/src/core/lib/promise/pipe.h +15 -15
  240. data/src/core/lib/promise/poll.h +5 -4
  241. data/src/core/lib/promise/promise.h +0 -2
  242. data/src/core/lib/promise/sleep.cc +3 -1
  243. data/src/core/lib/promise/status_flag.h +7 -7
  244. data/src/core/lib/promise/try_join.h +2 -2
  245. data/src/core/lib/promise/try_seq.h +2 -2
  246. data/src/core/lib/resource_quota/arena.h +15 -2
  247. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  248. data/src/core/lib/resource_quota/memory_quota.cc +45 -24
  249. data/src/core/lib/resource_quota/memory_quota.h +48 -16
  250. data/src/core/lib/resource_quota/telemetry.h +54 -0
  251. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  252. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  253. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  254. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  255. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  256. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  257. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  258. data/src/core/lib/surface/call.cc +16 -14
  259. data/src/core/lib/surface/call.h +1 -1
  260. data/src/core/lib/surface/call_utils.cc +2 -2
  261. data/src/core/lib/surface/call_utils.h +2 -2
  262. data/src/core/lib/surface/channel.cc +4 -4
  263. data/src/core/lib/surface/channel_create.cc +10 -6
  264. data/src/core/lib/surface/channel_init.cc +80 -23
  265. data/src/core/lib/surface/channel_init.h +26 -11
  266. data/src/core/lib/surface/completion_queue.cc +17 -16
  267. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  268. data/src/core/lib/surface/connection_context.h +45 -2
  269. data/src/core/lib/surface/filter_stack_call.cc +12 -23
  270. data/src/core/lib/surface/filter_stack_call.h +3 -4
  271. data/src/core/lib/surface/legacy_channel.cc +7 -7
  272. data/src/core/lib/surface/validate_metadata.h +2 -2
  273. data/src/core/lib/surface/version.cc +2 -2
  274. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  275. data/src/core/lib/transport/bdp_estimator.h +3 -3
  276. data/src/core/lib/transport/promise_endpoint.cc +3 -3
  277. data/src/core/lib/transport/promise_endpoint.h +8 -8
  278. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  279. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  280. data/src/core/load_balancing/endpoint_list.cc +2 -2
  281. data/src/core/load_balancing/grpclb/grpclb.cc +24 -24
  282. data/src/core/load_balancing/health_check_client.cc +4 -4
  283. data/src/core/load_balancing/health_check_client_internal.h +2 -2
  284. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  285. data/src/core/load_balancing/oob_backend_metric.cc +4 -4
  286. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  287. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  288. data/src/core/load_balancing/pick_first/pick_first.cc +14 -14
  289. data/src/core/load_balancing/priority/priority.cc +23 -24
  290. data/src/core/load_balancing/ring_hash/ring_hash.cc +3 -3
  291. data/src/core/load_balancing/rls/rls.cc +13 -13
  292. data/src/core/load_balancing/round_robin/round_robin.cc +9 -9
  293. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  294. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +33 -26
  295. data/src/core/load_balancing/weighted_target/weighted_target.cc +5 -5
  296. data/src/core/load_balancing/xds/cds.cc +76 -32
  297. data/src/core/load_balancing/xds/xds_cluster_impl.cc +3 -3
  298. data/src/core/load_balancing/xds/xds_override_host.cc +4 -4
  299. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  300. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +33 -33
  301. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -10
  302. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -3
  303. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +2 -2
  304. data/src/core/resolver/endpoint_addresses.cc +3 -3
  305. data/src/core/resolver/endpoint_addresses.h +3 -0
  306. data/src/core/resolver/fake/fake_resolver.cc +2 -2
  307. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +41 -54
  308. data/src/core/resolver/polling_resolver.cc +3 -3
  309. data/src/core/resolver/resolver_registry.cc +5 -4
  310. data/src/core/resolver/xds/xds_dependency_manager.cc +5 -5
  311. data/src/core/resolver/xds/xds_resolver.cc +9 -9
  312. data/src/core/server/server.cc +38 -38
  313. data/src/core/server/server_call_tracer_filter.h +4 -4
  314. data/src/core/server/server_config_selector_filter.cc +2 -2
  315. data/src/core/server/xds_server_config_fetcher.cc +9 -8
  316. data/src/core/service_config/service_config_impl.h +2 -2
  317. data/src/core/telemetry/call_tracer.cc +39 -49
  318. data/src/core/telemetry/call_tracer.h +199 -22
  319. data/src/core/telemetry/histogram.h +205 -0
  320. data/src/core/telemetry/instrument.cc +719 -0
  321. data/src/core/telemetry/instrument.h +932 -0
  322. data/src/core/telemetry/metrics.cc +13 -5
  323. data/src/core/telemetry/metrics.h +3 -1
  324. data/src/core/telemetry/stats_data.cc +0 -19
  325. data/src/core/telemetry/stats_data.h +0 -19
  326. data/src/core/transport/auth_context.cc +2 -2
  327. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -45
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  329. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +39 -31
  331. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +3 -3
  332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +3 -3
  333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +7 -7
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  335. data/src/core/tsi/fake_transport_security.cc +4 -4
  336. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +4 -4
  337. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +9 -9
  338. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +3 -3
  339. data/src/core/tsi/ssl_transport_security.cc +26 -25
  340. data/src/core/tsi/ssl_transport_security_utils.cc +9 -9
  341. data/src/core/util/chunked_vector.h +4 -4
  342. data/src/core/util/event_log.cc +2 -2
  343. data/src/core/util/gcp_metadata_query.cc +2 -2
  344. data/src/core/util/grpc_check.cc +22 -0
  345. data/src/core/util/grpc_check.h +103 -0
  346. data/src/core/util/http_client/httpcli.cc +3 -3
  347. data/src/core/util/http_client/parser.cc +4 -4
  348. data/src/core/util/latent_see.h +7 -4
  349. data/src/core/util/lru_cache.h +4 -4
  350. data/src/core/util/memory_usage.h +16 -0
  351. data/src/core/util/posix/directory_reader.cc +3 -2
  352. data/src/core/util/posix/sync.cc +24 -24
  353. data/src/core/util/postmortem_emit.cc +52 -0
  354. data/src/core/util/postmortem_emit.h +30 -0
  355. data/src/core/util/ref_counted_ptr.h +5 -0
  356. data/src/core/util/trie_lookup.h +170 -0
  357. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  358. data/src/core/xds/grpc/xds_bootstrap_grpc.h +6 -1
  359. data/src/core/xds/grpc/xds_certificate_provider.cc +3 -3
  360. data/src/core/xds/grpc/xds_client_grpc.cc +34 -15
  361. data/src/core/xds/grpc/xds_client_grpc.h +4 -1
  362. data/src/core/xds/grpc/xds_cluster_parser.cc +2 -2
  363. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  364. data/src/core/xds/grpc/xds_endpoint_parser.cc +2 -2
  365. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  366. data/src/core/xds/grpc/xds_listener_parser.cc +3 -3
  367. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  368. data/src/core/xds/grpc/xds_matcher.h +432 -0
  369. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  370. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  371. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  372. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  373. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  374. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  375. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  376. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  377. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  378. data/src/core/xds/grpc/xds_route_config_parser.cc +6 -6
  379. data/src/core/xds/grpc/xds_routing.cc +3 -3
  380. data/src/core/xds/grpc/xds_transport_grpc.cc +10 -10
  381. data/src/core/xds/xds_client/lrs_client.cc +6 -6
  382. data/src/core/xds/xds_client/xds_client.cc +9 -9
  383. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  384. data/src/ruby/lib/grpc/version.rb +1 -1
  385. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  386. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  387. metadata +37 -2
@@ -41,12 +41,27 @@
41
41
 
42
42
  namespace grpc_core {
43
43
 
44
- // The interface hierarchy is as follows -
45
- // CallTracerAnnotationInterface
46
- // | |
47
- // ClientCallTracerInterface CallTracerInterface
48
- // | |
49
- // CallAttemptTracer ServerCallTracerInterface
44
+ // 🚨🚨🚨 REFACTORING IN PROGRESS 🚨🚨🚨
45
+ //
46
+ // There are significant changes in flight for this file.
47
+ // It's worth checking in with ctiller before making substantial changes.
48
+ //
49
+ // General theme: we're moving to a concrete set of CallTracer types, and
50
+ // thinning the interface down - the result will be more commonality between
51
+ // tracer implementations, and less indirect calls out to the tracers.
52
+
53
+ // Inheritance hierarchy for concrete types:
54
+ //
55
+ // CallSpan (wraps CallTracerAnnotationInterface)
56
+ // |
57
+ // +-- CallTracer (wraps CallTracerInterface)
58
+ // | |
59
+ // | +-- CallAttemptTracer
60
+ // | | (wraps ClientCallTracerInterface::CallAttemptTracer)
61
+ // | |
62
+ // | +-- ServerCallTracer (wraps ServerCallTracerInterface)
63
+ // |
64
+ // +-- ClientCallTracer (wraps ClientCallTracerInterface)
50
65
 
51
66
  // The base class for all tracer implementations.
52
67
  class CallTracerAnnotationInterface {
@@ -148,6 +163,7 @@ class ClientCallTracerInterface : public CallTracerAnnotationInterface {
148
163
  kXdsServiceName, // not public
149
164
  kXdsServiceNamespace, // not public
150
165
  kLocality,
166
+ kBackendService,
151
167
  kSize // should be last
152
168
  };
153
169
 
@@ -228,42 +244,203 @@ class ServerCallTracerFactory {
228
244
  static absl::string_view ChannelArgName();
229
245
  };
230
246
 
231
- // Convenience functions to add call tracers to a call context. Allows setting
247
+ // Concrete class for a call span.
248
+ // Wraps a CallTracerAnnotationInterface.
249
+ class CallSpan {
250
+ public:
251
+ explicit CallSpan(CallTracerAnnotationInterface* interface)
252
+ : interface_(interface) {}
253
+
254
+ void RecordAnnotation(absl::string_view annotation) {
255
+ interface_->RecordAnnotation(annotation);
256
+ }
257
+ void RecordAnnotation(
258
+ const CallTracerAnnotationInterface::Annotation& annotation) {
259
+ interface_->RecordAnnotation(annotation);
260
+ }
261
+ std::string TraceId() { return interface_->TraceId(); }
262
+ std::string SpanId() { return interface_->SpanId(); }
263
+ bool IsSampled() { return interface_->IsSampled(); }
264
+
265
+ CallTracerAnnotationInterface* span_impl() { return interface_; }
266
+
267
+ protected:
268
+ ~CallSpan() = default;
269
+
270
+ private:
271
+ #ifndef NDEBUG
272
+ virtual void VirtualMethodToEnsureDownCastBuildsInDebug() {}
273
+ #endif
274
+
275
+ CallTracerAnnotationInterface* interface_;
276
+ };
277
+
278
+ // Concrete class for a call tracer.
279
+ // Wraps a CallTracerInterface.
280
+ class CallTracer : public CallSpan {
281
+ public:
282
+ explicit CallTracer(CallTracerInterface* interface)
283
+ : CallSpan(interface), interface_(interface) {}
284
+
285
+ void RecordSendInitialMetadata(grpc_metadata_batch* send_initial_metadata) {
286
+ interface_->RecordSendInitialMetadata(send_initial_metadata);
287
+ }
288
+ void RecordSendTrailingMetadata(grpc_metadata_batch* send_trailing_metadata) {
289
+ interface_->RecordSendTrailingMetadata(send_trailing_metadata);
290
+ }
291
+ void RecordSendMessage(const Message& send_message) {
292
+ interface_->RecordSendMessage(send_message);
293
+ }
294
+ void RecordSendCompressedMessage(const Message& send_compressed_message) {
295
+ interface_->RecordSendCompressedMessage(send_compressed_message);
296
+ }
297
+ void RecordReceivedInitialMetadata(
298
+ grpc_metadata_batch* recv_initial_metadata) {
299
+ interface_->RecordReceivedInitialMetadata(recv_initial_metadata);
300
+ }
301
+ void RecordReceivedMessage(const Message& recv_message) {
302
+ interface_->RecordReceivedMessage(recv_message);
303
+ }
304
+ void RecordReceivedDecompressedMessage(
305
+ const Message& recv_decompressed_message) {
306
+ interface_->RecordReceivedDecompressedMessage(recv_decompressed_message);
307
+ }
308
+ void RecordCancel(grpc_error_handle cancel_error) {
309
+ interface_->RecordCancel(cancel_error);
310
+ }
311
+ void RecordIncomingBytes(
312
+ const CallTracerInterface::TransportByteSize& transport_byte_size) {
313
+ interface_->RecordIncomingBytes(transport_byte_size);
314
+ }
315
+ void RecordOutgoingBytes(
316
+ const CallTracerInterface::TransportByteSize& transport_byte_size) {
317
+ interface_->RecordOutgoingBytes(transport_byte_size);
318
+ }
319
+ std::shared_ptr<TcpCallTracer> StartNewTcpTrace() {
320
+ return interface_->StartNewTcpTrace();
321
+ }
322
+
323
+ protected:
324
+ ~CallTracer() = default;
325
+
326
+ private:
327
+ CallTracerInterface* interface_;
328
+ };
329
+
330
+ // Concrete class for a client call tracer.
331
+ // Wraps a ClientCallTracerInterface.
332
+ class ClientCallTracer final : public CallSpan {
333
+ public:
334
+ explicit ClientCallTracer(ClientCallTracerInterface* interface)
335
+ : CallSpan(interface), interface_(interface) {}
336
+
337
+ ClientCallTracerInterface::CallAttemptTracer* StartNewAttempt(
338
+ bool is_transparent_retry) {
339
+ return interface_->StartNewAttempt(is_transparent_retry);
340
+ }
341
+
342
+ private:
343
+ ClientCallTracerInterface* interface_;
344
+ };
345
+
346
+ // Concrete class for a client call attempt tracer.
347
+ // Wraps a ClientCallTracerInterface::CallAttemptTracer.
348
+ class CallAttemptTracer final : public CallTracer {
349
+ public:
350
+ explicit CallAttemptTracer(
351
+ ClientCallTracerInterface::CallAttemptTracer* interface)
352
+ : CallTracer(interface), interface_(interface) {}
353
+
354
+ void RecordReceivedTrailingMetadata(
355
+ absl::Status status, grpc_metadata_batch* recv_trailing_metadata,
356
+ const grpc_transport_stream_stats* transport_stream_stats) {
357
+ interface_->RecordReceivedTrailingMetadata(status, recv_trailing_metadata,
358
+ transport_stream_stats);
359
+ }
360
+ void RecordEnd() { interface_->RecordEnd(); }
361
+ void SetOptionalLabel(
362
+ ClientCallTracerInterface::CallAttemptTracer::OptionalLabelKey key,
363
+ RefCountedStringValue value) {
364
+ interface_->SetOptionalLabel(key, value);
365
+ }
366
+
367
+ private:
368
+ ClientCallTracerInterface::CallAttemptTracer* interface_;
369
+ };
370
+
371
+ // Concrete class for a server call tracer.
372
+ // Wraps a ServerCallTracerInterface.
373
+ class ServerCallTracer final : public CallTracer {
374
+ public:
375
+ explicit ServerCallTracer(ServerCallTracerInterface* interface)
376
+ : CallTracer(interface), interface_(interface) {}
377
+
378
+ void RecordReceivedTrailingMetadata(
379
+ grpc_metadata_batch* recv_trailing_metadata) {
380
+ interface_->RecordReceivedTrailingMetadata(recv_trailing_metadata);
381
+ }
382
+ void RecordEnd(const grpc_call_final_info* final_info) {
383
+ interface_->RecordEnd(final_info);
384
+ }
385
+
386
+ private:
387
+ ServerCallTracerInterface* interface_;
388
+ };
389
+
390
+ // Convenience functions to set call tracer on a call context. Allows setting
232
391
  // multiple call tracers to a single call. It is only valid to add client call
233
392
  // tracers before the client_channel filter sees the send_initial_metadata op.
234
- void AddClientCallTracerToContext(Arena* arena,
235
- ClientCallTracerInterface* tracer);
393
+ void SetClientCallTracer(Arena* arena,
394
+ absl::Span<ClientCallTracerInterface* const> tracer);
236
395
 
237
396
  // TODO(yashykt): We want server call tracers to be registered through the
238
397
  // ServerCallTracerFactory, which has yet to be made into a list.
239
- void AddServerCallTracerToContext(Arena* arena,
240
- ServerCallTracerInterface* tracer);
398
+ void SetServerCallTracer(Arena* arena,
399
+ absl::Span<ServerCallTracerInterface* const> tracer);
241
400
 
242
401
  template <>
243
- struct ArenaContextType<CallTracerInterface> {
244
- static void Destroy(CallTracerAnnotationInterface*) {}
402
+ struct ArenaContextType<CallTracer> {
403
+ static void Destroy(CallTracer*) {}
245
404
  };
246
405
 
247
406
  template <>
248
- struct ArenaContextType<CallTracerAnnotationInterface> {
249
- static void Destroy(CallTracerAnnotationInterface*) {}
407
+ struct ArenaContextType<CallSpan> {
408
+ static void Destroy(CallSpan*) {}
250
409
  };
251
410
 
252
411
  template <>
253
- struct ContextSubclass<ClientCallTracerInterface::CallAttemptTracer> {
254
- using Base = CallTracerInterface;
412
+ struct ContextSubclass<CallAttemptTracer> {
413
+ using Base = CallTracer;
255
414
  };
256
415
 
257
416
  template <>
258
- struct ContextSubclass<ServerCallTracerInterface> {
259
- using Base = CallTracerInterface;
417
+ struct ContextSubclass<ServerCallTracer> {
418
+ using Base = CallTracer;
260
419
  };
261
420
 
262
421
  template <>
263
- struct ContextSubclass<ClientCallTracerInterface> {
264
- using Base = CallTracerAnnotationInterface;
422
+ struct ContextSubclass<ClientCallTracer> {
423
+ using Base = CallSpan;
265
424
  };
266
425
 
426
+ inline ClientCallTracer* WrapClientCallTracer(
427
+ ClientCallTracerInterface* interface, Arena* arena) {
428
+ if (interface == nullptr) return nullptr;
429
+ return arena->ManagedNew<ClientCallTracer>(interface);
430
+ }
431
+
432
+ inline ServerCallTracer* WrapServerCallTracer(
433
+ ServerCallTracerInterface* interface, Arena* arena) {
434
+ if (interface == nullptr) return nullptr;
435
+ return arena->ManagedNew<ServerCallTracer>(interface);
436
+ }
437
+
438
+ inline CallAttemptTracer* WrapCallAttemptTracer(
439
+ ClientCallTracerInterface::CallAttemptTracer* interface, Arena* arena) {
440
+ if (interface == nullptr) return nullptr;
441
+ return arena->ManagedNew<CallAttemptTracer>(interface);
442
+ }
443
+
267
444
  } // namespace grpc_core
268
445
 
269
- #endif // GRPC_SRC_CORE_TELEMETRY_CALL_TRACER_H
446
+ #endif // GRPC_SRC_CORE_TELEMETRY_CALL_TRACER_H
@@ -0,0 +1,205 @@
1
+ // Copyright 2025 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
+ #ifndef GRPC_SRC_CORE_TELEMETRY_HISTOGRAM_H
16
+ #define GRPC_SRC_CORE_TELEMETRY_HISTOGRAM_H
17
+
18
+ #include <cmath>
19
+ #include <cstddef>
20
+ #include <cstdint>
21
+ #include <optional>
22
+ #include <vector>
23
+
24
+ #include "absl/log/log.h"
25
+ #include "absl/strings/str_join.h"
26
+ #include "absl/types/span.h"
27
+ #include "src/core/util/grpc_check.h"
28
+
29
+ namespace grpc_core {
30
+
31
+ // Bucket layout for a histogram.
32
+ //
33
+ // The bucket layout is a vector of bucket boundaries. The bucket with index i
34
+ // collects values in the half-open interval [bounds[i-1], bounds[i]).
35
+ //
36
+ // Bucket 0 includes all values less than bounds[0]. Similarly, bucket
37
+ // bounds.size() - 1 includes all values greater than bounds.back().
38
+ //
39
+ // The bucket layout must be sorted in ascending order.
40
+ using HistogramBuckets = absl::Span<const int64_t>;
41
+
42
+ // Returns the bucket index for the given value in the given bounds.
43
+ // The bounds must be sorted in ascending order.
44
+ // The bounds array holds the upper bound of the bucket with the given index.
45
+ inline int64_t BucketInBoundsFor(absl::Span<const int64_t> bounds,
46
+ int64_t value) {
47
+ GRPC_CHECK(!bounds.empty());
48
+ if (value < bounds[0]) return 0;
49
+ if (value > bounds.back()) return bounds.size() - 1;
50
+ // Find the first element in bounds strictly greater than value
51
+ auto it = std::upper_bound(bounds.begin(), bounds.end(), value);
52
+ if (it == bounds.end()) return bounds.size() - 1;
53
+ // The bucket index is the index of the element just before it.
54
+ return std::distance(bounds.begin(), it);
55
+ }
56
+
57
+ class LinearHistogramShape {
58
+ public:
59
+ LinearHistogramShape(int64_t min, int64_t max) : min_(min), max_(max) {}
60
+
61
+ size_t buckets() const { return max_ - min_ + 1; }
62
+ size_t BucketFor(int64_t value) const {
63
+ if (value < min_) return 0;
64
+ if (value > max_) return buckets() - 1;
65
+ return value - min_;
66
+ }
67
+
68
+ private:
69
+ int64_t min_;
70
+ int64_t max_;
71
+ };
72
+
73
+ class ExponentialHistogramShape {
74
+ public:
75
+ ExponentialHistogramShape(int64_t max, size_t buckets)
76
+ : max_(max), buckets_(buckets) {
77
+ first_non_trivial_ = -1;
78
+ GRPC_CHECK_GT(max, 0);
79
+ GRPC_CHECK_LT(buckets, 1000000000u);
80
+ if (max <= static_cast<int64_t>(buckets)) {
81
+ for (size_t i = 0; i < static_cast<size_t>(max); ++i) {
82
+ bounds_.push_back(i + 1);
83
+ }
84
+ first_non_trivial_ = max;
85
+ buckets_ = max;
86
+ return;
87
+ }
88
+ int64_t first_bucket = std::ceil(std::pow(max, 1.0 / (buckets_ + 1)));
89
+ if (first_bucket <= 1) first_bucket = 1;
90
+ if (first_bucket != 1) first_non_trivial_ = 0;
91
+ bounds_.push_back(first_bucket);
92
+ while (bounds_.size() < buckets) {
93
+ int64_t nextb;
94
+ int64_t prevb = bounds_.empty() ? 0 : bounds_.back();
95
+ if (bounds_.size() == buckets - 1) {
96
+ nextb = max;
97
+ } else {
98
+ double mul = std::pow(static_cast<double>(max) / prevb,
99
+ 1.0 / (buckets - bounds_.size()));
100
+ nextb = static_cast<long long>(std::ceil(bounds_.back() * mul));
101
+ }
102
+ if (nextb <= bounds_.back() + 1) {
103
+ nextb = bounds_.back() + 1;
104
+ } else if (first_non_trivial_ == -1) {
105
+ first_non_trivial_ = bounds_.size();
106
+ }
107
+ bounds_.push_back(nextb);
108
+ }
109
+ GRPC_CHECK_EQ(bounds_.size(), buckets_);
110
+ if (first_non_trivial_ == -1) {
111
+ first_non_trivial_ = max_;
112
+ offset_ = 0;
113
+ shift_ = 0;
114
+ return;
115
+ }
116
+ offset_ = DoubleToUint(first_non_trivial_);
117
+ for (shift_ = 63; shift_ > 0; --shift_) {
118
+ bool found_alias = false;
119
+ for (size_t i = first_non_trivial_ + 1; i < bounds_.size(); ++i) {
120
+ if ((DoubleToUint(bounds_[i]) - offset_) >> shift_ ==
121
+ (DoubleToUint(bounds_[i - 1]) - offset_) >> shift_) {
122
+ found_alias = true;
123
+ break;
124
+ }
125
+ }
126
+ if (!found_alias) {
127
+ break;
128
+ }
129
+ }
130
+ GRPC_CHECK_GE(shift_, 0u);
131
+ GRPC_CHECK_LT(shift_, 64u);
132
+ for (size_t i = 0; i <= (DoubleToUint(max_) - offset_) >> shift_; ++i) {
133
+ lookup_table_.push_back(
134
+ BucketInBoundsFor(bounds_, UintToDouble((i << shift_) + offset_)));
135
+ }
136
+ }
137
+
138
+ ExponentialHistogramShape(const ExponentialHistogramShape&) = delete;
139
+ ExponentialHistogramShape& operator=(const ExponentialHistogramShape&) =
140
+ delete;
141
+ ExponentialHistogramShape(ExponentialHistogramShape&&) = default;
142
+ ExponentialHistogramShape& operator=(ExponentialHistogramShape&&) = default;
143
+
144
+ size_t buckets() const { return buckets_; }
145
+ size_t BucketFor(int64_t value) const {
146
+ if (value >= max_) return buckets_ - 1;
147
+ if (value < first_non_trivial_) {
148
+ if (value < 0) return 0;
149
+ return value;
150
+ }
151
+ auto index = (DoubleToUint(value) - offset_) >> shift_;
152
+ size_t bucket = lookup_table_[index];
153
+ GRPC_DCHECK_LT(bucket, buckets_) << absl::StrJoin(lookup_table_, ",");
154
+ GRPC_DCHECK_LT(bucket, bounds_.size()) << absl::StrJoin(bounds_, ",");
155
+ while (bucket < bounds_.size() - 1 && value >= bounds_[bucket]) {
156
+ ++bucket;
157
+ }
158
+ while (bucket > 0 && value < bounds_[bucket - 1]) {
159
+ --bucket;
160
+ }
161
+ GRPC_DCHECK_LT(value, bounds_[bucket]);
162
+ return bucket;
163
+ }
164
+
165
+ HistogramBuckets bounds() const { return bounds_; }
166
+ absl::Span<const size_t> lookup_table() const { return lookup_table_; }
167
+
168
+ private:
169
+ union DblUint {
170
+ double dbl;
171
+ uint64_t uint;
172
+ };
173
+
174
+ static double UintToDouble(uint64_t x) {
175
+ union DblUint {
176
+ double dbl;
177
+ uint64_t uint;
178
+ };
179
+ DblUint val;
180
+ val.uint = x;
181
+ return val.dbl;
182
+ }
183
+
184
+ static uint64_t DoubleToUint(double x) {
185
+ union DblUint {
186
+ double dbl;
187
+ uint64_t uint;
188
+ };
189
+ DblUint val;
190
+ val.dbl = x;
191
+ return val.uint;
192
+ }
193
+
194
+ int64_t max_;
195
+ int64_t first_non_trivial_;
196
+ uint64_t offset_;
197
+ uint64_t shift_;
198
+ std::vector<size_t> lookup_table_;
199
+ std::vector<int64_t> bounds_;
200
+ size_t buckets_;
201
+ };
202
+
203
+ } // namespace grpc_core
204
+
205
+ #endif // GRPC_SRC_CORE_TELEMETRY_HISTOGRAM_H