grpc 1.76.0 → 1.78.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (763) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +11 -5
  3. data/include/grpc/credentials.h +6 -1
  4. data/include/grpc/event_engine/memory_allocator.h +2 -0
  5. data/include/grpc/impl/channel_arg_names.h +5 -0
  6. data/include/grpc/support/metrics.h +7 -1
  7. data/src/core/call/call_filters.cc +1 -1
  8. data/src/core/call/call_filters.h +175 -1
  9. data/src/core/call/call_spine.cc +1 -1
  10. data/src/core/call/call_spine.h +27 -5
  11. data/src/core/call/channelz_context.h +30 -0
  12. data/src/core/call/client_call.cc +43 -5
  13. data/src/core/call/client_call.h +6 -3
  14. data/src/core/call/filter_fusion.h +4 -4
  15. data/src/core/call/interception_chain.h +7 -6
  16. data/src/core/call/metadata_batch.cc +49 -55
  17. data/src/core/call/metadata_batch.h +7 -6
  18. data/src/core/call/metadata_info.cc +1 -1
  19. data/src/core/call/parsed_metadata.h +2 -2
  20. data/src/core/call/request_buffer.cc +1 -1
  21. data/src/core/call/security_context.cc +1 -1
  22. data/src/core/call/security_context.h +1 -1
  23. data/src/core/call/server_call.cc +1 -1
  24. data/src/core/call/server_call.h +5 -3
  25. data/src/core/call/simple_slice_based_metadata.h +1 -1
  26. data/src/core/call/status_util.cc +1 -1
  27. data/src/core/channelz/channel_trace.cc +1 -1
  28. data/src/core/channelz/channel_trace.h +3 -3
  29. data/src/core/channelz/channelz.cc +13 -11
  30. data/src/core/channelz/channelz.h +41 -6
  31. data/src/core/channelz/channelz_registry.cc +2 -2
  32. data/src/core/channelz/channelz_registry.h +42 -2
  33. data/src/core/channelz/property_list.h +6 -4
  34. data/src/core/channelz/v2tov1/convert.cc +6 -6
  35. data/src/core/channelz/v2tov1/legacy_api.cc +4 -5
  36. data/src/core/channelz/v2tov1/property_list.cc +1 -1
  37. data/src/core/channelz/ztrace_collector.h +14 -2
  38. data/src/core/client_channel/backup_poller.cc +2 -2
  39. data/src/core/client_channel/buffered_call.cc +140 -0
  40. data/src/core/client_channel/buffered_call.h +104 -0
  41. data/src/core/client_channel/client_channel.cc +124 -71
  42. data/src/core/client_channel/client_channel.h +8 -11
  43. data/src/core/client_channel/client_channel_factory.h +1 -1
  44. data/src/core/client_channel/client_channel_filter.cc +393 -663
  45. data/src/core/client_channel/client_channel_filter.h +57 -150
  46. data/src/core/client_channel/client_channel_internal.h +5 -1
  47. data/src/core/client_channel/client_channel_service_config.cc +43 -3
  48. data/src/core/client_channel/client_channel_service_config.h +12 -1
  49. data/src/core/client_channel/config_selector.h +2 -2
  50. data/src/core/client_channel/connector.h +2 -0
  51. data/src/core/client_channel/dynamic_filters.cc +2 -2
  52. data/src/core/client_channel/global_subchannel_pool.h +1 -1
  53. data/src/core/client_channel/lb_metadata.h +1 -1
  54. data/src/core/client_channel/load_balanced_call_destination.cc +3 -5
  55. data/src/core/client_channel/load_balanced_call_destination.h +1 -1
  56. data/src/core/client_channel/retry_filter.cc +2 -2
  57. data/src/core/client_channel/retry_filter_legacy_call_data.cc +6 -7
  58. data/src/core/client_channel/retry_filter_legacy_call_data.h +6 -8
  59. data/src/core/client_channel/retry_service_config.cc +3 -3
  60. data/src/core/client_channel/retry_service_config.h +1 -1
  61. data/src/core/client_channel/subchannel.cc +106 -17
  62. data/src/core/client_channel/subchannel.h +24 -8
  63. data/src/core/client_channel/subchannel_pool_interface.cc +2 -2
  64. data/src/core/client_channel/subchannel_pool_interface.h +1 -1
  65. data/src/core/client_channel/subchannel_stream_client.cc +1 -1
  66. data/src/core/client_channel/subchannel_stream_client.h +3 -3
  67. data/src/core/config/config_vars.cc +8 -2
  68. data/src/core/config/config_vars.h +5 -0
  69. data/src/core/config/core_configuration.h +1 -1
  70. data/src/core/config/load_config.cc +1 -1
  71. data/src/core/credentials/call/call_credentials.h +2 -2
  72. data/src/core/credentials/call/call_creds_registry.h +1 -1
  73. data/src/core/credentials/call/call_creds_registry_init.cc +2 -2
  74. data/src/core/credentials/call/call_creds_util.cc +3 -3
  75. data/src/core/credentials/call/composite/composite_call_credentials.cc +2 -2
  76. data/src/core/credentials/call/composite/composite_call_credentials.h +1 -1
  77. data/src/core/credentials/call/external/aws_external_account_credentials.cc +6 -6
  78. data/src/core/credentials/call/external/aws_external_account_credentials.h +1 -1
  79. data/src/core/credentials/call/external/external_account_credentials.cc +12 -12
  80. data/src/core/credentials/call/external/external_account_credentials.h +1 -1
  81. data/src/core/credentials/call/external/file_external_account_credentials.cc +3 -3
  82. data/src/core/credentials/call/external/file_external_account_credentials.h +1 -1
  83. data/src/core/credentials/call/external/url_external_account_credentials.cc +6 -6
  84. data/src/core/credentials/call/external/url_external_account_credentials.h +1 -1
  85. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +24 -71
  86. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.h +1 -8
  87. data/src/core/credentials/call/iam/iam_credentials.cc +2 -2
  88. data/src/core/credentials/call/iam/iam_credentials.h +1 -1
  89. data/src/core/credentials/call/json_util.cc +1 -1
  90. data/src/core/credentials/call/jwt/json_token.cc +4 -4
  91. data/src/core/credentials/call/jwt/jwt_credentials.cc +3 -3
  92. data/src/core/credentials/call/jwt/jwt_credentials.h +4 -4
  93. data/src/core/credentials/call/jwt/jwt_verifier.cc +5 -5
  94. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +2 -2
  95. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +3 -3
  96. data/src/core/credentials/call/jwt_util.cc +3 -3
  97. data/src/core/credentials/call/jwt_util.h +1 -1
  98. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +29 -60
  99. data/src/core/credentials/call/oauth2/oauth2_credentials.h +3 -9
  100. data/src/core/credentials/call/plugin/plugin_credentials.cc +4 -4
  101. data/src/core/credentials/call/plugin/plugin_credentials.h +2 -2
  102. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +46 -0
  103. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.h +32 -3
  104. data/src/core/credentials/transport/alts/alts_credentials.cc +3 -3
  105. data/src/core/credentials/transport/alts/alts_security_connector.cc +3 -3
  106. data/src/core/credentials/transport/alts/check_gcp_environment_no_op.cc +1 -1
  107. data/src/core/credentials/transport/alts/grpc_alts_credentials_client_options.cc +1 -1
  108. data/src/core/credentials/transport/alts/grpc_alts_credentials_options.h +1 -1
  109. data/src/core/credentials/transport/channel_creds_registry.h +1 -1
  110. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  111. data/src/core/credentials/transport/composite/composite_channel_credentials.cc +2 -2
  112. data/src/core/credentials/transport/composite/composite_channel_credentials.h +1 -1
  113. data/src/core/credentials/transport/fake/fake_credentials.cc +1 -1
  114. data/src/core/credentials/transport/fake/fake_credentials.h +1 -1
  115. data/src/core/credentials/transport/fake/fake_security_connector.cc +5 -5
  116. data/src/core/credentials/transport/google_default/credentials_generic.cc +2 -2
  117. data/src/core/credentials/transport/google_default/google_default_credentials.cc +5 -11
  118. data/src/core/credentials/transport/google_default/google_default_credentials.h +0 -2
  119. data/src/core/credentials/transport/insecure/insecure_security_connector.h +2 -2
  120. data/src/core/credentials/transport/local/local_security_connector.cc +5 -5
  121. data/src/core/credentials/transport/security_connector.cc +1 -1
  122. data/src/core/credentials/transport/security_connector.h +2 -2
  123. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  124. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +5 -5
  125. data/src/core/credentials/transport/tls/certificate_provider_factory.h +1 -1
  126. data/src/core/credentials/transport/tls/certificate_provider_registry.cc +1 -1
  127. data/src/core/credentials/transport/tls/certificate_provider_registry.h +1 -1
  128. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +1 -1
  129. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +2 -2
  130. data/src/core/credentials/transport/tls/grpc_tls_certificate_match.cc +1 -1
  131. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +3 -3
  132. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +3 -3
  133. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +1 -1
  134. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.h +2 -2
  135. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +1 -1
  136. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +5 -5
  137. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.h +3 -3
  138. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -1
  139. data/src/core/credentials/transport/tls/spiffe_utils.cc +10 -8
  140. data/src/core/credentials/transport/tls/spiffe_utils.h +2 -2
  141. data/src/core/credentials/transport/tls/ssl_utils.cc +4 -4
  142. data/src/core/credentials/transport/tls/ssl_utils.h +2 -2
  143. data/src/core/credentials/transport/tls/tls_credentials.cc +1 -1
  144. data/src/core/credentials/transport/tls/tls_security_connector.cc +4 -4
  145. data/src/core/credentials/transport/tls/tls_security_connector.h +3 -3
  146. data/src/core/credentials/transport/transport_credentials.cc +1 -1
  147. data/src/core/credentials/transport/transport_credentials.h +2 -2
  148. data/src/core/credentials/transport/xds/xds_credentials.h +1 -1
  149. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +2 -2
  150. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +4 -1
  151. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +5 -5
  152. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -2
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +7 -7
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +6 -3
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +1 -1
  156. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +1 -1
  157. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +6 -3
  158. data/src/core/ext/filters/gcp_authentication/gcp_authentication_service_config_parser.h +1 -1
  159. data/src/core/ext/filters/http/client/http_client_filter.cc +6 -6
  160. data/src/core/ext/filters/http/client/http_client_filter.h +4 -1
  161. data/src/core/ext/filters/http/client_authority_filter.cc +2 -2
  162. data/src/core/ext/filters/http/client_authority_filter.h +4 -1
  163. data/src/core/ext/filters/http/http_filters_plugin.cc +1 -1
  164. data/src/core/ext/filters/http/message_compress/compression_filter.cc +3 -3
  165. data/src/core/ext/filters/http/message_compress/compression_filter.h +21 -2
  166. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -3
  167. data/src/core/ext/filters/http/server/http_server_filter.h +4 -1
  168. data/src/core/ext/filters/message_size/message_size_filter.cc +2 -2
  169. data/src/core/ext/filters/message_size/message_size_filter.h +8 -2
  170. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  171. data/src/core/ext/filters/rbac/rbac_filter.h +4 -1
  172. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +3 -3
  173. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +7 -7
  175. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +13 -2
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  177. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +50 -37
  178. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +2 -3
  179. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -17
  180. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -2
  181. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +2 -2
  182. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +210 -60
  183. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +10 -2
  184. data/src/core/ext/transport/chttp2/transport/flow_control.cc +39 -4
  185. data/src/core/ext/transport/chttp2/transport/flow_control.h +213 -78
  186. data/src/core/ext/transport/chttp2/transport/flow_control_manager.h +46 -1
  187. data/src/core/ext/transport/chttp2/transport/frame.cc +147 -21
  188. data/src/core/ext/transport/chttp2/transport/frame.h +44 -10
  189. data/src/core/ext/transport/chttp2/transport/frame_data.cc +2 -2
  190. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  191. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -2
  192. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -4
  193. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +5 -5
  194. data/src/core/ext/transport/chttp2/transport/frame_security.cc +1 -1
  195. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -15
  196. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +3 -3
  197. data/src/core/ext/transport/chttp2/transport/goaway.cc +129 -0
  198. data/src/core/ext/transport/chttp2/transport/goaway.h +350 -0
  199. data/src/core/ext/transport/chttp2/transport/header_assembler.h +175 -51
  200. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +1 -1
  201. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -4
  202. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +1 -1
  203. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +3 -3
  204. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -7
  205. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -4
  206. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +4 -4
  207. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +1 -1
  208. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1177 -511
  209. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +264 -174
  210. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  211. data/src/core/ext/transport/chttp2/transport/http2_settings.h +6 -4
  212. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +4 -6
  213. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +6 -16
  214. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +320 -82
  215. data/src/core/ext/transport/chttp2/transport/http2_status.h +7 -1
  216. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +286 -7
  217. data/src/core/ext/transport/chttp2/transport/http2_transport.h +187 -19
  218. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +57 -1
  219. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +128 -0
  220. data/src/core/ext/transport/chttp2/transport/internal.h +25 -5
  221. data/src/core/ext/transport/chttp2/transport/keepalive.cc +12 -5
  222. data/src/core/ext/transport/chttp2/transport/keepalive.h +14 -10
  223. data/src/core/ext/transport/chttp2/transport/message_assembler.h +24 -15
  224. data/src/core/ext/transport/chttp2/transport/parsing.cc +8 -8
  225. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +1 -1
  226. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +3 -3
  227. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +11 -5
  228. data/src/core/ext/transport/chttp2/transport/ping_promise.h +7 -3
  229. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +1 -1
  230. data/src/core/ext/transport/chttp2/transport/security_frame.cc +31 -0
  231. data/src/core/ext/transport/chttp2/transport/security_frame.h +32 -0
  232. data/src/core/ext/transport/chttp2/transport/stream.h +139 -59
  233. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +225 -98
  234. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +1 -1
  235. data/src/core/ext/transport/chttp2/transport/transport_common.cc +1 -1
  236. data/src/core/ext/transport/chttp2/transport/transport_common.h +5 -0
  237. data/src/core/ext/transport/chttp2/transport/writable_streams.h +27 -11
  238. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -3
  239. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -2
  240. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +8 -5
  241. data/src/core/filter/auth/auth_filters.h +7 -1
  242. data/src/core/filter/auth/client_auth_filter.cc +2 -2
  243. data/src/core/filter/auth/server_auth_filter.cc +3 -3
  244. data/src/core/filter/blackboard.h +2 -2
  245. data/src/core/filter/filter_args.h +40 -2
  246. data/src/core/handshaker/endpoint_info/endpoint_info_handshaker.cc +2 -2
  247. data/src/core/handshaker/handshaker.cc +5 -5
  248. data/src/core/handshaker/handshaker.h +2 -2
  249. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +5 -5
  250. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +11 -11
  251. data/src/core/handshaker/http_connect/http_proxy_mapper.h +1 -1
  252. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  253. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.h +1 -1
  254. data/src/core/handshaker/proxy_mapper.h +1 -1
  255. data/src/core/handshaker/proxy_mapper_registry.h +1 -1
  256. data/src/core/handshaker/security/legacy_secure_endpoint.cc +4 -4
  257. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +7 -7
  258. data/src/core/handshaker/security/secure_endpoint.cc +15 -5
  259. data/src/core/handshaker/security/security_handshaker.cc +8 -5
  260. data/src/core/handshaker/security/security_handshaker.h +1 -1
  261. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  262. data/src/core/lib/address_utils/parse_address.cc +5 -5
  263. data/src/core/lib/address_utils/parse_address.h +2 -2
  264. data/src/core/lib/address_utils/sockaddr_utils.cc +4 -4
  265. data/src/core/lib/address_utils/sockaddr_utils.h +1 -1
  266. data/src/core/lib/channel/channel_args.cc +1 -1
  267. data/src/core/lib/channel/channel_args.h +2 -2
  268. data/src/core/lib/channel/channel_stack.cc +22 -21
  269. data/src/core/lib/channel/channel_stack.h +5 -3
  270. data/src/core/lib/channel/channel_stack_builder.cc +8 -4
  271. data/src/core/lib/channel/channel_stack_builder.h +10 -9
  272. data/src/core/lib/channel/channel_stack_builder_impl.cc +7 -13
  273. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -1
  274. data/src/core/lib/channel/connected_channel.cc +2 -2
  275. data/src/core/lib/channel/promise_based_filter.cc +63 -8
  276. data/src/core/lib/channel/promise_based_filter.h +23 -8
  277. data/src/core/lib/compression/compression_internal.cc +4 -4
  278. data/src/core/lib/compression/compression_internal.h +1 -1
  279. data/src/core/lib/compression/message_compress.cc +1 -1
  280. data/src/core/lib/debug/trace.cc +2 -5
  281. data/src/core/lib/debug/trace.h +10 -0
  282. data/src/core/lib/debug/trace_flags.cc +2 -2
  283. data/src/core/lib/debug/trace_flags.h +1 -1
  284. data/src/core/lib/event_engine/ares_resolver.cc +8 -8
  285. data/src/core/lib/event_engine/ares_resolver.h +4 -4
  286. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  287. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +2 -2
  288. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +1 -1
  289. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +2 -2
  290. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -1
  291. data/src/core/lib/event_engine/channel_args_endpoint_config.h +1 -1
  292. data/src/core/lib/event_engine/default_event_engine.cc +1 -1
  293. data/src/core/lib/event_engine/event_engine.cc +1 -1
  294. data/src/core/lib/event_engine/extensions/channelz.h +1 -1
  295. data/src/core/lib/event_engine/extensions/chaotic_good_extension.h +1 -1
  296. data/src/core/lib/event_engine/extensions/tcp_trace.h +8 -1
  297. data/src/core/lib/event_engine/grpc_polled_fd.h +1 -1
  298. data/src/core/lib/event_engine/memory_allocator_factory.h +1 -1
  299. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +4 -4
  300. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +5 -5
  301. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +5 -5
  302. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +3 -3
  303. data/src/core/lib/event_engine/posix_engine/event_poller.h +2 -2
  304. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +2 -2
  305. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +1 -1
  306. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +1 -1
  307. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +4 -4
  308. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +1 -1
  309. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +1 -1
  310. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +1 -1
  311. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +3 -3
  312. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +1 -1
  313. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +5 -5
  314. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +6 -6
  315. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +7 -7
  316. data/src/core/lib/event_engine/posix_engine/posix_engine.h +7 -7
  317. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +7 -4
  318. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +4 -4
  319. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +4 -4
  320. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +1 -1
  321. data/src/core/lib/event_engine/posix_engine/posix_interface.h +1 -1
  322. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +5 -5
  323. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +1 -1
  324. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  325. data/src/core/lib/event_engine/posix_engine/timer.h +1 -1
  326. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +2 -2
  327. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  328. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -2
  329. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +2 -2
  330. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +1 -1
  331. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +2 -2
  332. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +1 -1
  333. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +2 -2
  334. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +1 -1
  335. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +2 -2
  336. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +1 -1
  337. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +1 -1
  338. data/src/core/lib/event_engine/tcp_socket_utils.cc +4 -4
  339. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  340. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  341. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -4
  342. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -3
  343. data/src/core/lib/event_engine/utils.cc +3 -3
  344. data/src/core/lib/event_engine/utils.h +1 -1
  345. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +1 -1
  346. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +2 -2
  347. data/src/core/lib/event_engine/windows/iocp.cc +1 -1
  348. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  349. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +5 -2
  350. data/src/core/lib/event_engine/windows/win_socket.cc +1 -1
  351. data/src/core/lib/event_engine/windows/win_socket.h +2 -2
  352. data/src/core/lib/event_engine/windows/windows_endpoint.cc +5 -5
  353. data/src/core/lib/event_engine/windows/windows_engine.cc +4 -4
  354. data/src/core/lib/event_engine/windows/windows_engine.h +3 -3
  355. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  356. data/src/core/lib/event_engine/windows/windows_listener.h +2 -2
  357. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +2 -2
  358. data/src/core/lib/experiments/config.cc +4 -4
  359. data/src/core/lib/experiments/experiments.cc +174 -48
  360. data/src/core/lib/experiments/experiments.h +76 -24
  361. data/src/core/lib/iomgr/buffer_list.cc +1 -1
  362. data/src/core/lib/iomgr/call_combiner.cc +1 -1
  363. data/src/core/lib/iomgr/call_combiner.h +2 -2
  364. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  365. data/src/core/lib/iomgr/closure.h +2 -2
  366. data/src/core/lib/iomgr/combiner.cc +2 -2
  367. data/src/core/lib/iomgr/endpoint.h +1 -1
  368. data/src/core/lib/iomgr/endpoint_cfstream.cc +1 -1
  369. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  370. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  371. data/src/core/lib/iomgr/error.cc +1 -1
  372. data/src/core/lib/iomgr/error.h +2 -2
  373. data/src/core/lib/iomgr/error_cfstream.cc +1 -1
  374. data/src/core/lib/iomgr/ev_apple.cc +1 -1
  375. data/src/core/lib/iomgr/ev_epoll1_linux.cc +4 -4
  376. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  377. data/src/core/lib/iomgr/ev_posix.cc +3 -3
  378. data/src/core/lib/iomgr/event_engine_shims/closure.cc +3 -3
  379. data/src/core/lib/iomgr/event_engine_shims/closure.h +1 -1
  380. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +5 -5
  381. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +2 -2
  382. data/src/core/lib/iomgr/exec_ctx.cc +3 -3
  383. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  384. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  385. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  386. data/src/core/lib/iomgr/iocp_windows.cc +1 -1
  387. data/src/core/lib/iomgr/iomgr.cc +1 -1
  388. data/src/core/lib/iomgr/lockfree_event.cc +1 -1
  389. data/src/core/lib/iomgr/polling_entity.cc +1 -1
  390. data/src/core/lib/iomgr/resolve_address.cc +1 -1
  391. data/src/core/lib/iomgr/resolve_address.h +2 -2
  392. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -4
  393. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  394. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +1 -1
  395. data/src/core/lib/iomgr/socket_utils_common_posix.cc +2 -2
  396. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  397. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -1
  398. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  399. data/src/core/lib/iomgr/tcp_posix.cc +5 -5
  400. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -9
  401. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  402. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -2
  403. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  404. data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
  405. data/src/core/lib/iomgr/tcp_windows.cc +1 -1
  406. data/src/core/lib/iomgr/timer_generic.cc +3 -3
  407. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  408. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  409. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  410. data/src/core/lib/iomgr/vsock.cc +1 -1
  411. data/src/core/lib/iomgr/vsock.h +1 -1
  412. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +1 -1
  413. data/src/core/lib/promise/activity.cc +2 -2
  414. data/src/core/lib/promise/activity.h +5 -4
  415. data/src/core/lib/promise/all_ok.h +3 -3
  416. data/src/core/lib/promise/arena_promise.h +47 -6
  417. data/src/core/lib/promise/context.h +1 -1
  418. data/src/core/lib/promise/detail/join_state.h +1 -1
  419. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  420. data/src/core/lib/promise/detail/promise_like.h +1 -1
  421. data/src/core/lib/promise/detail/seq_state.h +3 -3
  422. data/src/core/lib/promise/detail/status.h +1 -1
  423. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +1 -1
  424. data/src/core/lib/promise/for_each.h +3 -3
  425. data/src/core/lib/promise/if.h +1 -1
  426. data/src/core/lib/promise/inter_activity_latch.h +3 -3
  427. data/src/core/lib/promise/inter_activity_mutex.h +1 -1
  428. data/src/core/lib/promise/interceptor_list.h +3 -3
  429. data/src/core/lib/promise/latch.h +2 -2
  430. data/src/core/lib/promise/loop.h +2 -2
  431. data/src/core/lib/promise/map.h +2 -2
  432. data/src/core/lib/promise/mpsc.cc +5 -4
  433. data/src/core/lib/promise/observable.h +2 -2
  434. data/src/core/lib/promise/party.cc +14 -8
  435. data/src/core/lib/promise/party.h +11 -4
  436. data/src/core/lib/promise/pipe.h +16 -2
  437. data/src/core/lib/promise/poll.h +2 -2
  438. data/src/core/lib/promise/promise.h +2 -2
  439. data/src/core/lib/promise/sleep.h +1 -1
  440. data/src/core/lib/promise/status_flag.h +2 -2
  441. data/src/core/lib/promise/try_join.h +3 -3
  442. data/src/core/lib/promise/try_seq.h +3 -3
  443. data/src/core/lib/promise/wait_set.h +2 -2
  444. data/src/core/lib/resource_quota/api.cc +1 -1
  445. data/src/core/lib/resource_quota/arena.cc +1 -1
  446. data/src/core/lib/resource_quota/connection_quota.h +1 -1
  447. data/src/core/lib/resource_quota/memory_quota.cc +3 -3
  448. data/src/core/lib/resource_quota/memory_quota.h +9 -5
  449. data/src/core/lib/resource_quota/periodic_update.h +1 -1
  450. data/src/core/lib/resource_quota/resource_quota.cc +8 -0
  451. data/src/core/lib/resource_quota/resource_quota.h +2 -1
  452. data/src/core/lib/resource_quota/stream_quota.cc +22 -0
  453. data/src/core/lib/resource_quota/stream_quota.h +31 -0
  454. data/src/core/lib/resource_quota/telemetry.h +1 -0
  455. data/src/core/lib/resource_quota/thread_quota.h +1 -1
  456. data/src/core/lib/security/authorization/audit_logging.cc +3 -3
  457. data/src/core/lib/security/authorization/audit_logging.h +1 -1
  458. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  459. data/src/core/lib/security/authorization/evaluate_args.cc +5 -5
  460. data/src/core/lib/security/authorization/evaluate_args.h +1 -1
  461. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +3 -3
  462. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +4 -1
  463. data/src/core/lib/security/authorization/matchers.cc +2 -2
  464. data/src/core/lib/security/authorization/stdout_logger.cc +1 -1
  465. data/src/core/lib/slice/percent_encoding.cc +1 -1
  466. data/src/core/lib/slice/slice.cc +1 -1
  467. data/src/core/lib/slice/slice.h +2 -2
  468. data/src/core/lib/slice/slice_buffer.cc +1 -1
  469. data/src/core/lib/slice/slice_internal.h +1 -1
  470. data/src/core/lib/surface/call.cc +42 -14
  471. data/src/core/lib/surface/call.h +12 -5
  472. data/src/core/lib/surface/call_log_batch.cc +2 -2
  473. data/src/core/lib/surface/call_utils.cc +5 -5
  474. data/src/core/lib/surface/call_utils.h +83 -18
  475. data/src/core/lib/surface/channel.cc +2 -1
  476. data/src/core/lib/surface/channel.h +13 -3
  477. data/src/core/lib/surface/channel_create.cc +2 -2
  478. data/src/core/lib/surface/channel_create.h +1 -1
  479. data/src/core/lib/surface/channel_init.cc +5 -5
  480. data/src/core/lib/surface/channel_init.h +4 -2
  481. data/src/core/lib/surface/completion_queue.cc +4 -4
  482. data/src/core/lib/surface/filter_stack_call.cc +13 -8
  483. data/src/core/lib/surface/filter_stack_call.h +3 -3
  484. data/src/core/lib/surface/init.cc +4 -4
  485. data/src/core/lib/surface/lame_client.cc +2 -2
  486. data/src/core/lib/surface/lame_client.h +3 -3
  487. data/src/core/lib/surface/legacy_channel.cc +3 -3
  488. data/src/core/lib/surface/legacy_channel.h +1 -1
  489. data/src/core/lib/surface/validate_metadata.cc +2 -2
  490. data/src/core/lib/surface/validate_metadata.h +1 -1
  491. data/src/core/lib/surface/version.cc +2 -2
  492. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  493. data/src/core/lib/transport/bdp_estimator.h +2 -2
  494. data/src/core/lib/transport/connectivity_state.cc +1 -1
  495. data/src/core/lib/transport/connectivity_state.h +2 -2
  496. data/src/core/lib/transport/error_utils.h +1 -1
  497. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  498. data/src/core/lib/transport/promise_endpoint.h +3 -3
  499. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  500. data/src/core/lib/transport/transport.cc +3 -3
  501. data/src/core/lib/transport/transport.h +62 -4
  502. data/src/core/lib/transport/transport_framing_endpoint_extension.h +1 -1
  503. data/src/core/lib/transport/transport_op_string.cc +2 -2
  504. data/src/core/load_balancing/address_filtering.cc +1 -1
  505. data/src/core/load_balancing/address_filtering.h +2 -2
  506. data/src/core/load_balancing/backend_metric_parser.cc +1 -1
  507. data/src/core/load_balancing/backend_metric_parser.h +1 -1
  508. data/src/core/load_balancing/child_policy_handler.cc +4 -4
  509. data/src/core/load_balancing/child_policy_handler.h +2 -2
  510. data/src/core/load_balancing/delegating_helper.h +2 -2
  511. data/src/core/load_balancing/endpoint_list.cc +4 -4
  512. data/src/core/load_balancing/endpoint_list.h +2 -2
  513. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +7 -5
  514. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +5 -1
  515. data/src/core/load_balancing/grpclb/grpclb.cc +13 -24
  516. data/src/core/load_balancing/grpclb/grpclb_client_stats.h +2 -2
  517. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  518. data/src/core/load_balancing/grpclb/load_balancer_api.h +1 -1
  519. data/src/core/load_balancing/health_check_client.cc +9 -5
  520. data/src/core/load_balancing/health_check_client_internal.h +3 -3
  521. data/src/core/load_balancing/lb_policy.h +11 -8
  522. data/src/core/load_balancing/lb_policy_factory.h +2 -2
  523. data/src/core/load_balancing/lb_policy_registry.cc +2 -2
  524. data/src/core/load_balancing/lb_policy_registry.h +2 -2
  525. data/src/core/load_balancing/oob_backend_metric.cc +7 -3
  526. data/src/core/load_balancing/oob_backend_metric_internal.h +2 -2
  527. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +7 -15
  528. data/src/core/load_balancing/pick_first/pick_first.cc +48 -18
  529. data/src/core/load_balancing/priority/priority.cc +6 -6
  530. data/src/core/load_balancing/ring_hash/ring_hash.cc +8 -8
  531. data/src/core/load_balancing/rls/rls.cc +10 -10
  532. data/src/core/load_balancing/round_robin/round_robin.cc +7 -7
  533. data/src/core/load_balancing/subchannel_interface.h +2 -2
  534. data/src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc +1 -1
  535. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +9 -15
  536. data/src/core/load_balancing/weighted_target/weighted_target.cc +9 -9
  537. data/src/core/load_balancing/xds/cds.cc +5 -5
  538. data/src/core/load_balancing/xds/xds_cluster_impl.cc +22 -39
  539. data/src/core/load_balancing/xds/xds_cluster_manager.cc +6 -6
  540. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  541. data/src/core/load_balancing/xds/xds_override_host.h +1 -1
  542. data/src/core/load_balancing/xds/xds_wrr_locality.cc +5 -5
  543. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +8 -8
  544. data/src/core/resolver/dns/c_ares/dns_resolver_ares.h +1 -1
  545. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  546. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  547. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -2
  548. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +6 -6
  549. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -2
  550. data/src/core/resolver/dns/dns_resolver_plugin.cc +2 -2
  551. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +8 -8
  552. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.h +1 -1
  553. data/src/core/resolver/dns/event_engine/service_config_helper.cc +2 -2
  554. data/src/core/resolver/dns/native/dns_resolver.cc +7 -7
  555. data/src/core/resolver/endpoint_addresses.cc +4 -4
  556. data/src/core/resolver/endpoint_addresses.h +1 -1
  557. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  558. data/src/core/resolver/fake/fake_resolver.h +3 -3
  559. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +5 -5
  560. data/src/core/resolver/polling_resolver.cc +5 -5
  561. data/src/core/resolver/polling_resolver.h +1 -1
  562. data/src/core/resolver/resolver.h +2 -2
  563. data/src/core/resolver/resolver_factory.h +2 -2
  564. data/src/core/resolver/resolver_registry.cc +1 -1
  565. data/src/core/resolver/resolver_registry.h +1 -1
  566. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +4 -4
  567. data/src/core/resolver/xds/xds_config.cc +1 -1
  568. data/src/core/resolver/xds/xds_config.h +3 -3
  569. data/src/core/resolver/xds/xds_dependency_manager.cc +2 -2
  570. data/src/core/resolver/xds/xds_dependency_manager.h +3 -3
  571. data/src/core/resolver/xds/xds_resolver.cc +16 -13
  572. data/src/core/resolver/xds/xds_resolver_attributes.h +1 -1
  573. data/src/core/server/add_port.cc +2 -2
  574. data/src/core/server/server.cc +9 -5
  575. data/src/core/server/server.h +8 -7
  576. data/src/core/server/server_call_tracer_filter.cc +1 -1
  577. data/src/core/server/server_call_tracer_filter.h +5 -1
  578. data/src/core/server/server_config_selector.h +2 -2
  579. data/src/core/server/server_config_selector_filter.cc +3 -3
  580. data/src/core/server/xds_channel_stack_modifier.cc +3 -2
  581. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  582. data/src/core/server/xds_server_config_fetcher.cc +10 -10
  583. data/src/core/service_config/service_config.h +1 -1
  584. data/src/core/service_config/service_config_channel_arg_filter.h +4 -1
  585. data/src/core/service_config/service_config_impl.cc +3 -3
  586. data/src/core/service_config/service_config_impl.h +2 -2
  587. data/src/core/service_config/service_config_parser.h +1 -1
  588. data/src/core/telemetry/call_tracer.h +2 -2
  589. data/src/core/telemetry/default_tcp_tracer.h +3 -3
  590. data/src/core/telemetry/histogram.h +1 -1
  591. data/src/core/telemetry/instrument.cc +550 -270
  592. data/src/core/telemetry/instrument.h +301 -128
  593. data/src/core/telemetry/metrics.cc +2 -0
  594. data/src/core/telemetry/metrics.h +33 -4
  595. data/src/core/telemetry/stats.h +2 -2
  596. data/src/core/telemetry/stats_data.cc +1 -1
  597. data/src/core/telemetry/stats_data.h +2 -2
  598. data/src/core/transport/auth_context.cc +1 -1
  599. data/src/core/transport/auth_context.h +2 -1
  600. data/src/core/transport/auth_context_comparator_registry.h +1 -1
  601. data/src/core/tsi/alts/crypt/aes_gcm.cc +1 -1
  602. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +2 -2
  603. data/src/core/tsi/alts/frame_protector/frame_handler.cc +1 -1
  604. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  605. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  606. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +9 -7
  607. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +1 -1
  608. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  609. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +1 -1
  610. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +11 -3
  611. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +10 -0
  612. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +9 -1
  613. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +3 -0
  614. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +15 -2
  615. data/src/core/tsi/fake_transport_security.cc +2 -1
  616. data/src/core/tsi/local_transport_security.cc +1 -1
  617. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +1 -1
  618. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +1 -1
  619. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  620. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  621. data/src/core/tsi/ssl_transport_security.cc +6 -6
  622. data/src/core/tsi/ssl_transport_security.h +1 -1
  623. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  624. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  625. data/src/core/tsi/transport_security_grpc.cc +8 -0
  626. data/src/core/tsi/transport_security_grpc.h +15 -0
  627. data/src/core/util/alloc.cc +1 -1
  628. data/src/core/util/backoff.h +1 -1
  629. data/src/core/util/crash.h +1 -1
  630. data/src/core/util/dual_ref_counted.h +2 -2
  631. data/src/core/util/event_log.cc +1 -1
  632. data/src/core/util/event_log.h +3 -3
  633. data/src/core/util/gcp_metadata_query.cc +5 -5
  634. data/src/core/util/gcp_metadata_query.h +2 -2
  635. data/src/core/util/grpc_check.cc +2 -0
  636. data/src/core/util/grpc_check.h +1 -1
  637. data/src/core/util/grpc_if_nametoindex_posix.cc +1 -1
  638. data/src/core/util/grpc_if_nametoindex_unsupported.cc +1 -1
  639. data/src/core/util/http_client/format_request.cc +1 -1
  640. data/src/core/util/http_client/httpcli.cc +3 -3
  641. data/src/core/util/http_client/httpcli.h +4 -4
  642. data/src/core/util/http_client/httpcli_security_connector.cc +4 -4
  643. data/src/core/util/http_client/parser.cc +1 -1
  644. data/src/core/util/json/json_channel_args.h +1 -1
  645. data/src/core/util/json/json_object_loader.h +6 -6
  646. data/src/core/util/json/json_reader.cc +2 -2
  647. data/src/core/util/json/json_reader.h +1 -1
  648. data/src/core/util/json/json_util.h +3 -3
  649. data/src/core/util/json/json_writer.cc +1 -1
  650. data/src/core/util/latent_see.cc +45 -24
  651. data/src/core/util/latent_see.h +192 -24
  652. data/src/core/util/linux/cpu.cc +1 -1
  653. data/src/core/util/load_file.cc +1 -1
  654. data/src/core/util/load_file.h +1 -1
  655. data/src/core/util/log.cc +3 -3
  656. data/src/core/util/lru_cache.h +1 -1
  657. data/src/core/util/matchers.h +1 -1
  658. data/src/core/util/memory_usage.h +3 -3
  659. data/src/core/util/mpscq.h +1 -1
  660. data/src/core/util/notification.h +1 -1
  661. data/src/core/util/posix/cpu.cc +1 -1
  662. data/src/core/util/posix/stat.cc +2 -2
  663. data/src/core/util/posix/thd.cc +2 -2
  664. data/src/core/util/posix/tmpfile.cc +2 -2
  665. data/src/core/util/ref_counted.h +2 -2
  666. data/src/core/util/ref_counted_ptr.h +1 -1
  667. data/src/core/util/ref_counted_string.h +1 -1
  668. data/src/core/util/single_set_ptr.h +3 -1
  669. data/src/core/util/status_helper.cc +8 -8
  670. data/src/core/util/status_helper.h +1 -1
  671. data/src/core/util/string.cc +2 -2
  672. data/src/core/util/sync_abseil.cc +1 -1
  673. data/src/core/util/table.h +1 -1
  674. data/src/core/util/time.cc +1 -1
  675. data/src/core/util/time_precise.cc +1 -1
  676. data/src/core/util/unique_ptr_with_bitset.h +1 -1
  677. data/src/core/util/unique_type_name.h +1 -1
  678. data/src/core/util/upb_utils.h +6 -1
  679. data/src/core/util/validation_errors.cc +2 -2
  680. data/src/core/util/validation_errors.h +2 -3
  681. data/src/core/util/wait_for_single_owner.h +2 -2
  682. data/src/core/util/windows/directory_reader.cc +1 -1
  683. data/src/core/util/windows/stat.cc +2 -2
  684. data/src/core/util/windows/thd.cc +2 -2
  685. data/src/core/util/windows/time.cc +1 -1
  686. data/src/core/util/work_serializer.cc +3 -3
  687. data/src/core/util/work_serializer.h +2 -2
  688. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  689. data/src/core/xds/grpc/certificate_provider_store.h +2 -2
  690. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  691. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +1 -1
  692. data/src/core/xds/grpc/xds_audit_logger_registry.cc +3 -3
  693. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  694. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +7 -7
  695. data/src/core/xds/grpc/xds_bootstrap_grpc.h +2 -2
  696. data/src/core/xds/grpc/xds_certificate_provider.cc +1 -1
  697. data/src/core/xds/grpc/xds_certificate_provider.h +2 -2
  698. data/src/core/xds/grpc/xds_client_grpc.cc +5 -5
  699. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  700. data/src/core/xds/grpc/xds_cluster.cc +2 -2
  701. data/src/core/xds/grpc/xds_cluster.h +1 -1
  702. data/src/core/xds/grpc/xds_cluster_parser.cc +5 -5
  703. data/src/core/xds/grpc/xds_cluster_parser.h +1 -1
  704. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  705. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  706. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  707. data/src/core/xds/grpc/xds_common_types.h +1 -1
  708. data/src/core/xds/grpc/xds_common_types_parser.cc +5 -5
  709. data/src/core/xds/grpc/xds_endpoint.h +2 -2
  710. data/src/core/xds/grpc/xds_endpoint_parser.cc +5 -5
  711. data/src/core/xds/grpc/xds_endpoint_parser.h +1 -1
  712. data/src/core/xds/grpc/xds_health_status.cc +1 -1
  713. data/src/core/xds/grpc/xds_health_status.h +1 -1
  714. data/src/core/xds/grpc/xds_http_fault_filter.cc +4 -4
  715. data/src/core/xds/grpc/xds_http_fault_filter.h +2 -2
  716. data/src/core/xds/grpc/xds_http_filter.h +3 -3
  717. data/src/core/xds/grpc/xds_http_filter_registry.h +2 -2
  718. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +3 -3
  719. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +2 -2
  720. data/src/core/xds/grpc/xds_http_rbac_filter.cc +4 -4
  721. data/src/core/xds/grpc/xds_http_rbac_filter.h +2 -2
  722. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +3 -3
  723. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +2 -2
  724. data/src/core/xds/grpc/xds_lb_policy_registry.cc +1 -1
  725. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  726. data/src/core/xds/grpc/xds_listener.cc +2 -2
  727. data/src/core/xds/grpc/xds_listener_parser.cc +6 -6
  728. data/src/core/xds/grpc/xds_listener_parser.h +1 -1
  729. data/src/core/xds/grpc/xds_matcher.cc +1 -1
  730. data/src/core/xds/grpc/xds_matcher.h +3 -3
  731. data/src/core/xds/grpc/xds_matcher_input.h +1 -1
  732. data/src/core/xds/grpc/xds_metadata.cc +1 -1
  733. data/src/core/xds/grpc/xds_metadata.h +3 -3
  734. data/src/core/xds/grpc/xds_metadata_parser.cc +2 -2
  735. data/src/core/xds/grpc/xds_route_config.cc +3 -3
  736. data/src/core/xds/grpc/xds_route_config_parser.cc +8 -8
  737. data/src/core/xds/grpc/xds_route_config_parser.h +1 -1
  738. data/src/core/xds/grpc/xds_routing.cc +4 -4
  739. data/src/core/xds/grpc/xds_routing.h +2 -2
  740. data/src/core/xds/grpc/xds_server_grpc.cc +2 -2
  741. data/src/core/xds/grpc/xds_transport_grpc.cc +1 -1
  742. data/src/core/xds/grpc/xds_transport_grpc.h +2 -2
  743. data/src/core/xds/xds_client/lrs_client.cc +3 -3
  744. data/src/core/xds/xds_client/lrs_client.h +4 -4
  745. data/src/core/xds/xds_client/xds_api.h +1 -1
  746. data/src/core/xds/xds_client/xds_backend_metric_propagation.cc +1 -1
  747. data/src/core/xds/xds_client/xds_backend_metric_propagation.h +1 -1
  748. data/src/core/xds/xds_client/xds_client.cc +8 -8
  749. data/src/core/xds/xds_client/xds_client.h +5 -5
  750. data/src/core/xds/xds_client/xds_locality.h +2 -2
  751. data/src/core/xds/xds_client/xds_resource_type.h +2 -2
  752. data/src/core/xds/xds_client/xds_resource_type_impl.h +1 -1
  753. data/src/core/xds/xds_client/xds_transport.h +2 -2
  754. data/src/ruby/ext/grpc/extconf.rb +14 -12
  755. data/src/ruby/ext/grpc/rb_call.c +0 -1
  756. data/src/ruby/ext/grpc/rb_channel_args.c +0 -1
  757. data/src/ruby/ext/grpc/rb_channel_credentials.c +0 -1
  758. data/src/ruby/ext/grpc/rb_compression_options.c +0 -1
  759. data/src/ruby/ext/grpc/rb_server_credentials.c +0 -1
  760. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +0 -1
  761. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +0 -1
  762. data/src/ruby/lib/grpc/version.rb +1 -1
  763. metadata +16 -6
