grpc 1.75.0 → 1.78.1

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 (839) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +24 -5
  3. data/include/grpc/credentials.h +27 -6
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/event_engine/memory_request.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +5 -0
  7. data/include/grpc/support/metrics.h +7 -1
  8. data/src/core/call/call_filters.cc +5 -5
  9. data/src/core/call/call_filters.h +211 -37
  10. data/src/core/call/call_spine.cc +1 -1
  11. data/src/core/call/call_spine.h +54 -32
  12. data/src/core/call/channelz_context.h +30 -0
  13. data/src/core/call/client_call.cc +49 -10
  14. data/src/core/call/client_call.h +6 -3
  15. data/src/core/call/filter_fusion.h +9 -9
  16. data/src/core/call/interception_chain.h +7 -6
  17. data/src/core/call/metadata_batch.cc +49 -55
  18. data/src/core/call/metadata_batch.h +10 -9
  19. data/src/core/call/metadata_info.cc +1 -1
  20. data/src/core/call/parsed_metadata.h +2 -2
  21. data/src/core/call/request_buffer.cc +1 -1
  22. data/src/core/call/security_context.cc +2 -2
  23. data/src/core/call/security_context.h +1 -1
  24. data/src/core/call/server_call.cc +5 -5
  25. data/src/core/call/server_call.h +6 -4
  26. data/src/core/call/simple_slice_based_metadata.h +1 -1
  27. data/src/core/call/status_util.cc +1 -1
  28. data/src/core/channelz/channel_trace.cc +1 -1
  29. data/src/core/channelz/channel_trace.h +3 -3
  30. data/src/core/channelz/channelz.cc +25 -29
  31. data/src/core/channelz/channelz.h +73 -22
  32. data/src/core/channelz/channelz_registry.cc +2 -2
  33. data/src/core/channelz/channelz_registry.h +53 -2
  34. data/src/core/channelz/property_list.cc +18 -0
  35. data/src/core/channelz/property_list.h +15 -4
  36. data/src/core/channelz/text_encode.cc +66 -0
  37. data/src/core/channelz/text_encode.h +29 -0
  38. data/src/core/channelz/v2tov1/convert.cc +17 -6
  39. data/src/core/channelz/v2tov1/legacy_api.cc +18 -12
  40. data/src/core/channelz/v2tov1/property_list.cc +2 -1
  41. data/src/core/channelz/ztrace_collector.h +260 -87
  42. data/src/core/client_channel/backup_poller.cc +7 -8
  43. data/src/core/client_channel/buffered_call.cc +140 -0
  44. data/src/core/client_channel/buffered_call.h +104 -0
  45. data/src/core/client_channel/client_channel.cc +144 -84
  46. data/src/core/client_channel/client_channel.h +8 -11
  47. data/src/core/client_channel/client_channel_factory.h +1 -1
  48. data/src/core/client_channel/client_channel_filter.cc +424 -686
  49. data/src/core/client_channel/client_channel_filter.h +57 -150
  50. data/src/core/client_channel/client_channel_internal.h +8 -5
  51. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  52. data/src/core/client_channel/client_channel_service_config.h +12 -1
  53. data/src/core/client_channel/config_selector.h +5 -5
  54. data/src/core/client_channel/connector.h +2 -0
  55. data/src/core/client_channel/dynamic_filters.cc +5 -5
  56. data/src/core/client_channel/global_subchannel_pool.cc +0 -37
  57. data/src/core/client_channel/global_subchannel_pool.h +1 -28
  58. data/src/core/client_channel/lb_metadata.h +1 -1
  59. data/src/core/client_channel/load_balanced_call_destination.cc +10 -12
  60. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  61. data/src/core/client_channel/local_subchannel_pool.cc +4 -4
  62. data/src/core/client_channel/retry_filter.cc +2 -2
  63. data/src/core/client_channel/retry_filter.h +3 -3
  64. data/src/core/client_channel/retry_filter_legacy_call_data.cc +11 -12
  65. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  66. data/src/core/client_channel/retry_service_config.cc +3 -3
  67. data/src/core/client_channel/retry_service_config.h +1 -1
  68. data/src/core/client_channel/subchannel.cc +114 -25
  69. data/src/core/client_channel/subchannel.h +24 -8
  70. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  71. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  72. data/src/core/client_channel/subchannel_stream_client.cc +5 -5
  73. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  74. data/src/core/config/config_vars.cc +38 -3
  75. data/src/core/config/config_vars.h +26 -0
  76. data/src/core/config/core_configuration.cc +5 -5
  77. data/src/core/config/core_configuration.h +8 -8
  78. data/src/core/config/load_config.cc +13 -1
  79. data/src/core/config/load_config.h +2 -0
  80. data/src/core/credentials/call/call_credentials.h +4 -4
  81. data/src/core/credentials/call/call_creds_registry.h +1 -1
  82. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  83. data/src/core/credentials/call/call_creds_util.cc +7 -6
  84. data/src/core/credentials/call/composite/composite_call_credentials.cc +6 -6
  85. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  86. data/src/core/credentials/call/external/aws_external_account_credentials.cc +9 -9
  87. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  88. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  89. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  90. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  91. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  92. data/src/core/credentials/call/external/url_external_account_credentials.cc +7 -7
  93. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  94. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  95. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  96. data/src/core/credentials/call/iam/iam_credentials.cc +6 -6
  97. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  98. data/src/core/credentials/call/json_util.cc +1 -1
  99. data/src/core/credentials/call/jwt/json_token.cc +7 -7
  100. data/src/core/credentials/call/jwt/jwt_credentials.cc +5 -5
  101. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  102. data/src/core/credentials/call/jwt/jwt_verifier.cc +19 -18
  103. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  104. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  105. data/src/core/credentials/call/jwt_util.cc +3 -3
  106. data/src/core/credentials/call/jwt_util.h +1 -1
  107. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +49 -72
  108. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  109. data/src/core/credentials/call/plugin/plugin_credentials.cc +6 -6
  110. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  111. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  112. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  113. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -5
  114. data/src/core/credentials/transport/alts/alts_security_connector.cc +17 -15
  115. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  116. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +23 -3
  117. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.cc +10 -1
  118. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +31 -0
  119. data/src/core/credentials/transport/alts/grpc_alts_credentials_server_options.cc +8 -3
  120. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  121. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  122. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +7 -7
  123. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  124. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  125. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  126. data/src/core/credentials/transport/fake/fake_security_connector.cc +7 -7
  127. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  128. data/src/core/credentials/transport/google_default/google_default_credentials.cc +83 -39
  129. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  130. data/src/core/credentials/transport/insecure/insecure_security_connector.cc +3 -3
  131. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  132. data/src/core/credentials/transport/local/local_security_connector.cc +13 -13
  133. data/src/core/credentials/transport/security_connector.cc +6 -6
  134. data/src/core/credentials/transport/security_connector.h +2 -2
  135. data/src/core/credentials/transport/ssl/ssl_credentials.cc +13 -13
  136. data/src/core/credentials/transport/ssl/ssl_credentials.h +2 -2
  137. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -8
  138. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  139. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +2 -2
  140. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  141. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -25
  142. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  143. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  144. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +8 -8
  145. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +5 -5
  146. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
  147. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +4 -4
  148. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +18 -18
  149. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  150. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  151. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  152. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  153. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  154. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -13
  155. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  156. data/src/core/credentials/transport/tls/tls_credentials.cc +3 -3
  157. data/src/core/credentials/transport/tls/tls_security_connector.cc +15 -15
  158. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  159. data/src/core/credentials/transport/transport_credentials.cc +3 -3
  160. data/src/core/credentials/transport/transport_credentials.h +4 -4
  161. data/src/core/credentials/transport/xds/xds_credentials.cc +5 -5
  162. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  163. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  164. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  165. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +6 -4
  166. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  167. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  168. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  169. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  170. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
  171. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  172. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  173. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  174. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  175. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  176. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  177. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  178. data/src/core/ext/filters/http/message_compress/compression_filter.cc +11 -11
  179. data/src/core/ext/filters/http/message_compress/compression_filter.h +24 -5
  180. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  181. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  182. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  183. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  184. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  185. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  186. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  187. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  188. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +14 -14
  189. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  190. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  191. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -2
  192. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +58 -44
  193. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  194. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +25 -24
  195. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  196. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +6 -6
  197. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +6 -6
  198. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +306 -148
  199. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  200. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -7
  201. data/src/core/ext/transport/chttp2/transport/flow_control.h +223 -83
  202. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +105 -0
  203. data/src/core/ext/transport/chttp2/transport/frame.cc +175 -27
  204. data/src/core/ext/transport/chttp2/transport/frame.h +58 -10
  205. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  206. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  207. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +5 -5
  208. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +6 -6
  209. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  210. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  212. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +6 -6
  213. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  214. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  215. data/src/core/ext/transport/chttp2/transport/header_assembler.h +194 -54
  216. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
  217. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -6
  218. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +8 -8
  219. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +3 -3
  220. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +5 -5
  221. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +34 -34
  222. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -7
  223. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +8 -8
  224. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  225. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1475 -632
  226. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +384 -373
  227. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  228. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  229. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -3
  230. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -5
  231. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +417 -0
  232. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  233. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +337 -30
  234. data/src/core/ext/transport/chttp2/transport/http2_transport.h +196 -21
  235. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +172 -72
  236. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  237. data/src/core/ext/transport/chttp2/transport/internal.h +31 -19
  238. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  239. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  240. data/src/core/ext/transport/chttp2/transport/message_assembler.h +30 -21
  241. data/src/core/ext/transport/chttp2/transport/parsing.cc +25 -23
  242. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +2 -2
  243. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  244. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +70 -28
  245. data/src/core/ext/transport/chttp2/transport/ping_promise.h +63 -23
  246. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  247. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  248. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  249. data/src/core/ext/transport/chttp2/transport/stream.h +287 -0
  250. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +476 -208
  251. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +8 -8
  252. data/src/core/ext/transport/chttp2/transport/transport_common.cc +17 -1
  253. data/src/core/ext/transport/chttp2/transport/transport_common.h +57 -0
  254. data/src/core/ext/transport/chttp2/transport/varint.h +2 -2
  255. data/src/core/ext/transport/chttp2/transport/writable_streams.h +202 -84
  256. data/src/core/ext/transport/chttp2/transport/write_size_policy.cc +2 -2
  257. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
  258. data/src/core/ext/transport/inproc/inproc_transport.cc +9 -3
  259. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +11 -8
  260. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb.h +740 -0
  261. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.c +218 -0
  262. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/service.upb_minitable.h +46 -0
  263. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +87 -55
  264. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +23 -21
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.c +80 -0
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/channelz.upbdefs.h +47 -0
  267. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.c +129 -0
  268. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/service.upbdefs.h +72 -0
  269. data/src/core/filter/auth/auth_filters.h +7 -1
  270. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  271. data/src/core/filter/auth/server_auth_filter.cc +5 -5
  272. data/src/core/filter/blackboard.h +2 -2
  273. data/src/core/filter/filter_args.h +40 -2
  274. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  275. data/src/core/handshaker/handshaker.cc +8 -8
  276. data/src/core/handshaker/handshaker.h +2 -2
  277. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  278. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +12 -12
  279. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  280. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  282. data/src/core/handshaker/proxy_mapper.h +1 -1
  283. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  284. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -6
  285. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +38 -15
  286. data/src/core/handshaker/security/secure_endpoint.cc +31 -11
  287. data/src/core/handshaker/security/security_handshaker.cc +11 -8
  288. data/src/core/handshaker/security/security_handshaker.h +1 -1
  289. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +6 -6
  290. data/src/core/lib/address_utils/parse_address.cc +5 -5
  291. data/src/core/lib/address_utils/parse_address.h +2 -2
  292. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  293. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  294. data/src/core/lib/channel/channel_args.cc +1 -1
  295. data/src/core/lib/channel/channel_args.h +2 -2
  296. data/src/core/lib/channel/channel_stack.cc +29 -25
  297. data/src/core/lib/channel/channel_stack.h +8 -3
  298. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  299. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  300. data/src/core/lib/channel/channel_stack_builder_impl.cc +8 -13
  301. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  302. data/src/core/lib/channel/connected_channel.cc +4 -4
  303. data/src/core/lib/channel/promise_based_filter.cc +132 -72
  304. data/src/core/lib/channel/promise_based_filter.h +39 -23
  305. data/src/core/lib/compression/compression_internal.cc +6 -6
  306. data/src/core/lib/compression/compression_internal.h +1 -1
  307. data/src/core/lib/compression/message_compress.cc +8 -8
  308. data/src/core/lib/debug/trace.cc +2 -5
  309. data/src/core/lib/debug/trace.h +10 -0
  310. data/src/core/lib/debug/trace_flags.cc +2 -2
  311. data/src/core/lib/debug/trace_flags.h +1 -1
  312. data/src/core/lib/event_engine/ares_resolver.cc +30 -28
  313. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  314. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -3
  315. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  316. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  317. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +4 -4
  318. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +3 -3
  319. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  320. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  321. data/src/core/lib/event_engine/event_engine.cc +1 -1
  322. data/src/core/lib/event_engine/extensions/channelz.h +3 -3
  323. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  324. data/src/core/lib/event_engine/extensions/supports_fd.h +5 -5
  325. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  326. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  327. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -12
  329. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  330. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -15
  331. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  332. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  333. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  334. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  335. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  336. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  337. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  338. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +3 -3
  339. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  340. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  341. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  342. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +28 -27
  343. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +17 -17
  344. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +175 -177
  345. data/src/core/lib/event_engine/posix_engine/posix_engine.h +40 -61
  346. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +11 -7
  347. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  348. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +9 -9
  349. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  350. data/src/core/lib/event_engine/posix_engine/posix_interface.h +2 -2
  351. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  352. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  353. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1 -1
  354. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  355. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  356. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -4
  357. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  358. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  359. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  360. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  361. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  362. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  363. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  364. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  365. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  366. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  367. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  368. data/src/core/lib/event_engine/resolved_address.cc +3 -3
  369. data/src/core/lib/event_engine/shim.cc +8 -11
  370. data/src/core/lib/event_engine/shim.h +2 -1
  371. data/src/core/lib/event_engine/slice.cc +2 -2
  372. data/src/core/lib/event_engine/tcp_socket_utils.cc +15 -15
  373. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  374. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  375. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +11 -11
  376. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  377. data/src/core/lib/event_engine/utils.cc +3 -3
  378. data/src/core/lib/event_engine/utils.h +1 -1
  379. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +32 -32
  380. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  381. data/src/core/lib/event_engine/windows/iocp.cc +11 -11
  382. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  383. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  384. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  385. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  386. data/src/core/lib/event_engine/windows/windows_endpoint.cc +16 -16
  387. data/src/core/lib/event_engine/windows/windows_engine.cc +20 -18
  388. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  389. data/src/core/lib/event_engine/windows/windows_listener.cc +10 -10
  390. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  391. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  392. data/src/core/lib/experiments/config.cc +4 -4
  393. data/src/core/lib/experiments/experiments.cc +255 -42
  394. data/src/core/lib/experiments/experiments.h +105 -21
  395. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  396. data/src/core/lib/iomgr/call_combiner.cc +4 -4
  397. data/src/core/lib/iomgr/call_combiner.h +2 -2
  398. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  399. data/src/core/lib/iomgr/closure.h +2 -2
  400. data/src/core/lib/iomgr/combiner.cc +2 -2
  401. data/src/core/lib/iomgr/endpoint.h +1 -1
  402. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -7
  403. data/src/core/lib/iomgr/endpoint_pair_posix.cc +6 -6
  404. data/src/core/lib/iomgr/endpoint_pair_windows.cc +16 -15
  405. data/src/core/lib/iomgr/error.cc +1 -1
  406. data/src/core/lib/iomgr/error.h +2 -2
  407. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  408. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  409. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  410. data/src/core/lib/iomgr/ev_poll_posix.cc +14 -14
  411. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  412. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  413. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  414. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +10 -9
  415. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +1 -1
  416. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  417. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  418. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  419. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  420. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  421. data/src/core/lib/iomgr/iocp_windows.cc +9 -9
  422. data/src/core/lib/iomgr/iomgr.cc +1 -1
  423. data/src/core/lib/iomgr/iomgr_windows.cc +3 -3
  424. data/src/core/lib/iomgr/lockfree_event.cc +3 -3
  425. data/src/core/lib/iomgr/polling_entity.cc +4 -4
  426. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  427. data/src/core/lib/iomgr/resolve_address.h +2 -2
  428. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  429. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  430. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  431. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -4
  432. data/src/core/lib/iomgr/socket_windows.cc +6 -6
  433. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  434. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -7
  435. data/src/core/lib/iomgr/tcp_client_windows.cc +4 -4
  436. data/src/core/lib/iomgr/tcp_posix.cc +47 -47
  437. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  438. data/src/core/lib/iomgr/tcp_server.h +7 -0
  439. data/src/core/lib/iomgr/tcp_server_posix.cc +62 -31
  440. data/src/core/lib/iomgr/tcp_server_utils_posix.h +4 -1
  441. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -7
  442. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +4 -4
  443. data/src/core/lib/iomgr/tcp_server_windows.cc +70 -31
  444. data/src/core/lib/iomgr/tcp_windows.cc +8 -8
  445. data/src/core/lib/iomgr/timer_generic.cc +5 -5
  446. data/src/core/lib/iomgr/timer_manager.cc +3 -3
  447. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  448. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  449. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +2 -2
  450. data/src/core/lib/iomgr/vsock.cc +1 -1
  451. data/src/core/lib/iomgr/vsock.h +1 -1
  452. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  453. data/src/core/lib/promise/activity.cc +3 -3
  454. data/src/core/lib/promise/activity.h +11 -10
  455. data/src/core/lib/promise/all_ok.h +3 -3
  456. data/src/core/lib/promise/arena_promise.h +47 -6
  457. data/src/core/lib/promise/context.h +3 -3
  458. data/src/core/lib/promise/detail/join_state.h +10 -10
  459. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  460. data/src/core/lib/promise/detail/promise_like.h +1 -1
  461. data/src/core/lib/promise/detail/seq_state.h +16 -16
  462. data/src/core/lib/promise/detail/status.h +2 -2
  463. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  464. data/src/core/lib/promise/for_each.h +8 -8
  465. data/src/core/lib/promise/if.h +1 -1
  466. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  467. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  468. data/src/core/lib/promise/interceptor_list.h +5 -5
  469. data/src/core/lib/promise/latch.h +9 -9
  470. data/src/core/lib/promise/loop.h +2 -2
  471. data/src/core/lib/promise/map.h +2 -2
  472. data/src/core/lib/promise/mpsc.cc +31 -30
  473. data/src/core/lib/promise/mpsc.h +2 -2
  474. data/src/core/lib/promise/observable.h +6 -6
  475. data/src/core/lib/promise/party.cc +43 -30
  476. data/src/core/lib/promise/party.h +27 -23
  477. data/src/core/lib/promise/pipe.h +31 -17
  478. data/src/core/lib/promise/poll.h +6 -5
  479. data/src/core/lib/promise/promise.h +2 -4
  480. data/src/core/lib/promise/sleep.cc +3 -1
  481. data/src/core/lib/promise/sleep.h +1 -1
  482. data/src/core/lib/promise/status_flag.h +8 -8
  483. data/src/core/lib/promise/try_join.h +5 -5
  484. data/src/core/lib/promise/try_seq.h +5 -5
  485. data/src/core/lib/promise/wait_set.h +2 -2
  486. data/src/core/lib/resource_quota/api.cc +1 -1
  487. data/src/core/lib/resource_quota/arena.cc +1 -1
  488. data/src/core/lib/resource_quota/arena.h +15 -2
  489. data/src/core/lib/resource_quota/connection_quota.cc +9 -7
  490. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  491. data/src/core/lib/resource_quota/memory_quota.cc +48 -27
  492. data/src/core/lib/resource_quota/memory_quota.h +56 -20
  493. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  494. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  495. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  496. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  497. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  498. data/src/core/lib/resource_quota/telemetry.h +55 -0
  499. data/src/core/lib/resource_quota/thread_quota.cc +2 -2
  500. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  501. data/src/core/lib/resource_tracker/resource_tracker.cc +33 -0
  502. data/src/core/lib/resource_tracker/resource_tracker.h +46 -0
  503. data/src/core/lib/security/authorization/audit_logging.cc +7 -7
  504. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  505. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  506. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  507. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  508. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +2 -2
  509. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  510. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  511. data/src/core/lib/security/authorization/matchers.cc +2 -2
  512. data/src/core/lib/security/authorization/stdout_logger.cc +3 -3
  513. data/src/core/lib/slice/percent_encoding.cc +1 -1
  514. data/src/core/lib/slice/slice.cc +1 -1
  515. data/src/core/lib/slice/slice.h +2 -2
  516. data/src/core/lib/slice/slice_buffer.cc +1 -1
  517. data/src/core/lib/slice/slice_internal.h +1 -1
  518. data/src/core/lib/surface/byte_buffer_reader.cc +2 -2
  519. data/src/core/lib/surface/call.cc +58 -28
  520. data/src/core/lib/surface/call.h +13 -6
  521. data/src/core/lib/surface/call_log_batch.cc +2 -2
  522. data/src/core/lib/surface/call_utils.cc +7 -7
  523. data/src/core/lib/surface/call_utils.h +85 -20
  524. data/src/core/lib/surface/channel.cc +6 -5
  525. data/src/core/lib/surface/channel.h +13 -3
  526. data/src/core/lib/surface/channel_create.cc +12 -8
  527. data/src/core/lib/surface/channel_create.h +1 -1
  528. data/src/core/lib/surface/channel_init.cc +84 -27
  529. data/src/core/lib/surface/channel_init.h +30 -13
  530. data/src/core/lib/surface/completion_queue.cc +21 -20
  531. data/src/core/lib/surface/completion_queue_factory.cc +7 -7
  532. data/src/core/lib/surface/connection_context.h +45 -2
  533. data/src/core/lib/surface/filter_stack_call.cc +25 -31
  534. data/src/core/lib/surface/filter_stack_call.h +6 -7
  535. data/src/core/lib/surface/init.cc +4 -4
  536. data/src/core/lib/surface/lame_client.cc +2 -2
  537. data/src/core/lib/surface/lame_client.h +3 -3
  538. data/src/core/lib/surface/legacy_channel.cc +10 -10
  539. data/src/core/lib/surface/legacy_channel.h +1 -1
  540. data/src/core/lib/surface/validate_metadata.cc +2 -2
  541. data/src/core/lib/surface/validate_metadata.h +3 -3
  542. data/src/core/lib/surface/version.cc +2 -2
  543. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  544. data/src/core/lib/transport/bdp_estimator.h +5 -5
  545. data/src/core/lib/transport/connectivity_state.cc +1 -1
  546. data/src/core/lib/transport/connectivity_state.h +2 -2
  547. data/src/core/lib/transport/error_utils.h +1 -1
  548. data/src/core/lib/transport/promise_endpoint.cc +4 -4
  549. data/src/core/lib/transport/promise_endpoint.h +11 -11
  550. data/src/core/lib/transport/timeout_encoding.cc +4 -4
  551. data/src/core/lib/transport/transport.cc +3 -3
  552. data/src/core/lib/transport/transport.h +62 -4
  553. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  554. data/src/core/lib/transport/transport_op_string.cc +2 -2
  555. data/src/core/load_balancing/address_filtering.cc +1 -1
  556. data/src/core/load_balancing/address_filtering.h +2 -2
  557. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  558. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  559. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  560. data/src/core/load_balancing/child_policy_handler.h +2 -2
  561. data/src/core/load_balancing/delegating_helper.h +2 -2
  562. data/src/core/load_balancing/endpoint_list.cc +6 -6
  563. data/src/core/load_balancing/endpoint_list.h +2 -2
  564. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  565. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  566. data/src/core/load_balancing/grpclb/grpclb.cc +37 -48
  567. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  568. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  569. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  570. data/src/core/load_balancing/health_check_client.cc +13 -9
  571. data/src/core/load_balancing/health_check_client_internal.h +5 -5
  572. data/src/core/load_balancing/lb_policy.h +11 -8
  573. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  574. data/src/core/load_balancing/lb_policy_registry.cc +3 -3
  575. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  576. data/src/core/load_balancing/oob_backend_metric.cc +11 -7
  577. data/src/core/load_balancing/oob_backend_metric_internal.h +4 -4
  578. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +9 -17
  579. data/src/core/load_balancing/pick_first/pick_first.cc +62 -32
  580. data/src/core/load_balancing/priority/priority.cc +29 -30
  581. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -11
  582. data/src/core/load_balancing/rls/rls.cc +23 -23
  583. data/src/core/load_balancing/round_robin/round_robin.cc +16 -16
  584. data/src/core/load_balancing/subchannel_interface.h +2 -2
  585. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +3 -3
  586. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +42 -41
  587. data/src/core/load_balancing/weighted_target/weighted_target.cc +14 -14
  588. data/src/core/load_balancing/xds/cds.cc +81 -37
  589. data/src/core/load_balancing/xds/xds_cluster_impl.cc +24 -41
  590. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  591. data/src/core/load_balancing/xds/xds_override_host.cc +14 -14
  592. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  593. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  594. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  595. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  596. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  597. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  598. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +35 -35
  599. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +16 -16
  600. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  601. data/src/core/resolver/dns/dns_resolver_plugin.cc +8 -5
  602. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +10 -10
  603. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  604. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  605. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  606. data/src/core/resolver/endpoint_addresses.cc +6 -6
  607. data/src/core/resolver/endpoint_addresses.h +4 -1
  608. data/src/core/resolver/fake/fake_resolver.cc +3 -3
  609. data/src/core/resolver/fake/fake_resolver.h +3 -3
  610. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +46 -59
  611. data/src/core/resolver/polling_resolver.cc +8 -8
  612. data/src/core/resolver/polling_resolver.h +1 -1
  613. data/src/core/resolver/resolver.h +2 -2
  614. data/src/core/resolver/resolver_factory.h +2 -2
  615. data/src/core/resolver/resolver_registry.cc +5 -4
  616. data/src/core/resolver/resolver_registry.h +1 -1
  617. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  618. data/src/core/resolver/xds/xds_config.cc +1 -1
  619. data/src/core/resolver/xds/xds_config.h +3 -3
  620. data/src/core/resolver/xds/xds_dependency_manager.cc +7 -7
  621. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  622. data/src/core/resolver/xds/xds_resolver.cc +25 -22
  623. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  624. data/src/core/server/add_port.cc +2 -2
  625. data/src/core/server/server.cc +47 -43
  626. data/src/core/server/server.h +8 -7
  627. data/src/core/server/server_call_tracer_filter.cc +1 -1
  628. data/src/core/server/server_call_tracer_filter.h +9 -5
  629. data/src/core/server/server_config_selector.h +2 -2
  630. data/src/core/server/server_config_selector_filter.cc +5 -5
  631. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  632. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  633. data/src/core/server/xds_server_config_fetcher.cc +19 -18
  634. data/src/core/service_config/service_config.h +1 -1
  635. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  636. data/src/core/service_config/service_config_impl.cc +3 -3
  637. data/src/core/service_config/service_config_impl.h +4 -4
  638. data/src/core/service_config/service_config_parser.h +1 -1
  639. data/src/core/telemetry/call_tracer.cc +39 -49
  640. data/src/core/telemetry/call_tracer.h +201 -24
  641. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  642. data/src/core/telemetry/histogram.h +205 -0
  643. data/src/core/telemetry/instrument.cc +999 -0
  644. data/src/core/telemetry/instrument.h +1105 -0
  645. data/src/core/telemetry/metrics.cc +15 -5
  646. data/src/core/telemetry/metrics.h +36 -5
  647. data/src/core/telemetry/stats.h +2 -2
  648. data/src/core/telemetry/stats_data.cc +1 -20
  649. data/src/core/telemetry/stats_data.h +2 -21
  650. data/src/core/transport/auth_context.cc +3 -3
  651. data/src/core/transport/auth_context.h +2 -1
  652. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  653. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  654. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  655. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  656. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +81 -48
  657. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -0
  658. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +3 -3
  659. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +46 -36
  660. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +4 -4
  661. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  662. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +4 -4
  663. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  664. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  665. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +16 -8
  666. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  667. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +18 -5
  668. data/src/core/tsi/fake_transport_security.cc +6 -5
  669. data/src/core/tsi/local_transport_security.cc +1 -1
  670. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
  671. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  672. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +10 -10
  673. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +4 -4
  674. data/src/core/tsi/ssl_transport_security.cc +30 -30
  675. data/src/core/tsi/ssl_transport_security.h +1 -1
  676. data/src/core/tsi/ssl_transport_security_utils.cc +10 -10
  677. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  678. data/src/core/tsi/transport_security_grpc.cc +8 -0
  679. data/src/core/tsi/transport_security_grpc.h +15 -0
  680. data/src/core/util/alloc.cc +1 -1
  681. data/src/core/util/backoff.h +1 -1
  682. data/src/core/util/chunked_vector.h +4 -4
  683. data/src/core/util/crash.h +1 -1
  684. data/src/core/util/dual_ref_counted.h +2 -2
  685. data/src/core/util/event_log.cc +2 -2
  686. data/src/core/util/event_log.h +3 -3
  687. data/src/core/util/gcp_metadata_query.cc +7 -7
  688. data/src/core/util/gcp_metadata_query.h +2 -2
  689. data/src/core/util/glob.cc +2 -0
  690. data/src/core/util/grpc_check.cc +24 -0
  691. data/src/core/util/grpc_check.h +103 -0
  692. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  693. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  694. data/src/core/util/http_client/format_request.cc +1 -1
  695. data/src/core/util/http_client/httpcli.cc +6 -6
  696. data/src/core/util/http_client/httpcli.h +4 -4
  697. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  698. data/src/core/util/http_client/parser.cc +4 -4
  699. data/src/core/util/json/json_channel_args.h +1 -1
  700. data/src/core/util/json/json_object_loader.h +6 -6
  701. data/src/core/util/json/json_reader.cc +2 -2
  702. data/src/core/util/json/json_reader.h +1 -1
  703. data/src/core/util/json/json_util.h +3 -3
  704. data/src/core/util/json/json_writer.cc +1 -1
  705. data/src/core/util/latent_see.cc +45 -24
  706. data/src/core/util/latent_see.h +199 -28
  707. data/src/core/util/linux/cpu.cc +1 -1
  708. data/src/core/util/load_file.cc +1 -1
  709. data/src/core/util/load_file.h +1 -1
  710. data/src/core/util/log.cc +3 -3
  711. data/src/core/util/lru_cache.h +4 -4
  712. data/src/core/util/matchers.h +1 -1
  713. data/src/core/util/memory_usage.h +17 -1
  714. data/src/core/util/mpscq.h +1 -1
  715. data/src/core/util/notification.h +1 -1
  716. data/src/core/util/posix/cpu.cc +1 -1
  717. data/src/core/util/posix/directory_reader.cc +3 -2
  718. data/src/core/util/posix/stat.cc +2 -2
  719. data/src/core/util/posix/sync.cc +24 -24
  720. data/src/core/util/posix/thd.cc +2 -2
  721. data/src/core/util/posix/tmpfile.cc +2 -2
  722. data/src/core/util/postmortem_emit.cc +52 -0
  723. data/src/core/util/postmortem_emit.h +30 -0
  724. data/src/core/util/ref_counted.h +2 -2
  725. data/src/core/util/ref_counted_ptr.h +6 -1
  726. data/src/core/util/ref_counted_string.h +1 -1
  727. data/src/core/util/single_set_ptr.h +3 -1
  728. data/src/core/util/status_helper.cc +8 -8
  729. data/src/core/util/status_helper.h +1 -1
  730. data/src/core/util/string.cc +2 -2
  731. data/src/core/util/sync_abseil.cc +1 -1
  732. data/src/core/util/table.h +1 -1
  733. data/src/core/util/time.cc +1 -1
  734. data/src/core/util/time_precise.cc +1 -1
  735. data/src/core/util/trie_lookup.h +170 -0
  736. data/src/core/util/unique_ptr_with_bitset.h +5 -5
  737. data/src/core/util/unique_type_name.h +1 -1
  738. data/src/core/util/upb_utils.h +6 -1
  739. data/src/core/util/validation_errors.cc +2 -2
  740. data/src/core/util/validation_errors.h +2 -3
  741. data/src/core/util/wait_for_single_owner.h +2 -2
  742. data/src/core/util/windows/directory_reader.cc +1 -1
  743. data/src/core/util/windows/stat.cc +2 -2
  744. data/src/core/util/windows/thd.cc +2 -2
  745. data/src/core/util/windows/time.cc +1 -1
  746. data/src/core/util/work_serializer.cc +3 -3
  747. data/src/core/util/work_serializer.h +2 -2
  748. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  749. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  750. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  751. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  752. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  753. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  754. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  755. data/src/core/xds/grpc/xds_bootstrap_grpc.h +8 -3
  756. data/src/core/xds/grpc/xds_certificate_provider.cc +4 -4
  757. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  758. data/src/core/xds/grpc/xds_client_grpc.cc +39 -20
  759. data/src/core/xds/grpc/xds_client_grpc.h +6 -3
  760. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  761. data/src/core/xds/grpc/xds_cluster.h +1 -1
  762. data/src/core/xds/grpc/xds_cluster_parser.cc +7 -7
  763. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  764. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +4 -4
  765. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  766. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  767. data/src/core/xds/grpc/xds_common_types.h +1 -1
  768. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  769. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  770. data/src/core/xds/grpc/xds_endpoint_parser.cc +7 -7
  771. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  772. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  773. data/src/core/xds/grpc/xds_health_status.h +1 -1
  774. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  775. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  776. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  777. data/src/core/xds/grpc/xds_http_filter_registry.cc +4 -3
  778. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  779. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  780. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  781. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  782. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  783. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  784. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  785. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  786. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  787. data/src/core/xds/grpc/xds_listener.cc +2 -2
  788. data/src/core/xds/grpc/xds_listener_parser.cc +9 -9
  789. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  790. data/src/core/xds/grpc/xds_matcher.cc +277 -0
  791. data/src/core/xds/grpc/xds_matcher.h +432 -0
  792. data/src/core/xds/grpc/xds_matcher_action.cc +47 -0
  793. data/src/core/xds/grpc/xds_matcher_action.h +48 -0
  794. data/src/core/xds/grpc/xds_matcher_context.cc +29 -0
  795. data/src/core/xds/grpc/xds_matcher_context.h +46 -0
  796. data/src/core/xds/grpc/xds_matcher_input.cc +79 -0
  797. data/src/core/xds/grpc/xds_matcher_input.h +105 -0
  798. data/src/core/xds/grpc/xds_matcher_parse.cc +356 -0
  799. data/src/core/xds/grpc/xds_matcher_parse.h +39 -0
  800. data/src/core/xds/grpc/xds_metadata.cc +4 -3
  801. data/src/core/xds/grpc/xds_metadata.h +3 -3
  802. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  803. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  804. data/src/core/xds/grpc/xds_route_config_parser.cc +14 -14
  805. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  806. data/src/core/xds/grpc/xds_routing.cc +6 -6
  807. data/src/core/xds/grpc/xds_routing.h +2 -2
  808. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  809. data/src/core/xds/grpc/xds_transport_grpc.cc +11 -11
  810. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  811. data/src/core/xds/xds_client/lrs_client.cc +9 -9
  812. data/src/core/xds/xds_client/lrs_client.h +4 -4
  813. data/src/core/xds/xds_client/xds_api.h +1 -1
  814. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  815. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  816. data/src/core/xds/xds_client/xds_client.cc +17 -17
  817. data/src/core/xds/xds_client/xds_client.h +5 -5
  818. data/src/core/xds/xds_client/xds_locality.h +2 -2
  819. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  820. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  821. data/src/core/xds/xds_client/xds_transport.h +2 -2
  822. data/src/ruby/ext/grpc/extconf.rb +14 -12
  823. data/src/ruby/ext/grpc/rb_call.c +0 -1
  824. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  825. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  826. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  827. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  828. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  829. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  830. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  831. data/src/ruby/lib/grpc/grpc.rb +7 -9
  832. data/src/ruby/lib/grpc/version.rb +1 -1
  833. data/src/ruby/spec/client_server_spec.rb +1 -1
  834. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  835. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  836. data/src/ruby/spec/spec_helper.rb +1 -1
  837. data/third_party/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  838. data/third_party/abseil-cpp/absl/container/node_hash_map.h +687 -0
  839. metadata +67 -8