@@ -29,11 +29,20 @@
29
29
  // unique combination of label values within a domain creates a separate
30
30
  // instance of the instrumentation storage.
31
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
+ //
32
39
  // * **Storage:** An object holding the current values for all instruments
33
- // within a domain, for a *specific combination* of label values. Storage
34
- // objects are ref-counted and managed by the domain. You obtain a
35
- // `RefCountedPtr<Storage>` using `Domain::GetStorage(...)`, passing the
36
- // current label values.
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).
37
46
  //
38
47
  // * **Backend:** Determines how the metric data is stored and aggregated
39
48
  // within a Storage object. Examples include `LowContentionBackend` and
@@ -105,7 +114,8 @@
105
114
  // };
106
115
  //
107
116
  // To increment the counter:
108
- // auto storage = MyDomain::GetStorage("label_val1", "label_val2");
117
+ // auto scope = CreateCollectionScope({}, {}); // Or some other scope
118
+ // auto storage = MyDomain::GetStorage(scope, "label_val1", "label_val2");
109
119
  // storage->Increment(MyDomain::kMyCounter);
110
120
  //
111
121
  // To set the gauge (inside a callback):
@@ -116,6 +126,9 @@
116
126
  // The `MetricsQuery` class is used to fetch metric data. You can filter by