@@ -0,0 +1,1105 @@
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
+ // This file defines the core interfaces for gRPC telemetry instrumentation.
16
+ //
17
+ // ## Concepts
18
+ //
19
+ // * **Instrument:** An individual metric being tracked. This can be a
20
+ // counter, gauge, histogram, etc. Each instrument has a unique name,
21
+ // description, and unit.
22
+ //
23
+ // * **Instrument Domain:** A collection of instruments that share a common
24
+ // set of labels. For example, all metrics related to a specific resource
25
+ // quota might belong to the same domain. Domains are defined by inheriting
26
+ // from `InstrumentDomain` and specifying the labels and backend type.
27
+ //
28
+ // * **Labels:** Key-value pairs that provide dimensions to metrics. Each
29
+ // unique combination of label values within a domain creates a separate
30
+ // instance of the instrumentation storage.
31
+ //
32
+ // * **Collection Scope:** Defines a scope for collecting metrics, identified
33
+ // by a set of labels of interest. Metric collection via
34
+ // `GetStorage`+`Increment` will be filtered according to these labels.
35
+ // Scopes can be hierarchical.
36
+ // On destruction, metrics collected in this scope are aggregated into the
37
+ // parent scopes.
38
+ //
39
+ // * **Storage:** An object holding the current values for all instruments
40
+ // within a domain, for a *specific combination* of filtered label values.
41
+ // Its lifetime is managed by one or more `CollectionScope`s. You obtain a
42
+ // `RefCountedPtr<Storage>` using `Domain::GetStorage(scope, ...)`, passing
43
+ // the current label values. If a child scope's filtered labels match its
44
+ // parent's filtered labels for a given metric, the parent's `Storage`
45
+ // instance is reused (shared).
46
+ //
47
+ // * **Backend:** Determines how the metric data is stored and aggregated
48
+ // within a Storage object. Examples include `LowContentionBackend` and
49
+ // `HighContentionBackend` for counters and histograms.
50
+ //
51
+ // ## Instrument Types
52
+ //
53
+ // * **Counter:** A metric that only increases. Uses `RegisterCounter` and
54
+ // `Storage::Increment`.
55
+ // * **Histogram:** Tracks the distribution of values. Uses
56
+ // `RegisterHistogram` and `Storage::Increment`.
57
+ // * **Gauges:** Metrics that can go up or down, representing a current value.
58
+ // * `DoubleGauge`: for double values.
59
+ // * `IntGauge`: for int64_t values.
60
+ // * `UintGauge`: for uint64_t values.
61
+ // Gauges are registered using `RegisterDoubleGauge`, `RegisterIntGauge`, or
62
+ // `RegisterUintGauge`.
63
+ //
64
+ // ## Gauge Providers
65
+ //
66
+ // Unlike counters and histograms, gauge values are not stored directly in the
67
+ // `Backend`. Instead, they are derived from the current state of an object.
68
+ // Objects that need to expose gauge metrics should implement the
69
+ // `GaugeProvider<Domain>` interface. They register/unregister via methods on
70
+ // the base class.
71
+ //
72
+ // Example:
73
+ // // In your class that has the gauge data:
74
+ // class MyProvider : public GaugeProvider<MyDomain> {
75
+ // public:
76
+ // MyProvider(InstrumentStorageRefPtr<MyDomain> storage)
77
+ // : GaugeProvider<MyDomain>(std::move(storage)) {
78
+ // ProviderConstructed();
79
+ // }
80
+ // ~MyProvider() override { ProviderDestructing(); }
81
+ //
82
+ // void PopulateGaugeData(GaugeSink<MyDomain>& sink) override {
83
+ // sink.Set(MyDomain::kMyGauge, GetCurrentValue());
84
+ // }
85
+ // };
86
+ //
87
+ // ## Declaring an Instrument Domain
88
+ //
89
+ // To define a new set of metrics, you create a class that inherits from
90
+ // `InstrumentDomain<YourDomainName>`. This class must define:
91
+ //
92
+ // 1. `using Backend = ...;`: Specifies the backend type (e.g.,
93
+ // `LowContentionBackend`, `HighContentionBackend`).
94
+ // 2. `static constexpr auto kLabels = std::tuple(...);`: Defines the names
95
+ // of the labels for this domain. The types of the labels are inferred
96
+ // from the arguments passed to `GetStorage()`.
97
+ //
98
+ // Instruments are registered as static members within the domain class using
99
+ // the `Register*` methods.
100
+ //
101
+ // Example:
102
+ // class MyDomain : public InstrumentDomain<MyDomain> {
103
+ // public:
104
+ // using Backend = LowContentionBackend;
105
+ // static constexpr auto kLabels = std::tuple("my_label", "another_label");
106
+ //
107
+ // // Register a counter:
108
+ // static inline const auto kMyCounter = RegisterCounter(
109
+ // "grpc.my_domain.my_counter", "Description of my counter", "units");
110
+ //
111
+ // // Register a gauge:
112
+ // static inline const auto kMyGauge = RegisterIntGauge(
113
+ // "grpc.my_domain.my_gauge", "Description of my gauge", "units");
114
+ // };
115
+ //
116
+ // To increment the counter:
117
+ // auto scope = CreateCollectionScope({}, {}); // Or some other scope
118
+ // auto storage = MyDomain::GetStorage(scope, "label_val1", "label_val2");
119
+ // storage->Increment(MyDomain::kMyCounter);
120
+ //
121
+ // To set the gauge (inside a callback):
122
+ // sink.Set(MyDomain::kMyGauge, current_gauge_value);
123
+ //
124
+ // ## Querying Metrics
125
+ //
126
+ // The `MetricsQuery` class is used to fetch metric data. You can filter by
127
+ // label values, select specific metrics, and collapse labels (aggregate over
128
+ // them). The results are emitted to a `MetricsSink` interface.
129
+ // `MetricsQuery::Run(scope, sink)` operates on a given `CollectionScope`,
130
+ // querying all unique storage instances reachable from that scope and its
131
+ // children.
132
+ //
133
+ // ## Aggregability
134
+ //
135
+ // * **Counters & Histograms:** Are aggregatable. When labels are collapsed
136
+ // using `MetricsQuery::CollapseLabels`, values from different label
137
+ // combinations are summed up.
138
+ // * **Gauges:** Are NOT aggregatable. Collapsing labels on a query that
139
+ // includes gauges is not meaningful, as summing up current values from
140
+ // different sources makes no sense. The `MetricsSink` will receive
141
+ // individual gauge readings for each label set matching the filter.
142
+ //
143
+ // ## Collection Scope Hierarchy
144
+ //
145
+ // Collection scopes form a DAG. The typical layout is to have a collection of
146
+ // root scopes, a trunk scope ("the global scope"), and a set of leaf scopes:
147
+ //
148
+ // ┌────────┐ ┌────────┐
149
+ // │ Root 1 │ │ Root 2 │ ...
150
+ // └───┬────┘ └───┬────┘
151
+ // │ │
152
+ // └──────────────┤
153
+ // │
154
+ // ┌──────▼───────┐
155
+ // │ Global Scope │
156
+ // └──────┬───────┘
157
+ // │
158
+ // ┌──────────────┤
159
+ // │ │
160
+ // ┌───▼────┐ ┌───▼────┐
161
+ // │ Leaf 1 │ │ Leaf 2 │ ...
162
+ // └────────┘ └────────┘
163
+ //
164
+ // The root scopes correspond to global stats plugins in the higher level
165
+ // system. The leaf scopes correspond to per-channel stats plugins. The global
166
+ // (trunk) scope is not associated with any stats plugin, but allows
167
+ // non-channel-related metrics to be aggregated into the global stats plugins.
168
+ //
169
+ // When creating a storage instance systems should use the most specific scope
170
+ // (lowest in the tree) that matches the current context.
171
+
172
+ #ifndef GRPC_SRC_CORE_TELEMETRY_INSTRUMENT_H
173
+ #define GRPC_SRC_CORE_TELEMETRY_INSTRUMENT_H
174
+
175
+ #include <grpc/support/cpu.h>
176
+ #include <grpc/support/port_platform.h>
177
+
178
+ #include <algorithm>
179
+ #include <atomic>
180
+ #include <cstddef>
181
+ #include <cstdint>
182
+ #include <memory>
183
+ #include <optional>
184
+ #include <string>
185
+ #include <tuple>
186
+ #include <type_traits>
187
+ #include <utility>
188
+ #include <variant>
189
+ #include <vector>
190
+
191
+ #include "src/core/channelz/channelz.h"
192
+ #include "src/core/telemetry/histogram.h"
193
+ #include "src/core/util/avl.h"
194
+ #include "src/core/util/dual_ref_counted.h"
195
+ #include "src/core/util/grpc_check.h"
196
+ #include "src/core/util/per_cpu.h"
197
+ #include "src/core/util/ref_counted.h"
198
+ #include "src/core/util/ref_counted_ptr.h"
199
+ #include "src/core/util/single_set_ptr.h"
200
+ #include "src/core/util/sync.h"
201
+ #include "absl/base/thread_annotations.h"
202
+ #include "absl/container/flat_hash_map.h"
203
+ #include "absl/container/flat_hash_set.h"
204
+ #include "absl/container/node_hash_map.h"
205
+ #include "absl/functional/any_invocable.h"
206
+ #include "absl/functional/function_ref.h"
207
+ #include "absl/hash/hash.h"
208
+ #include "absl/log/log.h"
209
+ #include "absl/strings/str_cat.h"
210
+ #include "absl/strings/string_view.h"
211
+ #include "absl/types/span.h"
212
+
213
+ namespace grpc_core {
214
+
215
+ class InstrumentTest;
216
+ class GlobalCollectionScopeManager;
217
+
218
+ static constexpr absl::string_view kOmittedLabel = "<omitted>";
219
+
220
+ namespace instrument_detail {
221
+ class QueryableDomain;
222
+ class DomainStorage;
223
+ } // namespace instrument_detail
224
+
225
+ class CollectionScope;
226
+
227
+ class InstrumentMetadata {
228
+ public:
229
+ struct CounterShape {};
230
+ struct UpDownCounterShape {};
231
+ struct DoubleGaugeShape {};
232
+ struct IntGaugeShape {};
233
+ struct UintGaugeShape {};
234
+ using HistogramShape = HistogramBuckets;
235
+
236
+ using Shape = std::variant<CounterShape, UpDownCounterShape, HistogramShape,
237
+ DoubleGaugeShape, IntGaugeShape, UintGaugeShape>;
238
+
239
+ // A description of a metric.
240
+ struct Description {
241
+ // The domain that owns the metric.
242
+ instrument_detail::QueryableDomain* domain;
243
+ // The offset of the metric within the domain's allocated metrics.
244
+ uint64_t offset;
245
+ // The name of the metric.
246
+ absl::string_view name;
247
+ // A description of the metric.
248
+ absl::string_view description;
249
+ // The unit of the metric.
250
+ absl::string_view unit;
251
+ // The shape of the metric - for counters this is empty.
252
+ // For histograms, it defines the buckets.
253
+ Shape shape;
254
+ };
255
+
256
+ // Iterate all metric descriptions in all domains.
257
+ static void ForEachInstrument(absl::FunctionRef<void(const Description*)> fn);
258
+ };
259
+
260
+ class MetricsQuery;
261
+ class MetricsSink;
262
+
263
+ // OpenTelemetry has no facility to export histogram data in the API (though
264
+ // there is a facility in the SDK). To cover this gap, if we are accessed via
265
+ // the OpenTelemetry API without the SDK being known to gRPC, we register a hook
266
+ // to be called when histogram data is collected.
267
+ // This comes with a relatively sever performance penalty. We'd like to be able
268
+ // to remove this in the future.
269
+ using HistogramCollectionHook = absl::AnyInvocable<void(
270
+ const InstrumentMetadata::Description* instrument,
271
+ absl::Span<const std::string> labels, int64_t value)>;
272
+ void RegisterHistogramCollectionHook(HistogramCollectionHook hook);
273
+
274
+ // Defines a scope for collecting metrics, identified by a set of labels of
275
+ // interest. Metric collection via GetStorage+Increment will be filtered
276
+ // according to these labels. Scopes can be hierarchical. On destruction,
277
+ // metrics collected in this scope are aggregated into the parent scope.
278
+ class CollectionScope : public RefCounted<CollectionScope> {
279
+ public:
280
+ CollectionScope(std::vector<RefCountedPtr<CollectionScope>> parents,
281
+ absl::Span<const std::string> labels,
282
+ size_t child_shards_count, size_t storage_shards_count);
283
+ ~CollectionScope() override;
284
+
285
+ size_t TestOnlyCountStorageHeld() const;
286
+
287
+ void ForEachUniqueStorage(
288
+ absl::FunctionRef<void(instrument_detail::DomainStorage*)> cb);
289
+
290
+ bool ObservesLabel(absl::string_view label) const {
291
+ return labels_of_interest_.contains(label);
292
+ }
293
+
294
+ bool IsRoot() const { return parents_.empty(); }
295
+
296
+ private:
297
+ friend class GlobalCollectionScopeManager;
298
+ friend class MetricsQuery;
299
+ friend class instrument_detail::QueryableDomain;
300
+
301
+ struct StorageShard {
302
+ mutable Mutex mu;
303
+ absl::flat_hash_map<std::pair<instrument_detail::QueryableDomain*,
304
+ std::vector<std::string>>,
305
+ RefCountedPtr<instrument_detail::DomainStorage>>
306
+ storage ABSL_GUARDED_BY(mu);
307
+ };
308
+
309
+ struct ChildShard {
310
+ Mutex mu;
311
+ absl::flat_hash_set<CollectionScope*> children ABSL_GUARDED_BY(mu);
312
+ };
313
+
314
+ ChildShard& child_shard(CollectionScope* child) {
315
+ return child_shards_[absl::HashOf(child) % child_shards_.size()];
316
+ }
317
+
318
+ std::vector<RefCountedPtr<CollectionScope>> parents_;
319
+ absl::flat_hash_set<std::string> labels_of_interest_;
320
+ std::vector<ChildShard> child_shards_;
321
+ std::vector<StorageShard> storage_shards_;
322
+
323
+ void ForEachUniqueStorage(
324
+ absl::FunctionRef<void(instrument_detail::DomainStorage*)> cb,
325
+ absl::flat_hash_set<instrument_detail::DomainStorage*>& visited);
326
+
327
+ void TestOnlyReset();
328
+ };
329
+
330
+ namespace instrument_detail {
331
+
332
+ void CallHistogramCollectionHooks(
333
+ const InstrumentMetadata::Description* instrument,
334
+ absl::Span<const std::string> labels, int64_t value);
335
+
336
+ class GaugeStorage {
337
+ public:
338
+ explicit GaugeStorage(QueryableDomain* domain);
339
+
340
+ void SetDouble(uint64_t offset, double value) {
341
+ GRPC_DCHECK_LT(offset, double_gauges_.size());
342
+ double_gauges_[offset] = value;
343
+ }
344
+ void SetInt(uint64_t offset, int64_t value) {
345
+ GRPC_DCHECK_LT(offset, int_gauges_.size());
346
+ int_gauges_[offset] = value;
347
+ }
348
+ void SetUint(uint64_t offset, uint64_t value) {
349
+ GRPC_DCHECK_LT(offset, uint_gauges_.size());
350
+ uint_gauges_[offset] = value;
351
+ }
352
+
353
+ std::optional<double> GetDouble(uint64_t offset) const {
354
+ GRPC_DCHECK_LT(offset, double_gauges_.size());
355
+ return double_gauges_[offset];
356
+ }
357
+ std::optional<int64_t> GetInt(uint64_t offset) const {
358
+ GRPC_DCHECK_LT(offset, int_gauges_.size());
359
+ return int_gauges_[offset];
360
+ }
361
+ std::optional<uint64_t> GetUint(uint64_t offset) const {
362
+ GRPC_DCHECK_LT(offset, uint_gauges_.size());
363
+ return uint_gauges_[offset];
364
+ }
365
+
366
+ private:
367
+ std::vector<std::optional<double>> double_gauges_;
368
+ std::vector<std::optional<int64_t>> int_gauges_;
369
+ std::vector<std::optional<uint64_t>> uint_gauges_;
370
+ };
371
+
372
+ class DomainStorage : public DualRefCounted<DomainStorage>,
373
+ public channelz::DataSource {
374
+ public:
375
+ DomainStorage(QueryableDomain* domain, std::vector<std::string> label);
376
+
377
+ void Orphaned() override;
378
+
379
+ virtual uint64_t SumCounter(size_t index) = 0;
380
+ virtual void Add(DomainStorage* other) = 0;
381
+
382
+ // Returns the label values of the CollectionScope that owns this storage.
383
+ // This is the full set of labels published by the domain, with unused labels
384
+ // in the scope set to kOmittedLabel.
385
+ absl::Span<const std::string> label() const { return label_; }
386
+ QueryableDomain* domain() const { return domain_; }
387
+
388
+ virtual void FillGaugeStorage(GaugeStorage& gauge_storage) = 0;
389
+
390
+ void AddData(channelz::DataSink sink) override;
391
+
392
+ private:
393
+ QueryableDomain* domain_;
394
+ const std::vector<std::string> label_;
395
+ };
396
+
397
+ // A registry of metrics.
398
+ // In this singleton we maintain metadata about all registered metrics.
399
+ class InstrumentIndex {
400
+ public:
401
+ // Returns the singleton instance of the InstrumentIndex.
402
+ static InstrumentIndex& Get() {
403
+ static InstrumentIndex* index = new InstrumentIndex();
404
+ return *index;
405
+ }
406
+
407
+ // Registers a metric with the given name, description, unit, and shape.
408
+ // Returns a pointer to the Description struct, which contains metadata about
409
+ // the metric.
410
+ const InstrumentMetadata::Description* Register(
411
+ QueryableDomain* domain, uint64_t offset, absl::string_view name,
412
+ absl::string_view description, absl::string_view unit,
413
+ InstrumentMetadata::Shape shape);
414
+
415
+ // Finds a metric with the given name, or nullptr if not found.
416
+ const InstrumentMetadata::Description* Find(absl::string_view name) const;
417
+
418
+ private:
419
+ InstrumentIndex() = default;
420
+
421
+ // A map of metric name to Description. We use node_hash_map because we need
422
+ // pointer stability for the values.
423
+ absl::node_hash_map<absl::string_view, InstrumentMetadata::Description>
424
+ metrics_;
425
+ };
426
+
427
+ // A QueryableDomain is a collection of metrics with a common set of labels.
428
+ // The metrics can be of any type (counter, gauge, histogram, etc) and are
429
+ // all managed by a single instance of the QueryableDomain.
430
+ // QueryableDomain is the base class for InstrumentDomainImpl, and contains
431
+ // common functionality that doesn't need to know about exact types.
432
+ class QueryableDomain {
433
+ public:
434
+ // Iterate all metric descriptions in all domains.
435
+ static void ForEachInstrument(
436
+ absl::FunctionRef<void(const InstrumentMetadata::Description*)> fn);
437
+
438
+ // Returns the names of the labels in the domain.
439
+ absl::Span<const std::string> label_names() const { return label_names_; }
440
+
441
+ // Reset the internal state of all domains. For test use only.
442
+ static void TestOnlyResetAll();
443
+ // Reset the internal state of this domain. For test use only.
444
+ void TestOnlyReset();
445
+
446
+ size_t TestOnlyCountStorageHeld() const;
447
+
448
+ // Returns the number of slots allocated for each metric type.
449
+ uint64_t allocated_counter_slots() const { return allocated_counter_slots_; }
450
+ uint64_t allocated_double_gauge_slots() const {
451
+ return allocated_double_gauge_slots_;
452
+ }
453
+ uint64_t allocated_int_gauge_slots() const {
454
+ return allocated_int_gauge_slots_;
455
+ }
456
+ uint64_t allocated_uint_gauge_slots() const {
457
+ return allocated_uint_gauge_slots_;
458
+ }
459
+
460
+ RefCountedPtr<DomainStorage> GetDomainStorage(
461
+ RefCountedPtr<CollectionScope> scope,
462
+ absl::Span<const std::string> label);
463
+
464
+ absl::string_view name() const { return name_; }
465
+
466
+ RefCountedPtr<channelz::BaseNode> channelz_node() {
467
+ if (!channelz_.is_set()) {
468
+ return channelz_.Set(new ChannelzState(this))->channelz_node();
469
+ }
470
+ return channelz_->channelz_node();
471
+ }
472
+
473
+ protected:
474
+ QueryableDomain(std::string name, std::vector<std::string> label_names,
475
+ size_t map_shards_size)
476
+ : label_names_(std::move(label_names)),
477
+ map_shards_size_(label_names_.empty() ? 1 : map_shards_size),
478
+ map_shards_(std::make_unique<MapShard[]>(map_shards_size_)),
479
+ name_(std::move(name)) {}
480
+
481
+ // QueryableDomain should never be destroyed.
482
+ ~QueryableDomain() { LOG(FATAL) << "QueryableDomain destroyed."; }
483
+
484
+ // Called by InstrumentDomain when construction is complete.
485
+ void Constructed();
486
+
487
+ // Allocates a counter with the given name, description, and unit.
488
+ const InstrumentMetadata::Description* AllocateCounter(
489
+ absl::string_view name, absl::string_view description,
490
+ absl::string_view unit);
491
+ const InstrumentMetadata::Description* AllocateUpDownCounter(
492
+ absl::string_view name, absl::string_view description,
493
+ absl::string_view unit);
494
+ const InstrumentMetadata::Description* AllocateHistogram(
495
+ absl::string_view name, absl::string_view description,
496
+ absl::string_view unit, HistogramBuckets bounds);
497
+ const InstrumentMetadata::Description* AllocateDoubleGauge(
498
+ absl::string_view name, absl::string_view description,
499
+ absl::string_view unit);
500
+ const InstrumentMetadata::Description* AllocateIntGauge(
501
+ absl::string_view name, absl::string_view description,
502
+ absl::string_view unit);
503
+ const InstrumentMetadata::Description* AllocateUintGauge(
504
+ absl::string_view name, absl::string_view description,
505
+ absl::string_view unit);
506
+
507
+ private:
508
+ friend class DomainStorage;
509
+ friend class GaugeStorage;
510
+
511
+ struct MapShard {
512
+ mutable Mutex mu;
513
+ AVL<absl::Span<const std::string>, WeakRefCountedPtr<DomainStorage>>
514
+ storage_map ABSL_GUARDED_BY(mu);
515
+ };
516
+
517
+ struct ChannelzState final : public channelz::DataSource {
518
+ explicit ChannelzState(QueryableDomain* domain)
519
+ : DataSource(MakeRefCounted<channelz::MetricsDomainNode>(
520
+ std::string(domain->name()))),
521
+ domain(domain) {
522
+ SourceConstructed();
523
+ }
524
+ ~ChannelzState() { SourceDestructing(); }
525
+ QueryableDomain* const domain;
526
+ void AddData(channelz::DataSink sink) override { domain->AddData(sink); }
527
+ RefCountedPtr<channelz::BaseNode> channelz_node() {
528
+ return DataSource::channelz_node();
529
+ }
530
+ };
531
+
532
+ virtual RefCountedPtr<DomainStorage> CreateDomainStorage(
533
+ std::vector<std::string> label) = 0;
534
+ void DomainStorageOrphaned(DomainStorage* storage);
535
+ MapShard& GetMapShard(absl::Span<const std::string> label);
536
+
537
+ void AddData(channelz::DataSink sink);
538
+
539
+ // Allocate `size` elements in the domain.
540
+ // Counters will allocate one element. Histograms will allocate one per
541
+ // bucket.
542
+ uint64_t AllocateCounterSlots(size_t size) {
543
+ const uint64_t offset = allocated_counter_slots_;
544
+ allocated_counter_slots_ += size;
545
+ return offset;
546
+ }
547
+
548
+ // We keep a linked list of all QueryableDomains, so that we can walk
549
+ // them in order to export metrics.
550
+ static inline QueryableDomain* last_ = nullptr;
551
+ QueryableDomain* prev_ = nullptr;
552
+
553
+ const std::vector<std::string> label_names_;
554
+ std::vector<const InstrumentMetadata::Description*> metrics_;
555
+ uint64_t allocated_counter_slots_ = 0;
556
+ uint64_t allocated_double_gauge_slots_ = 0;
557
+ uint64_t allocated_int_gauge_slots_ = 0;
558
+ uint64_t allocated_uint_gauge_slots_ = 0;
559
+
560
+ const size_t map_shards_size_;
561
+ std::unique_ptr<MapShard[]> map_shards_;
562
+
563
+ std::string name_;
564
+ SingleSetPtr<ChannelzState> channelz_;
565
+ };
566
+
567
+ // An InstrumentDomain is a collection of metrics with a common set of labels.
568
+ // The metrics can be of any type (counter, gauge, histogram, etc) and are
569
+ // all managed by a single instance of the InstrumentDomain.
570
+ // InstrumentDomains should be created at static initialization time.
571
+ // The InstrumentDomainImpl has a Backend, which defines how metrics are
572
+ // accumulated.
573
+ template <typename Backend, size_t N, typename Tag>
574
+ class InstrumentDomainImpl;
575
+
576
+ struct Counter {
577
+ static constexpr size_t buckets() { return 1; }
578
+ Counter operator->() const { return *this; }
579
+ constexpr size_t BucketFor(int64_t /*value*/) const { return 0; }
580
+ };
581
+
582
+ // An InstrumentHandle is a handle to a single metric in an
583
+ // instrument domain. It has a Shape (how the metric behaves).
584
+ template <typename Shape, typename Domain>
585
+ class InstrumentHandle {
586
+ public:
587
+ absl::string_view name() const { return description_->name; }
588
+ absl::string_view description() const { return description_->description; }
589
+ absl::string_view unit() const { return description_->unit; }
590
+
591
+ private:
592
+ friend Domain;
593
+
594
+ InstrumentHandle(Domain* instrument_domain,
595
+ const InstrumentMetadata::Description* description,
596
+ Shape shape)
597
+ : instrument_domain_(instrument_domain),
598
+ offset_(description->offset),
599
+ shape_(std::move(shape)),
600
+ description_(description) {}
601
+
602
+ Domain* instrument_domain_;
603
+ uint64_t offset_;
604
+ GPR_NO_UNIQUE_ADDRESS Shape shape_;
605
+ const InstrumentMetadata::Description* description_ = nullptr;
606
+ };
607
+
608
+ template <typename T>
609
+ using StdString = std::string;
610
+
611
+ template <typename T>
612
+ using AbslStringView = absl::string_view;
613
+
614
+ } // namespace instrument_detail
615
+
616
+ // A domain backend for low contention domains.
617
+ // We use a simple array of atomics to back the collection - each increment
618
+ // is a relaxed add.
619
+ class LowContentionBackend final {
620
+ public:
621
+ explicit LowContentionBackend(size_t size);
622
+
623
+ void Add(size_t index, uint64_t amount) {
624
+ counters_[index].fetch_add(amount, std::memory_order_relaxed);
625
+ }
626
+ void Subtract(size_t index, uint64_t amount) {
627
+ uint64_t old_value =
628
+ counters_[index].fetch_sub(amount, std::memory_order_relaxed);
629
+ // Every decrement should have a corresponding increment.
630
+ GRPC_DCHECK(old_value >= amount);
631
+ }
632
+ void Increment(size_t index) { Add(index, 1); }
633
+ void Decrement(size_t index) { Subtract(index, 1); }
634
+
635
+ uint64_t Sum(size_t index);
636
+
637
+ private:
638
+ std::unique_ptr<std::atomic<uint64_t>[]> counters_;
639
+ };
640
+
641
+ // A domain backend for high contention domains.
642
+ // We shard the counters to reduce contention: increments happen on a shard
643
+ // selected by the current CPU, and reads need to accumulate across all the
644
+ // shards.
645
+ class HighContentionBackend final {
646
+ public:
647
+ explicit HighContentionBackend(size_t size);
648
+
649
+ void Add(size_t index, uint64_t amount) {
650
+ counters_.this_cpu()[index].fetch_add(amount, std::memory_order_relaxed);
651
+ }
652
+ void Subtract(size_t index, uint64_t amount) {
653
+ counters_.this_cpu()[index].fetch_sub(amount, std::memory_order_relaxed);
654
+ }
655
+ void Increment(size_t index) { Add(index, 1); }
656
+ void Decrement(size_t index) { Subtract(index, 1); }
657
+
658
+ uint64_t Sum(size_t index);
659
+
660
+ private:
661
+ // Since Increments and Decrements can happen on different CPUs, we need to
662
+ // use a int64_t counter. The sum should still be a uint64_t.
663
+ PerCpu<std::unique_ptr<std::atomic<int64_t>[]>> counters_{
664
+ PerCpuOptions().SetMaxShards(16)};
665
+ };
666
+
667
+ // MetricsSink is an interface for accumulating metrics.
668
+ // Importantly it's the output interface for MetricsQuery.
669
+ class MetricsSink {
670
+ public:
671
+ // Called once per label per metric, with the value of that metric for that
672
+ // label.
673
+ virtual void Counter(absl::Span<const std::string> label_keys,
674
+ absl::Span<const std::string> label_values,
675
+ absl::string_view name, uint64_t value) = 0;
676
+ virtual void UpDownCounter(absl::Span<const std::string> label_keys,
677
+ absl::Span<const std::string> label_values,
678
+ absl::string_view name, uint64_t value) = 0;
679
+ virtual void Histogram(absl::Span<const std::string> label_keys,
680
+ absl::Span<const std::string> label_values,
681
+ absl::string_view name, HistogramBuckets bounds,
682
+ absl::Span<const uint64_t> counts) = 0;
683
+ virtual void DoubleGauge(absl::Span<const std::string> label_keys,
684
+ absl::Span<const std::string> label_values,
685
+ absl::string_view name, double value) = 0;
686
+ virtual void IntGauge(absl::Span<const std::string> label_keys,
687
+ absl::Span<const std::string> label_values,
688
+ absl::string_view name, int64_t value) = 0;
689
+ virtual void UintGauge(absl::Span<const std::string> label_keys,
690
+ absl::Span<const std::string> label_values,
691
+ absl::string_view name, uint64_t value) = 0;
692
+
693
+ protected:
694
+ ~MetricsSink() = default;
695
+ };
696
+
697
+ // A MetricsQuery allows querying across the global set of metrics and
698
+ // fetching their values.
699
+ // Allows a level of filtering so that we only get the values for metrics
700
+ // that match a set of criteria.
701
+ // Also allows collapsing labels (effectively omitting them) and aggregating
702
+ // over the remaining labels.
703
+ class MetricsQuery {
704
+ public:
705
+ // Only include metrics that include `label` and have that label equal to
706
+ // `value`.
707
+ MetricsQuery& WithLabelEq(absl::string_view label, std::string value);
708
+ // Collapse labels, effectively omitting them. Counters are summed over the
709
+ // remaining dimensions, etc.
710
+ MetricsQuery& CollapseLabels(absl::Span<const std::string> labels);
711
+ // Only include metrics that are in `metrics`.
712
+ MetricsQuery& OnlyMetrics(std::vector<std::string> metrics);
713
+
714
+ // Returns the metrics that are selected by this query.
715
+ std::optional<absl::Span<const std::string>> selected_metrics() const {
716
+ return only_metrics_;
717
+ }
718
+
719
+ // Runs the query, outputting the results to `sink`.
720
+ void Run(RefCountedPtr<CollectionScope> scope, MetricsSink& sink) const;
721
+
722
+ private:
723
+ // Adapts `sink` by including the filtering requested, and then calls `fn`
724
+ // with the filtering sink. This is mainly an implementation detail.
725
+ void Apply(absl::Span<const std::string> label_names,
726
+ absl::FunctionRef<void(MetricsSink&)> fn, MetricsSink& sink) const;
727
+
728
+ void ApplyLabelChecks(absl::Span<const std::string> label_names,
729
+ absl::FunctionRef<void(MetricsSink&)> fn,
730
+ MetricsSink& sink) const;
731
+
732
+ absl::flat_hash_map<absl::string_view, std::string> label_eqs_;
733
+ std::optional<std::vector<std::string>> only_metrics_;
734
+ absl::flat_hash_set<std::string> collapsed_labels_;
735
+ };
736
+
737
+ namespace instrument_detail {
738
+
739
+ template <typename Shape, typename... Args>
740
+ Shape* GetMemoizedShape(Args&&... args) {
741
+ // Many histograms are created with the same shape, so we try to deduplicate
742
+ // them.
743
+ using ShapeCache = absl::node_hash_map<std::tuple<Args...>, Shape*>;
744
+ static ShapeCache* shape_cache = new ShapeCache();
745
+ auto it =
746
+ shape_cache->find(std::forward_as_tuple(std::forward<Args>(args)...));
747
+ Shape* shape;
748
+ if (it != shape_cache->end()) {
749
+ shape = it->second;
750
+ } else {
751
+ shape = new Shape(std::forward<Args>(args)...);
752
+ shape_cache->emplace(std::forward_as_tuple(std::forward<Args>(args)...),
753
+ shape);
754
+ }
755
+ return shape;
756
+ }
757
+
758
+ // An InstrumentDomainImpl is a collection of instruments with a common set of
759
+ // labels.
760
+ template <typename Backend, size_t N, typename Tag>
761
+ class InstrumentDomainImpl final : public QueryableDomain {
762
+ public:
763
+ using Self = InstrumentDomainImpl<Backend, N, Tag>;
764
+ using CounterHandle = InstrumentHandle<Counter, Self>;
765
+ using UpDownCounterHandle =
766
+ InstrumentHandle<InstrumentMetadata::UpDownCounterShape, Self>;
767
+ using DoubleGaugeHandle =
768
+ InstrumentHandle<InstrumentMetadata::DoubleGaugeShape, Self>;
769
+ using IntGaugeHandle =
770
+ InstrumentHandle<InstrumentMetadata::IntGaugeShape, Self>;
771
+ using UintGaugeHandle =
772
+ InstrumentHandle<InstrumentMetadata::UintGaugeShape, Self>;
773
+ template <typename Shape>
774
+ using HistogramHandle = InstrumentHandle<const Shape*, Self>;
775
+
776
+ class GaugeSink {
777
+ public:
778
+ explicit GaugeSink(GaugeStorage& storage) : storage_(storage) {}
779
+
780
+ void Set(InstrumentHandle<InstrumentMetadata::DoubleGaugeShape, Self> g,
781
+ double x) {
782
+ storage_.SetDouble(g.offset_, x);
783
+ }
784
+ void Set(InstrumentHandle<InstrumentMetadata::IntGaugeShape, Self> g,
785
+ int64_t x) {
786
+ storage_.SetInt(g.offset_, x);
787
+ }
788
+ void Set(InstrumentHandle<InstrumentMetadata::UintGaugeShape, Self> g,
789
+ uint64_t x) {
790
+ storage_.SetUint(g.offset_, x);
791
+ }
792
+
793
+ private:
794
+ GaugeStorage& storage_;
795
+ };
796
+
797
+ class Storage;
798
+
799
+ // Interface for objects that provide gauge values for this domain.
800
+ class GaugeProvider {
801
+ public:
802
+ virtual void PopulateGaugeData(GaugeSink& sink) = 0;
803
+
804
+ protected:
805
+ explicit GaugeProvider(RefCountedPtr<Storage> storage)
806
+ : storage_(std::move(storage)) {
807
+ GRPC_DCHECK(storage_ != nullptr);
808
+ }
809
+ ~GaugeProvider() { GRPC_DCHECK(storage_ == nullptr); }
810
+
811
+ void ProviderConstructed() {
812
+ GRPC_DCHECK(storage_ != nullptr);
813
+ storage_->RegisterGaugeProvider(this);
814
+ }
815
+ void ProviderDestructing() {
816
+ GRPC_DCHECK(storage_ != nullptr);
817
+ storage_->UnregisterGaugeProvider(this);
818
+ storage_.reset();
819
+ }
820
+
821
+ private:
822
+ RefCountedPtr<Storage> storage_;
823
+ };
824
+
825
+ // Storage is a ref-counted object that holds the backend for an
826
+ // InstrumentDomain for a single set of labels.
827
+ class Storage final : public DomainStorage {
828
+ public:
829
+ ~Storage() override = default;
830
+
831
+ // Increments the counter specified by `handle` by 1 for this storages
832
+ // labels.
833
+ void Increment(CounterHandle handle, uint64_t amount = 1) {
834
+ GRPC_DCHECK_EQ(handle.instrument_domain_, domain());
835
+ backend_.Add(handle.offset_, amount);
836
+ }
837
+
838
+ void Increment(UpDownCounterHandle handle, uint64_t amount = 1) {
839
+ GRPC_DCHECK_EQ(handle.instrument_domain_, domain());
840
+ backend_.Add(handle.offset_, amount);
841
+ }
842
+
843
+ void Decrement(UpDownCounterHandle handle, uint64_t amount = 1) {
844
+ GRPC_DCHECK_EQ(handle.instrument_domain_, domain());
845
+ backend_.Subtract(handle.offset_, amount);
846
+ }
847
+
848
+ void Add(DomainStorage* other) override {
849
+ GRPC_DCHECK_EQ(domain(), other->domain());
850
+ for (size_t i = 0; i < domain()->allocated_counter_slots(); ++i) {
851
+ uint64_t amount = other->SumCounter(i);
852
+ if (amount == 0) continue;
853
+ backend_.Add(i, amount);
854
+ }
855
+ }
856
+
857
+ template <typename Shape>
858
+ void Increment(const HistogramHandle<Shape>& handle, int64_t value) {
859
+ GRPC_DCHECK_EQ(handle.instrument_domain_, domain());
860
+ CallHistogramCollectionHooks(handle.description_, label(), value);
861
+ backend_.Add(handle.offset_ + handle.shape_->BucketFor(value), 1);
862
+ }
863
+
864
+ private:
865
+ friend class InstrumentDomainImpl<Backend, N, Tag>;
866
+ friend class GaugeProvider;
867
+
868
+ explicit Storage(InstrumentDomainImpl* instrument_domain,
869
+ std::vector<std::string> labels)
870
+ : DomainStorage(instrument_domain, std::move(labels)),
871
+ backend_(instrument_domain->allocated_counter_slots()) {}
872
+
873
+ uint64_t SumCounter(size_t offset) override { return backend_.Sum(offset); }
874
+
875
+ void RegisterGaugeProvider(GaugeProvider* provider) {
876
+ MutexLock lock(&gauge_providers_mu_);
877
+ gauge_providers_.push_back(provider);
878
+ }
879
+
880
+ void UnregisterGaugeProvider(GaugeProvider* provider) {
881
+ MutexLock lock(&gauge_providers_mu_);
882
+ gauge_providers_.erase(std::remove(gauge_providers_.begin(),
883
+ gauge_providers_.end(), provider),
884
+ gauge_providers_.end());
885
+ }
886
+
887
+ void FillGaugeStorage(GaugeStorage& storage) override {
888
+ GaugeSink sink(storage);
889
+ MutexLock lock(&gauge_providers_mu_);
890
+ for (auto* provider : gauge_providers_) {
891
+ provider->PopulateGaugeData(sink);
892
+ }
893
+ }
894
+
895
+ Backend backend_;
896
+ Mutex gauge_providers_mu_;
897
+ std::vector<GaugeProvider*> gauge_providers_
898
+ ABSL_GUARDED_BY(gauge_providers_mu_);
899
+ };
900
+
901
+ GPR_ATTRIBUTE_NOINLINE explicit InstrumentDomainImpl(
902
+ std::string name, std::vector<std::string> label_names,
903
+ size_t map_shards = std::min(16u, gpr_cpu_num_cores()))
904
+ : QueryableDomain(std::move(name), std::move(label_names), map_shards) {
905
+ GRPC_CHECK_EQ(this->label_names().size(), N);
906
+ Constructed();
907
+ }
908
+
909
+ // Registration functions: must all complete before the first GetStorage call.
910
+ // No locking is performed, so registrations must be performed with external
911
+ // synchronization.
912
+ // Effectively: Do this at static initialization time.
913
+
914
+ CounterHandle RegisterCounter(absl::string_view name,
915
+ absl::string_view description,
916
+ absl::string_view unit) {
917
+ return CounterHandle{this, AllocateCounter(name, description, unit),
918
+ Counter{}};
919
+ }
920
+
921
+ UpDownCounterHandle RegisterUpDownCounter(absl::string_view name,
922
+ absl::string_view description,
923
+ absl::string_view unit) {
924
+ return UpDownCounterHandle{this,
925
+ AllocateUpDownCounter(name, description, unit),
926
+ InstrumentMetadata::UpDownCounterShape{}};
927
+ }
928
+
929
+ template <typename Shape, typename... Args>
930
+ HistogramHandle<Shape> RegisterHistogram(absl::string_view name,
931
+ absl::string_view description,
932
+ absl::string_view unit,
933
+ Args&&... args) {
934
+ auto* shape = GetMemoizedShape<Shape>(std::forward<Args>(args)...);
935
+ const auto* desc =
936
+ AllocateHistogram(name, description, unit, shape->bounds());
937
+ return HistogramHandle<Shape>{this, desc, shape};
938
+ }
939
+
940
+ DoubleGaugeHandle RegisterDoubleGauge(absl::string_view name,
941
+ absl::string_view description,
942
+ absl::string_view unit) {
943
+ return DoubleGaugeHandle{this, AllocateDoubleGauge(name, description, unit),
944
+ InstrumentMetadata::DoubleGaugeShape{}};
945
+ }
946
+
947
+ IntGaugeHandle RegisterIntGauge(absl::string_view name,
948
+ absl::string_view description,
949
+ absl::string_view unit) {
950
+ return IntGaugeHandle{this, AllocateIntGauge(name, description, unit),
951
+ InstrumentMetadata::IntGaugeShape{}};
952
+ }
953
+
954
+ UintGaugeHandle RegisterUintGauge(absl::string_view name,
955
+ absl::string_view description,
956
+ absl::string_view unit) {
957
+ return UintGaugeHandle{this, AllocateUintGauge(name, description, unit),
958
+ InstrumentMetadata::UintGaugeShape{}};
959
+ }
960
+
961
+ // GetStorage: returns a pointer to the storage for the given key, creating
962
+ // it if necessary.
963
+ template <typename... Args>
964
+ RefCountedPtr<Storage> GetStorage(RefCountedPtr<CollectionScope> scope,
965
+ Args&&... labels) {
966
+ static_assert(sizeof...(Args) == N, "Incorrect number of labels provided");
967
+ std::vector<std::string> label_values;
968
+ label_values.reserve(N);
969
+ (label_values.emplace_back(absl::StrCat(labels)), ...);
970
+ return DownCastRefCountedPtr<Storage>(
971
+ GetDomainStorage(std::move(scope), label_values));
972
+ }
973
+
974
+ RefCountedPtr<DomainStorage> CreateDomainStorage(
975
+ std::vector<std::string> labels) override {
976
+ return RefCountedPtr<Storage>(new Storage(this, std::move(labels)));
977
+ }
978
+
979
+ private:
980
+ ~InstrumentDomainImpl() = delete;
981
+ };
982
+
983
+ class MakeLabel {
984
+ public:
985
+ template <typename... LabelNames>
986
+ auto operator()(LabelNames... t) {
987
+ return std::vector<std::string>{absl::StrCat(t)...};
988
+ }
989
+ };
990
+
991
+ template <typename... LabelNames>
992
+ GPR_ATTRIBUTE_NOINLINE auto MakeLabelFromTuple(
993
+ std::tuple<LabelNames...> t) noexcept {
994
+ return std::apply(MakeLabel(), t);
995
+ }
996
+ } // namespace instrument_detail
997
+
998
+ template <class Derived>
999
+ class InstrumentDomain {
1000
+ public:
1001
+ static auto* Domain() {
1002
+ static auto* domain = new instrument_detail::InstrumentDomainImpl<
1003
+ typename Derived::Backend,
1004
+ std::tuple_size_v<decltype(Derived::kLabels)>, Derived>(
1005
+ absl::StrCat(Derived::kName),
1006
+ instrument_detail::MakeLabelFromTuple(Derived::kLabels));
1007
+ return domain;
1008
+ }
1009
+
1010
+ // Returns an InstrumentStorageRefPtr<Derived>.
1011
+ template <typename... Args>
1012
+ static auto GetStorage(RefCountedPtr<CollectionScope> scope,
1013
+ Args&&... labels) {
1014
+ return Domain()->GetStorage(std::move(scope),
1015
+ std::forward<Args>(labels)...);
1016
+ }
1017
+
1018
+ protected:
1019
+ template <typename... Label>
1020
+ static constexpr auto Labels(Label... labels) {
1021
+ return std::tuple<instrument_detail::AbslStringView<Label>...>{labels...};
1022
+ }
1023
+
1024
+ static auto RegisterCounter(absl::string_view name,
1025
+ absl::string_view description,
1026
+ absl::string_view unit) {
1027
+ return Domain()->RegisterCounter(name, description, unit);
1028
+ }
1029
+
1030
+ static auto RegisterUpDownCounter(absl::string_view name,
1031
+ absl::string_view description,
1032
+ absl::string_view unit) {
1033
+ return Domain()->RegisterUpDownCounter(name, description, unit);
1034
+ }
1035
+
1036
+ template <typename Shape, typename... Args>
1037
+ static auto RegisterHistogram(absl::string_view name,
1038
+ absl::string_view description,
1039
+ absl::string_view unit, Args&&... args) {
1040
+ return Domain()->template RegisterHistogram<Shape>(
1041
+ name, description, unit, std::forward<Args>(args)...);
1042
+ }
1043
+
1044
+ static auto RegisterDoubleGauge(absl::string_view name,
1045
+ absl::string_view description,
1046
+ absl::string_view unit) {
1047
+ return Domain()->RegisterDoubleGauge(name, description, unit);
1048
+ }
1049
+
1050
+ static auto RegisterIntGauge(absl::string_view name,
1051
+ absl::string_view description,
1052
+ absl::string_view unit) {
1053
+ return Domain()->RegisterIntGauge(name, description, unit);
1054
+ }
1055
+
1056
+ static auto RegisterUintGauge(absl::string_view name,
1057
+ absl::string_view description,
1058
+ absl::string_view unit) {
1059
+ return Domain()->RegisterUintGauge(name, description, unit);
1060
+ }
1061
+
1062
+ private:
1063
+ InstrumentDomain() = delete;
1064
+ };
1065
+
1066
+ template <typename DomainType>
1067
+ using InstrumentDomainImpl =
1068
+ std::remove_pointer_t<decltype(DomainType::Domain())>;
1069
+
1070
+ template <typename DomainType>
1071
+ using InstrumentStorage = typename InstrumentDomainImpl<DomainType>::Storage;
1072
+
1073
+ template <typename DomainType>
1074
+ using InstrumentStorageRefPtr = RefCountedPtr<InstrumentStorage<DomainType>>;
1075
+
1076
+ template <typename DomainType>
1077
+ using GaugeSink = typename InstrumentDomainImpl<DomainType>::GaugeSink;
1078
+
1079
+ template <typename DomainType>
1080
+ using GaugeProvider = typename InstrumentDomainImpl<DomainType>::GaugeProvider;
1081
+
1082
+ // Reset all registered instruments. For test use only.
1083
+ void TestOnlyResetInstruments();
1084
+
1085
+ // Create a new collection scope.
1086
+ // `parent` is the parent scope, or nullptr for a root scope.
1087
+ // `labels` is a list of labels that this scope is interested in. The scope's
1088
+ // labels of interest will be the union of its own labels and its parent's
1089
+ // labels.
1090
+ // `child_shards_count` and `storage_shards_count` are performance tuning
1091
+ // parameters for sharding internal data structures.
1092
+ RefCountedPtr<CollectionScope> CreateCollectionScope(
1093
+ std::vector<RefCountedPtr<CollectionScope>> parents,
1094
+ absl::Span<const std::string> labels, size_t child_shards_count = 1,
1095
+ size_t storage_shards_count = 1);
1096
+
1097
+ RefCountedPtr<CollectionScope> CreateRootCollectionScope(
1098
+ absl::Span<const std::string> labels, size_t child_shards_count = 1,
1099
+ size_t storage_shards_count = 1);
1100
+
1101
+ RefCountedPtr<CollectionScope> GlobalCollectionScope();
1102
+
1103
+ } // namespace grpc_core
1104
+
1105
+ #endif // GRPC_SRC_CORE_TELEMETRY_INSTRUMENT_H