117
127
  // label values, select specific metrics, and collapse labels (aggregate over
118
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.
119
132
  //
120
133
  // ## Aggregability
121
134
  //
@@ -126,6 +139,35 @@
126
139
  // includes gauges is not meaningful, as summing up current values from
127
140
  // different sources makes no sense. The `MetricsSink` will receive
128
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.
129
171
 
130
172
  #ifndef GRPC_SRC_CORE_TELEMETRY_INSTRUMENT_H
131
173
  #define GRPC_SRC_CORE_TELEMETRY_INSTRUMENT_H
@@ -134,40 +176,50 @@
134
176
  #include <grpc/support/port_platform.h>
135
177
 
136
178
  #include <algorithm>
137
- #include <array>
138
179
  #include <atomic>
180
+ #include <cstddef>
139
181
  #include <cstdint>
140
182
  #include <memory>
141
183
  #include <optional>
142
184
  #include <string>
143
185
  #include <tuple>
186
+ #include <type_traits>
144
187
  #include <utility>
145
188
  #include <variant>
146
189
  #include <vector>
147
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"
148
201
  #include "absl/base/thread_annotations.h"
149
202
  #include "absl/container/flat_hash_map.h"
150
203
  #include "absl/container/flat_hash_set.h"
151
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"
152
208
  #include "absl/log/log.h"
153
209
  #include "absl/strings/str_cat.h"
154
210
  #include "absl/strings/string_view.h"
155
211
  #include "absl/types/span.h"
156
- #include "src/core/telemetry/histogram.h"
157
- #include "src/core/util/avl.h"
158
- #include "src/core/util/dual_ref_counted.h"
159
- #include "src/core/util/match.h"
160
- #include "src/core/util/per_cpu.h"
161
- #include "src/core/util/ref_counted_ptr.h"
162
- #include "src/core/util/sync.h"
163
212
 
164
213
  namespace grpc_core {
165
214
 
166
215
  class InstrumentTest;
216
+ class GlobalCollectionScopeManager;
217
+
218
+ static constexpr absl::string_view kOmittedLabel = "<omitted>";
167
219
 
168
220
  namespace instrument_detail {
169
221
  class QueryableDomain;
170
- class StorageSet;
222
+ class DomainStorage;
171
223
  } // namespace instrument_detail
172
224
 
173
225
  class CollectionScope;
@@ -175,13 +227,14 @@ class CollectionScope;
175
227
  class InstrumentMetadata {
176
228
  public:
177
229
  struct CounterShape {};
230
+ struct UpDownCounterShape {};
178
231
  struct DoubleGaugeShape {};
179
232
  struct IntGaugeShape {};
180
233
  struct UintGaugeShape {};
181
234
  using HistogramShape = HistogramBuckets;
182
235
 
183
- using Shape = std::variant<CounterShape, HistogramShape, DoubleGaugeShape,
184
- IntGaugeShape, UintGaugeShape>;
236
+ using Shape = std::variant<CounterShape, UpDownCounterShape, HistogramShape,
237
+ DoubleGaugeShape, IntGaugeShape, UintGaugeShape>;
185
238
 
186
239
  // A description of a metric.
187
240
  struct Description {
@@ -218,20 +271,60 @@ using HistogramCollectionHook = absl::AnyInvocable<void(
218
271
  absl::Span<const std::string> labels, int64_t value)>;
219
272
  void RegisterHistogramCollectionHook(HistogramCollectionHook hook);
220
273
 
221
- // A CollectionScope ensures that all metric updates in its lifetime are visible
222
- // to a MetricsQuery.
223
- class CollectionScope {
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> {
224
279
  public:
225
- explicit CollectionScope(
226
- std::vector<std::unique_ptr<instrument_detail::StorageSet>> storage_sets);
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;
227
284
 
228
285
  size_t TestOnlyCountStorageHeld() const;
229
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
+
230
296
  private:
297
+ friend class GlobalCollectionScopeManager;
231
298
  friend class MetricsQuery;
232
- std::vector<instrument_detail::StorageSet*> GetStorageSets();
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
+ };
233
308
 
234
- std::vector<std::unique_ptr<instrument_detail::StorageSet>> storage_sets_;
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();
235
328
  };
236
329
 
237
330
  namespace instrument_detail {
@@ -245,28 +338,28 @@ class GaugeStorage {
245
338
  explicit GaugeStorage(QueryableDomain* domain);
246
339
 
247
340
  void SetDouble(uint64_t offset, double value) {
248
- DCHECK_LT(offset, double_gauges_.size());
341
+ GRPC_DCHECK_LT(offset, double_gauges_.size());
249
342
  double_gauges_[offset] = value;
250
343
  }
251
344
  void SetInt(uint64_t offset, int64_t value) {
252
- DCHECK_LT(offset, int_gauges_.size());
345
+ GRPC_DCHECK_LT(offset, int_gauges_.size());
253
346
  int_gauges_[offset] = value;
254
347
  }
255
348
  void SetUint(uint64_t offset, uint64_t value) {
256
- DCHECK_LT(offset, uint_gauges_.size());
349
+ GRPC_DCHECK_LT(offset, uint_gauges_.size());
257
350
  uint_gauges_[offset] = value;
258
351
  }
259
352
 
260
353
  std::optional<double> GetDouble(uint64_t offset) const {
261
- DCHECK_LT(offset, double_gauges_.size());
354
+ GRPC_DCHECK_LT(offset, double_gauges_.size());
262
355
  return double_gauges_[offset];
263
356
  }
264
357
  std::optional<int64_t> GetInt(uint64_t offset) const {
265
- DCHECK_LT(offset, int_gauges_.size());
358
+ GRPC_DCHECK_LT(offset, int_gauges_.size());
266
359
  return int_gauges_[offset];
267
360
  }
268
361
  std::optional<uint64_t> GetUint(uint64_t offset) const {
269
- DCHECK_LT(offset, uint_gauges_.size());
362
+ GRPC_DCHECK_LT(offset, uint_gauges_.size());
270
363
  return uint_gauges_[offset];
271
364
  }
272
365
 
@@ -276,51 +369,29 @@ class GaugeStorage {
276
369
  std::vector<std::optional<uint64_t>> uint_gauges_;
277
370
  };
278
371
 
279
- class DomainStorage : public DualRefCounted<DomainStorage> {
372
+ class DomainStorage : public DualRefCounted<DomainStorage>,
373
+ public channelz::DataSource {
280
374
  public:
281
375
  DomainStorage(QueryableDomain* domain, std::vector<std::string> label);
282
376
 
283
377
  void Orphaned() override;
284
378
 
285
379
  virtual uint64_t SumCounter(size_t index) = 0;
380
+ virtual void Add(DomainStorage* other) = 0;
286
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.
287
385
  absl::Span<const std::string> label() const { return label_; }
288
386
  QueryableDomain* domain() const { return domain_; }
289
387
 
290
388
  virtual void FillGaugeStorage(GaugeStorage& gauge_storage) = 0;
291
389
 
292
- private:
293
- QueryableDomain* domain_;
294
- const std::vector<std::string> label_;
295
- };
296
-
297
- // Interface for a set of storage objects for a domain.
298
- // Each StorageSet is a collection of storage objects for a domain, one storage
299
- // object per unique set of labels.
300
- // The StorageSet subscribes to new label sets being created, so that all
301
- // storage in a time period can be exported.
302
- class StorageSet {
303
- public:
304
- StorageSet(QueryableDomain* domain, size_t map_shards_size);
305
- virtual ~StorageSet();
306
- void ExportMetrics(
307
- MetricsSink& sink,
308
- absl::Span<const InstrumentMetadata::Description* const> metrics);
309
- size_t TestOnlyCountStorageHeld() const;
310
- QueryableDomain* domain() const { return domain_; }
311
-
312
- void AddStorage(WeakRefCountedPtr<DomainStorage> storage);
390
+ void AddData(channelz::DataSink sink) override;
313
391
 
314
392
  private:
315
- struct MapShard {
316
- mutable Mutex mu;
317
- AVL<absl::Span<const std::string>, WeakRefCountedPtr<DomainStorage>>
318
- storage_map ABSL_GUARDED_BY(mu);
319
- };
320
-
321
393
  QueryableDomain* domain_;
322
- std::unique_ptr<MapShard[]> map_shards_;
323
- const size_t map_shards_size_;
394
+ const std::vector<std::string> label_;
324
395
  };
325
396
 
326
397
  // A registry of metrics.
@@ -372,20 +443,44 @@ class QueryableDomain {
372
443
  // Reset the internal state of this domain. For test use only.
373
444
  void TestOnlyReset();
374
445
 
375
- static std::unique_ptr<CollectionScope> CreateCollectionScope();
376
446
  size_t TestOnlyCountStorageHeld() const;
377
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
+
378
473
  protected:
379
- QueryableDomain(std::vector<std::string> label_names, size_t map_shards_size)
474
+ QueryableDomain(std::string name, std::vector<std::string> label_names,
475
+ size_t map_shards_size)
380
476
  : label_names_(std::move(label_names)),
381
477
  map_shards_size_(label_names_.empty() ? 1 : map_shards_size),
382
- map_shards_(std::make_unique<MapShard[]>(map_shards_size_)) {}
478
+ map_shards_(std::make_unique<MapShard[]>(map_shards_size_)),
479
+ name_(std::move(name)) {}
383
480
 
384
481
  // QueryableDomain should never be destroyed.
385
482
  ~QueryableDomain() { LOG(FATAL) << "QueryableDomain destroyed."; }
386
483
 
387
- RefCountedPtr<DomainStorage> GetDomainStorage(std::vector<std::string> label);
388
-
389
484
  // Called by InstrumentDomain when construction is complete.
390
485
  void Constructed();
391
486
 
@@ -393,6 +488,9 @@ class QueryableDomain {
393
488
  const InstrumentMetadata::Description* AllocateCounter(
394
489
  absl::string_view name, absl::string_view description,
395
490
  absl::string_view unit);
491
+ const InstrumentMetadata::Description* AllocateUpDownCounter(
492
+ absl::string_view name, absl::string_view description,
493
+ absl::string_view unit);
396
494
  const InstrumentMetadata::Description* AllocateHistogram(
397
495
  absl::string_view name, absl::string_view description,
398
496
  absl::string_view unit, HistogramBuckets bounds);
@@ -406,20 +504,7 @@ class QueryableDomain {
406
504
  absl::string_view name, absl::string_view description,
407
505
  absl::string_view unit);
408
506
 
409
- // Returns the number of slots allocated for each metric type.
410
- uint64_t allocated_counter_slots() const { return allocated_counter_slots_; }
411
- uint64_t allocated_double_gauge_slots() const {
412
- return allocated_double_gauge_slots_;
413
- }
414
- uint64_t allocated_int_gauge_slots() const {
415
- return allocated_int_gauge_slots_;
416
- }
417
- uint64_t allocated_uint_gauge_slots() const {
418
- return allocated_uint_gauge_slots_;
419
- }
420
-
421
507
  private:
422
- friend class StorageSet;
423
508
  friend class DomainStorage;
424
509
  friend class GaugeStorage;
425
510
 
@@ -429,15 +514,28 @@ class QueryableDomain {
429
514
  storage_map ABSL_GUARDED_BY(mu);
430
515
  };
431
516
 
432
- void RegisterStorageSet(StorageSet* storage_set);
433
- void UnregisterStorageSet(StorageSet* storage_set);
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
+ };
434
531
 
435
- std::unique_ptr<StorageSet> CreateStorageSet();
436
532
  virtual RefCountedPtr<DomainStorage> CreateDomainStorage(
437
533
  std::vector<std::string> label) = 0;
438
534
  void DomainStorageOrphaned(DomainStorage* storage);
439
535
  MapShard& GetMapShard(absl::Span<const std::string> label);
440
536
 
537
+ void AddData(channelz::DataSink sink);
538
+
441
539
  // Allocate `size` elements in the domain.
442
540
  // Counters will allocate one element. Histograms will allocate one per
443
541
  // bucket.
@@ -459,15 +557,11 @@ class QueryableDomain {
459
557
  uint64_t allocated_int_gauge_slots_ = 0;
460
558
  uint64_t allocated_uint_gauge_slots_ = 0;
461
559
 
462
- Mutex storage_sets_mu_;
463
- std::vector<StorageSet*> storage_sets_ ABSL_GUARDED_BY(storage_sets_mu_);
464
-
465
560
  const size_t map_shards_size_;
466
561
  std::unique_ptr<MapShard[]> map_shards_;
467
562
 
468
- mutable Mutex active_storage_sets_mu_;
469
- std::vector<StorageSet*> active_storage_sets_
470
- ABSL_GUARDED_BY(active_storage_sets_mu_);
563
+ std::string name_;
564
+ SingleSetPtr<ChannelzState> channelz_;
471
565
  };
472
566
 
473
567
  // An InstrumentDomain is a collection of metrics with a common set of labels.
@@ -486,11 +580,14 @@ struct Counter {
486
580
  };
487
581
 
488
582
  // An InstrumentHandle is a handle to a single metric in an
489
- // InstrumentDomainImpl. kType is used in using statements to disambiguate
490
- // between different InstrumentHandle specializations. Backed, Label... are
491
- // per InstrumentDomainImpl.
583
+ // instrument domain. It has a Shape (how the metric behaves).
492
584
  template <typename Shape, typename Domain>
493
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
+
494
591
  private:
495
592
  friend Domain;
496
593
 
@@ -512,7 +609,7 @@ template <typename T>
512
609
  using StdString = std::string;
513
610
 
514
611
  template <typename T>
515
- using ConstCharPtr = const char*;
612
+ using AbslStringView = absl::string_view;
516
613
 
517
614
  } // namespace instrument_detail
518
615
 
@@ -523,9 +620,17 @@ class LowContentionBackend final {
523
620
  public:
524
621
  explicit LowContentionBackend(size_t size);
525
622
 
526
- void Increment(size_t index) {
527
- counters_[index].fetch_add(1, std::memory_order_relaxed);
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);
528
631
  }
632
+ void Increment(size_t index) { Add(index, 1); }
633
+ void Decrement(size_t index) { Subtract(index, 1); }
529
634
 
530
635
  uint64_t Sum(size_t index);
531
636
 
@@ -541,14 +646,21 @@ class HighContentionBackend final {
541
646
  public:
542
647
  explicit HighContentionBackend(size_t size);
543
648
 
544
- void Increment(size_t index) {
545
- counters_.this_cpu()[index].fetch_add(1, std::memory_order_relaxed);
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);
546
654
  }
655
+ void Increment(size_t index) { Add(index, 1); }
656
+ void Decrement(size_t index) { Subtract(index, 1); }
547
657
 
548
658
  uint64_t Sum(size_t index);
549
659
 
550
660
  private:
551
- PerCpu<std::unique_ptr<std::atomic<uint64_t>[]>> counters_{
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_{
552
664
  PerCpuOptions().SetMaxShards(16)};
553
665
  };
554
666
 
@@ -558,16 +670,24 @@ class MetricsSink {
558
670
  public:
559
671
  // Called once per label per metric, with the value of that metric for that
560
672
  // label.
561
- virtual void Counter(absl::Span<const std::string> label,
673
+ virtual void Counter(absl::Span<const std::string> label_keys,
674
+ absl::Span<const std::string> label_values,
562
675
  absl::string_view name, uint64_t value) = 0;
563
- virtual void Histogram(absl::Span<const std::string> label,
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,
564
681
  absl::string_view name, HistogramBuckets bounds,
565
682
  absl::Span<const uint64_t> counts) = 0;
566
- virtual void DoubleGauge(absl::Span<const std::string> labels,
683
+ virtual void DoubleGauge(absl::Span<const std::string> label_keys,
684
+ absl::Span<const std::string> label_values,
567
685
  absl::string_view name, double value) = 0;
568
- virtual void IntGauge(absl::Span<const std::string> labels,
686
+ virtual void IntGauge(absl::Span<const std::string> label_keys,
687
+ absl::Span<const std::string> label_values,
569
688
  absl::string_view name, int64_t value) = 0;
570
- virtual void UintGauge(absl::Span<const std::string> labels,
689
+ virtual void UintGauge(absl::Span<const std::string> label_keys,
690
+ absl::Span<const std::string> label_values,
571
691
  absl::string_view name, uint64_t value) = 0;
572
692
 
573
693
  protected:
@@ -589,22 +709,22 @@ class MetricsQuery {
589
709
  // remaining dimensions, etc.
590
710
  MetricsQuery& CollapseLabels(absl::Span<const std::string> labels);
591
711
  // Only include metrics that are in `metrics`.
592
- MetricsQuery& OnlyMetrics(absl::Span<const std::string> metrics);
712
+ MetricsQuery& OnlyMetrics(std::vector<std::string> metrics);
593
713
 
594
714
  // Returns the metrics that are selected by this query.
595
715
  std::optional<absl::Span<const std::string>> selected_metrics() const {
596
716
  return only_metrics_;
597
717
  }
598
718
 
719
+ // Runs the query, outputting the results to `sink`.
720
+ void Run(RefCountedPtr<CollectionScope> scope, MetricsSink& sink) const;
721
+
722
+ private:
599
723
  // Adapts `sink` by including the filtering requested, and then calls `fn`
600
724
  // with the filtering sink. This is mainly an implementation detail.
601
725
  void Apply(absl::Span<const std::string> label_names,
602
726
  absl::FunctionRef<void(MetricsSink&)> fn, MetricsSink& sink) const;
603
727
 
604
- // Runs the query, outputting the results to `sink`.
605
- void Run(std::unique_ptr<CollectionScope> scope, MetricsSink& sink) const;
606
-
607
- private:
608
728
  void ApplyLabelChecks(absl::Span<const std::string> label_names,
609
729
  absl::FunctionRef<void(MetricsSink&)> fn,
610
730
  MetricsSink& sink) const;
@@ -642,6 +762,8 @@ class InstrumentDomainImpl final : public QueryableDomain {
642
762
  public:
643
763
  using Self = InstrumentDomainImpl<Backend, N, Tag>;
644
764
  using CounterHandle = InstrumentHandle<Counter, Self>;
765
+ using UpDownCounterHandle =
766
+ InstrumentHandle<InstrumentMetadata::UpDownCounterShape, Self>;
645
767
  using DoubleGaugeHandle =
646
768
  InstrumentHandle<InstrumentMetadata::DoubleGaugeShape, Self>;
647
769
  using IntGaugeHandle =
@@ -682,16 +804,16 @@ class InstrumentDomainImpl final : public QueryableDomain {
682
804
  protected:
683
805
  explicit GaugeProvider(RefCountedPtr<Storage> storage)
684
806
  : storage_(std::move(storage)) {
685
- DCHECK(storage_ != nullptr);
807
+ GRPC_DCHECK(storage_ != nullptr);
686
808
  }
687
- ~GaugeProvider() { DCHECK(storage_ == nullptr); }
809
+ ~GaugeProvider() { GRPC_DCHECK(storage_ == nullptr); }
688
810
 
689
811
  void ProviderConstructed() {
690
- DCHECK(storage_ != nullptr);
812
+ GRPC_DCHECK(storage_ != nullptr);
691
813
  storage_->RegisterGaugeProvider(this);
692
814
  }
693
815
  void ProviderDestructing() {
694
- DCHECK(storage_ != nullptr);
816
+ GRPC_DCHECK(storage_ != nullptr);
695
817
  storage_->UnregisterGaugeProvider(this);
696
818
  storage_.reset();
697
819
  }
@@ -708,16 +830,35 @@ class InstrumentDomainImpl final : public QueryableDomain {
708
830
 
709
831
  // Increments the counter specified by `handle` by 1 for this storages
710
832
  // labels.
711
- void Increment(CounterHandle handle) {
712
- DCHECK_EQ(handle.instrument_domain_, domain());
713
- backend_.Increment(handle.offset_);
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
+ }
714
855
  }
715
856
 
716
857
  template <typename Shape>
717
858
  void Increment(const HistogramHandle<Shape>& handle, int64_t value) {
718
- DCHECK_EQ(handle.instrument_domain_, domain());
859
+ GRPC_DCHECK_EQ(handle.instrument_domain_, domain());
719
860
  CallHistogramCollectionHooks(handle.description_, label(), value);
720
- backend_.Increment(handle.offset_ + handle.shape_->BucketFor(value));
861
+ backend_.Add(handle.offset_ + handle.shape_->BucketFor(value), 1);
721
862
  }
722
863
 
723
864
  private:
@@ -758,10 +899,10 @@ class InstrumentDomainImpl final : public QueryableDomain {
758
899
  };
759
900
 
760
901
  GPR_ATTRIBUTE_NOINLINE explicit InstrumentDomainImpl(
761
- std::vector<std::string> label_names,
902
+ std::string name, std::vector<std::string> label_names,
762
903
  size_t map_shards = std::min(16u, gpr_cpu_num_cores()))
763
- : QueryableDomain(std::move(label_names), map_shards) {
764
- CHECK_EQ(this->label_names().size(), N);
904
+ : QueryableDomain(std::move(name), std::move(label_names), map_shards) {
905
+ GRPC_CHECK_EQ(this->label_names().size(), N);
765
906
  Constructed();
766
907
  }
767
908
 
@@ -777,6 +918,14 @@ class InstrumentDomainImpl final : public QueryableDomain {
777
918
  Counter{}};
778
919
  }
779
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
+
780
929
  template <typename Shape, typename... Args>
781
930
  HistogramHandle<Shape> RegisterHistogram(absl::string_view name,
782
931
  absl::string_view description,
@@ -812,13 +961,14 @@ class InstrumentDomainImpl final : public QueryableDomain {
812
961
  // GetStorage: returns a pointer to the storage for the given key, creating
813
962
  // it if necessary.
814
963
  template <typename... Args>
815
- RefCountedPtr<Storage> GetStorage(Args&&... labels) {
964
+ RefCountedPtr<Storage> GetStorage(RefCountedPtr<CollectionScope> scope,
965
+ Args&&... labels) {
816
966
  static_assert(sizeof...(Args) == N, "Incorrect number of labels provided");
817
- std::vector<std::string> label_names;
818
- label_names.reserve(N);
819
- (label_names.emplace_back(absl::StrCat(labels)), ...);
967
+ std::vector<std::string> label_values;
968
+ label_values.reserve(N);
969
+ (label_values.emplace_back(absl::StrCat(labels)), ...);
820
970
  return DownCastRefCountedPtr<Storage>(
821
- GetDomainStorage(std::move(label_names)));
971
+ GetDomainStorage(std::move(scope), label_values));
822
972
  }
823
973
 
824
974
  RefCountedPtr<DomainStorage> CreateDomainStorage(
@@ -852,20 +1002,23 @@ class InstrumentDomain {
852
1002
  static auto* domain = new instrument_detail::InstrumentDomainImpl<
853
1003
  typename Derived::Backend,
854
1004
  std::tuple_size_v<decltype(Derived::kLabels)>, Derived>(
1005
+ absl::StrCat(Derived::kName),
855
1006
  instrument_detail::MakeLabelFromTuple(Derived::kLabels));
856
1007
  return domain;
857
1008
  }
858
1009
 
859
1010
  // Returns an InstrumentStorageRefPtr<Derived>.
860
1011
  template <typename... Args>
861
- static auto GetStorage(Args&&... labels) {
862
- return Domain()->GetStorage(std::forward<Args>(labels)...);
1012
+ static auto GetStorage(RefCountedPtr<CollectionScope> scope,
1013
+ Args&&... labels) {
1014
+ return Domain()->GetStorage(std::move(scope),
1015
+ std::forward<Args>(labels)...);
863
1016
  }
864
1017
 
865
1018
  protected:
866
1019
  template <typename... Label>
867
1020
  static constexpr auto Labels(Label... labels) {
868
- return std::tuple<instrument_detail::ConstCharPtr<Label>...>{labels...};
1021
+ return std::tuple<instrument_detail::AbslStringView<Label>...>{labels...};
869
1022
  }
870
1023
 
871
1024
  static auto RegisterCounter(absl::string_view name,
@@ -874,6 +1027,12 @@ class InstrumentDomain {
874
1027
  return Domain()->RegisterCounter(name, description, unit);
875
1028
  }
876
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
+
877
1036
  template <typename Shape, typename... Args>
878
1037
  static auto RegisterHistogram(absl::string_view name,
879
1038
  absl::string_view description,
@@ -923,9 +1082,23 @@ using GaugeProvider = typename InstrumentDomainImpl<DomainType>::GaugeProvider;
923
1082
  // Reset all registered instruments. For test use only.
924
1083
  void TestOnlyResetInstruments();
925
1084
 
926
- inline std::unique_ptr<CollectionScope> CreateCollectionScope() {
927
- return instrument_detail::QueryableDomain::CreateCollectionScope();
928
- }
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();
929
1102
 
930
1103
  } // namespace grpc_core
931
1104