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
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include <grpc/support/port_platform.h>
18
18
 
19
+ #include <algorithm>
19
20
  #include <atomic>
20
21
  #include <cstddef>
21
22
  #include <cstdint>
@@ -23,14 +24,27 @@
23
24
  #include <string>
24
25
  #include <tuple>
25
26
  #include <utility>
27
+ #include <variant>
26
28
  #include <vector>
27
29
 
30
+ #include "src/core/channelz/channelz.h"
31
+ #include "src/core/channelz/property_list.h"
32
+ #include "src/core/telemetry/histogram.h"
33
+ #include "src/core/util/grpc_check.h"
34
+ #include "src/core/util/match.h"
35
+ #include "src/core/util/ref_counted_ptr.h"
36
+ #include "src/core/util/single_set_ptr.h"
37
+ #include "src/core/util/sync.h"
38
+ #include "absl/base/thread_annotations.h"
28
39
  #include "absl/container/flat_hash_map.h"
40
+ #include "absl/container/flat_hash_set.h"
41
+ #include "absl/functional/function_ref.h"
42
+ #include "absl/hash/hash.h"
29
43
  #include "absl/log/log.h"
44
+ #include "absl/strings/str_cat.h"
30
45
  #include "absl/strings/str_join.h"
31
46
  #include "absl/strings/string_view.h"
32
47
  #include "absl/types/span.h"
33
- #include "src/core/util/grpc_check.h"
34
48
 
35
49
  namespace grpc_core {
36
50
 
@@ -65,34 +79,122 @@ void CallHistogramCollectionHooks(
65
79
 
66
80
  } // namespace instrument_detail
67
81
 
82
+ namespace {
83
+ std::vector<std::string> FilterLabels(
84
+ absl::Span<const std::string> domain_label_names,
85
+ const absl::flat_hash_set<std::string>& scope_labels_of_interest,
86
+ absl::Span<const std::string> full_label_values) {
87
+ std::vector<std::string> result;
88
+ result.reserve(domain_label_names.size());
89
+ for (size_t i = 0; i < domain_label_names.size(); ++i) {
90
+ if (scope_labels_of_interest.contains(domain_label_names[i])) {
91
+ result.push_back(full_label_values[i]);
92
+ } else {
93
+ result.push_back(std::string(kOmittedLabel));
94
+ }
95
+ }
96
+ return result;
97
+ }
98
+ } // namespace
99
+
68
100
  CollectionScope::CollectionScope(
69
- std::vector<std::unique_ptr<instrument_detail::StorageSet>> storage_sets)
70
- : storage_sets_(std::move(storage_sets)) {}
101
+ std::vector<RefCountedPtr<CollectionScope>> parents,
102
+ absl::Span<const std::string> labels, size_t child_shards_count,
103
+ size_t storage_shards_count)
104
+ : parents_(std::move(parents)),
105
+ labels_of_interest_(labels.begin(), labels.end()),
106
+ child_shards_(child_shards_count),
107
+ storage_shards_(storage_shards_count) {
108
+ // Sort parents (by address) and then remove any duplicates.
109
+ std::sort(parents_.begin(), parents_.end());
110
+ parents_.erase(std::unique(parents_.begin(), parents_.end()), parents_.end());
111
+ for (const auto& parent : parents_) {
112
+ if (parent != nullptr) {
113
+ labels_of_interest_.insert(parent->labels_of_interest_.begin(),
114
+ parent->labels_of_interest_.end());
115
+ auto& shard = parent->child_shard(this);
116
+ MutexLock lock(&shard.mu);
117
+ shard.children.insert(this);
118
+ }
119
+ }
120
+ }
121
+
122
+ CollectionScope::~CollectionScope() {
123
+ for (const auto& parent : parents_) {
124
+ if (parent != nullptr) {
125
+ auto& shard = parent->child_shard(this);
126
+ MutexLock lock(&shard.mu);
127
+ shard.children.erase(this);
128
+ }
129
+ }
130
+ for (auto& shard : storage_shards_) {
131
+ // TODO(ctiller): Consider a different entry point than GetDomainStorage
132
+ // for this post-aggregation. We ought to be able to do this step without
133
+ // accessing full_labels.
134
+ MutexLock lock(&shard.mu);
135
+ for (auto& storage_pair : shard.storage) {
136
+ for (const auto& parent : parents_) {
137
+ if (parent != nullptr) {
138
+ storage_pair.second->domain()
139
+ ->GetDomainStorage(parent, storage_pair.second->label())
140
+ ->Add(storage_pair.second.get());
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
71
146
 
72
147
  size_t CollectionScope::TestOnlyCountStorageHeld() const {
73
148
  size_t count = 0;
74
- for (const auto& set : storage_sets_) {
75
- count += set->TestOnlyCountStorageHeld();
149
+ for (const auto& shard : storage_shards_) {
150
+ MutexLock lock(&shard.mu);
151
+ count += shard.storage.size();
76
152
  }
77
153
  return count;
78
154
  }
79
155
 
80
- std::vector<instrument_detail::StorageSet*> CollectionScope::GetStorageSets() {
81
- std::vector<instrument_detail::StorageSet*> result;
82
- result.reserve(storage_sets_.size());
83
- for (const auto& storage_set : storage_sets_) {
84
- result.push_back(storage_set.get());
156
+ void CollectionScope::ForEachUniqueStorage(
157
+ absl::FunctionRef<void(instrument_detail::DomainStorage*)> cb) {
158
+ absl::flat_hash_set<instrument_detail::DomainStorage*> visited;
159
+ ForEachUniqueStorage(cb, visited);
160
+ }
161
+
162
+ void CollectionScope::ForEachUniqueStorage(
163
+ absl::FunctionRef<void(instrument_detail::DomainStorage*)> cb,
164
+ absl::flat_hash_set<instrument_detail::DomainStorage*>& visited) {
165
+ for (auto& shard : storage_shards_) {
166
+ MutexLock lock(&shard.mu);
167
+ for (const auto& s : shard.storage) {
168
+ if (visited.insert(s.second.get()).second) {
169
+ cb(s.second.get());
170
+ }
171
+ }
172
+ }
173
+ for (auto& shard : child_shards_) {
174
+ MutexLock lock(&shard.mu);
175
+ for (auto* child : shard.children) {
176
+ child->ForEachUniqueStorage(cb, visited);
177
+ }
85
178
  }
86
- return result;
87
179
  }
88
180
 
89
- std::unique_ptr<CollectionScope>
90
- instrument_detail::QueryableDomain::CreateCollectionScope() {
91
- std::vector<std::unique_ptr<instrument_detail::StorageSet>> storage_sets;
92
- for (auto* domain = last_; domain != nullptr; domain = domain->prev_) {
93
- storage_sets.push_back(domain->CreateStorageSet());
181
+ void CollectionScope::TestOnlyReset() {
182
+ for (auto& shard : storage_shards_) {
183
+ MutexLock lock(&shard.mu);
184
+ shard.storage.clear();
185
+ }
186
+ for (auto& shard : child_shards_) {
187
+ MutexLock lock(&shard.mu);
188
+ shard.children.clear();
94
189
  }
95
- return std::make_unique<CollectionScope>(std::move(storage_sets));
190
+ }
191
+
192
+ RefCountedPtr<CollectionScope> CreateCollectionScope(
193
+ std::vector<RefCountedPtr<CollectionScope>> parents,
194
+ absl::Span<const std::string> labels, size_t child_shards_count,
195
+ size_t storage_shards_count) {
196
+ return MakeRefCounted<CollectionScope>(
197
+ std::move(parents), labels, child_shards_count, storage_shards_count);
96
198
  }
97
199
 
98
200
  ////////////////////////////////////////////////////////////////////////////////
@@ -115,102 +217,6 @@ GaugeStorage::GaugeStorage(QueryableDomain* domain)
115
217
 
116
218
  } // namespace instrument_detail
117
219
 
118
- ////////////////////////////////////////////////////////////////////////////////
119
- // StorageSet
120
-
121
- namespace instrument_detail {
122
-
123
- StorageSet::StorageSet(QueryableDomain* domain, size_t map_shards_size)
124
- : domain_(domain),
125
- map_shards_(std::make_unique<MapShard[]>(map_shards_size)),
126
- map_shards_size_(map_shards_size) {
127
- domain_->RegisterStorageSet(this);
128
- }
129
-
130
- StorageSet::~StorageSet() { domain_->UnregisterStorageSet(this); }
131
-
132
- void StorageSet::ExportMetrics(
133
- MetricsSink& sink,
134
- absl::Span<const InstrumentMetadata::Description* const> metrics) {
135
- for (size_t i = 0; i < map_shards_size_; ++i) {
136
- MutexLock lock(&map_shards_[i].mu);
137
- map_shards_[i].storage_map.ForEach([&](const auto& label,
138
- const auto& weak_storage) {
139
- // It's safe to use `get()` here because the `StorageSet` itself
140
- // holds a weak reference, guaranteeing the object's memory is
141
- // alive. We can't get a strong ref if the object is orphaned, but
142
- // we still need to read its final metric values.
143
- DomainStorage* storage = weak_storage.get();
144
- GaugeStorage gauge_storage(storage->domain());
145
- storage->FillGaugeStorage(gauge_storage);
146
- for (const auto* metric : metrics) {
147
- Match(
148
- metric->shape,
149
- [metric, &sink, storage, &label](InstrumentMetadata::CounterShape) {
150
- sink.Counter(label, metric->name,
151
- storage->SumCounter(metric->offset));
152
- },
153
- [metric, &sink, storage,
154
- &label](InstrumentMetadata::HistogramShape bounds) {
155
- std::vector<uint64_t> counts(bounds.size());
156
- for (size_t i = 0; i < bounds.size(); ++i) {
157
- counts[i] = storage->SumCounter(metric->offset + i);
158
- }
159
- sink.Histogram(label, metric->name, bounds, counts);
160
- },
161
- [metric, &sink, &gauge_storage,
162
- &label](InstrumentMetadata::DoubleGaugeShape) {
163
- if (auto value = gauge_storage.GetDouble(metric->offset);
164
- value.has_value()) {
165
- sink.DoubleGauge(label, metric->name, *value);
166
- }
167
- },
168
- [metric, &sink, &gauge_storage,
169
- &label](InstrumentMetadata::IntGaugeShape) {
170
- if (auto value = gauge_storage.GetInt(metric->offset);
171
- value.has_value()) {
172
- sink.IntGauge(label, metric->name, *value);
173
- }
174
- },
175
- [metric, &sink, &gauge_storage,
176
- &label](InstrumentMetadata::UintGaugeShape) {
177
- if (auto value = gauge_storage.GetUint(metric->offset);
178
- value.has_value()) {
179
- sink.UintGauge(label, metric->name, *value);
180
- }
181
- });
182
- }
183
- });
184
- }
185
- }
186
-
187
- size_t StorageSet::TestOnlyCountStorageHeld() const {
188
- size_t count = 0;
189
- for (size_t i = 0; i < map_shards_size_; ++i) {
190
- MutexLock lock(&map_shards_[i].mu);
191
- map_shards_[i].storage_map.ForEach([&](const auto&, const auto& weak) {
192
- count += weak->RefIfNonZero() != nullptr;
193
- });
194
- }
195
- return count;
196
- }
197
-
198
- void StorageSet::AddStorage(WeakRefCountedPtr<DomainStorage> storage) {
199
- size_t shard;
200
- auto label = storage->label();
201
- if (map_shards_size_ == 1) {
202
- shard = 0;
203
- } else {
204
- GRPC_CHECK(!label.empty());
205
- shard = absl::HashOf(label[0], this) % map_shards_size_;
206
- }
207
- MapShard& map_shard = map_shards_[shard];
208
- MutexLock lock(&map_shard.mu);
209
- map_shard.storage_map = map_shard.storage_map.Add(label, std::move(storage));
210
- }
211
-
212
- } // namespace instrument_detail
213
-
214
220
  ////////////////////////////////////////////////////////////////////////////////
215
221
  // MetricsQuery
216
222
 
@@ -228,39 +234,103 @@ MetricsQuery& MetricsQuery::CollapseLabels(
228
234
  return *this;
229
235
  }
230
236
 
231
- MetricsQuery& MetricsQuery::OnlyMetrics(absl::Span<const std::string> metrics) {
232
- only_metrics_.emplace(metrics.begin(), metrics.end());
237
+ MetricsQuery& MetricsQuery::OnlyMetrics(std::vector<std::string> metrics) {
238
+ only_metrics_.emplace(std::move(metrics));
233
239
  return *this;
234
240
  }
235
241
 
236
- void MetricsQuery::Run(std::unique_ptr<CollectionScope> scope,
242
+ void MetricsQuery::Run(RefCountedPtr<CollectionScope> scope,
237
243
  MetricsSink& sink) const {
238
244
  GRPC_CHECK_NE(scope.get(), nullptr);
245
+ struct DomainInfo {
246
+ std::vector<const InstrumentMetadata::Description*> metrics;
247
+ std::vector<RefCountedPtr<instrument_detail::DomainStorage>> storage;
248
+ };
249
+ absl::flat_hash_map<instrument_detail::QueryableDomain*, DomainInfo>
250
+ domain_info_map;
239
251
  auto selected_metrics = this->selected_metrics();
240
- absl::flat_hash_map<instrument_detail::QueryableDomain*,
241
- std::vector<const InstrumentMetadata::Description*>>
242
- metrics_by_domain;
252
+ // Calculate list of desired metrics, per domain.
243
253
  if (selected_metrics.has_value()) {
244
254
  for (const auto& metric : *selected_metrics) {
245
255
  const auto* desc = instrument_detail::InstrumentIndex::Get().Find(metric);
246
- if (desc == nullptr) continue;
247
- metrics_by_domain[desc->domain].push_back(desc);
256
+ GRPC_CHECK_NE(desc, nullptr) << "Metric not found: " << metric;
257
+ domain_info_map[desc->domain].metrics.push_back(desc);
248
258
  }
249
259
  } else {
250
260
  instrument_detail::QueryableDomain::ForEachInstrument(
251
261
  [&](const InstrumentMetadata::Description* desc) {
252
- metrics_by_domain[desc->domain].push_back(desc);
262
+ domain_info_map[desc->domain].metrics.push_back(desc);
253
263
  });
254
264
  }
255
- for (auto* storage_set : scope->GetStorageSets()) {
256
- instrument_detail::QueryableDomain* domain = storage_set->domain();
257
- if (domain == nullptr) continue;
258
- auto it = metrics_by_domain.find(domain);
259
- if (it == metrics_by_domain.end()) continue;
265
+ // Calculate list of storage objects, per domain, that have at least one
266
+ // desired metric.
267
+ scope->ForEachUniqueStorage([&](instrument_detail::DomainStorage* storage) {
268
+ auto it = domain_info_map.find(storage->domain());
269
+ if (it == domain_info_map.end()) return;
270
+ it->second.storage.push_back(storage->Ref());
271
+ });
272
+ for (const auto& pair : domain_info_map) {
273
+ instrument_detail::QueryableDomain* domain = pair.first;
274
+ const auto& metrics = pair.second.metrics;
275
+ const auto& storages = pair.second.storage;
276
+ GRPC_CHECK(!metrics.empty());
277
+ if (storages.empty()) continue;
260
278
  this->Apply(
261
279
  domain->label_names(),
262
280
  [&](MetricsSink& sink) {
263
- storage_set->ExportMetrics(sink, it->second);
281
+ for (auto& storage : storages) {
282
+ const auto label_values = storage->label();
283
+ const auto label_keys = domain->label_names();
284
+ instrument_detail::GaugeStorage gauge_storage(storage->domain());
285
+ storage->FillGaugeStorage(gauge_storage);
286
+ for (const auto* metric : metrics) {
287
+ Match(
288
+ metric->shape,
289
+ [metric, &sink, storage, &label_values,
290
+ &label_keys](InstrumentMetadata::CounterShape) {
291
+ sink.Counter(label_keys, label_values, metric->name,
292
+ storage->SumCounter(metric->offset));
293
+ },
294
+ [metric, &sink, storage, &label_values,
295
+ &label_keys](InstrumentMetadata::UpDownCounterShape) {
296
+ sink.UpDownCounter(label_keys, label_values, metric->name,
297
+ storage->SumCounter(metric->offset));
298
+ },
299
+ [metric, &sink, storage, &label_values,
300
+ &label_keys](InstrumentMetadata::HistogramShape bounds) {
301
+ std::vector<uint64_t> counts(bounds.size());
302
+ for (size_t i = 0; i < bounds.size(); ++i) {
303
+ counts[i] = storage->SumCounter(metric->offset + i);
304
+ }
305
+ sink.Histogram(label_keys, label_values, metric->name,
306
+ bounds, counts);
307
+ },
308
+ [metric, &sink, &gauge_storage, &label_values,
309
+ &label_keys](InstrumentMetadata::DoubleGaugeShape) {
310
+ if (auto value = gauge_storage.GetDouble(metric->offset);
311
+ value.has_value()) {
312
+ sink.DoubleGauge(label_keys, label_values, metric->name,
313
+ *value);
314
+ }
315
+ },
316
+ [metric, &sink, &gauge_storage, &label_values,
317
+ &label_keys](InstrumentMetadata::IntGaugeShape) {
318
+ if (auto value = gauge_storage.GetInt(metric->offset);
319
+ value.has_value()) {
320
+ sink.IntGauge(label_keys, label_values, metric->name,
321
+ *value);
322
+ }
323
+ },
324
+ [metric, &sink, &gauge_storage, &label_values,
325
+ &label_keys](InstrumentMetadata::UintGaugeShape) {
326
+ if (auto value = gauge_storage.GetUint(metric->offset);
327
+ value.has_value()) {
328
+ sink.UintGauge(label_keys, label_values, metric->name,
329
+ *value);
330
+ }
331
+ });
332
+ }
333
+ }
264
334
  },
265
335
  sink);
266
336
  }
@@ -274,9 +344,11 @@ void MetricsQuery::Apply(absl::Span<const std::string> label_names,
274
344
  return;
275
345
  }
276
346
  std::vector<size_t> include_labels;
347
+ std::vector<std::string> label_keys;
277
348
  for (size_t i = 0; i < label_names.size(); ++i) {
278
349
  if (!collapsed_labels_.contains(label_names[i])) {
279
350
  include_labels.push_back(i);
351
+ label_keys.push_back(label_names[i]);
280
352
  }
281
353
  }
282
354
  if (include_labels.size() == label_names.size()) {
@@ -285,22 +357,31 @@ void MetricsQuery::Apply(absl::Span<const std::string> label_names,
285
357
  }
286
358
  class Filter final : public MetricsSink {
287
359
  public:
288
- explicit Filter(absl::Span<const size_t> include_labels)
289
- : include_labels_(include_labels) {}
360
+ explicit Filter(absl::Span<const size_t> include_labels,
361
+ absl::Span<const std::string> label_keys)
362
+ : include_labels_(include_labels), label_keys_(label_keys) {}
363
+
364
+ void Counter(absl::Span<const std::string> /* label_keys */,
365
+ absl::Span<const std::string> label_values,
366
+ absl::string_view name, uint64_t value) override {
367
+ uint64_counters_[ConstructKey(label_values, name)] += value;
368
+ }
290
369
 
291
- void Counter(absl::Span<const std::string> label, absl::string_view name,
292
- uint64_t value) override {
293
- uint64_counters_[ConstructKey(label, name)] += value;
370
+ void UpDownCounter(absl::Span<const std::string> /* label_keys */,
371
+ absl::Span<const std::string> label_values,
372
+ absl::string_view name, uint64_t value) override {
373
+ uint64_up_down_counters_[ConstructKey(label_values, name)] += value;
294
374
  }
295
375
 
296
- void Histogram(absl::Span<const std::string> label, absl::string_view name,
297
- HistogramBuckets bounds,
376
+ void Histogram(absl::Span<const std::string> /* label_keys */,
377
+ absl::Span<const std::string> label_values,
378
+ absl::string_view name, HistogramBuckets bounds,
298
379
  absl::Span<const uint64_t> counts) override {
299
380
  GRPC_CHECK_EQ(counts.size(), bounds.size());
300
- auto it = histograms_.find(ConstructKey(label, name));
381
+ auto it = histograms_.find(ConstructKey(label_values, name));
301
382
  if (it == histograms_.end()) {
302
383
  histograms_.emplace(std::piecewise_construct,
303
- std::tuple(ConstructKey(label, name)),
384
+ std::tuple(ConstructKey(label_values, name)),
304
385
  std::tuple(bounds, counts));
305
386
  } else {
306
387
  if (it->second.bounds != bounds) {
@@ -314,44 +395,56 @@ void MetricsQuery::Apply(absl::Span<const std::string> label_names,
314
395
  }
315
396
  }
316
397
 
317
- void DoubleGauge(absl::Span<const std::string>, absl::string_view,
398
+ void DoubleGauge(absl::Span<const std::string> /* label_keys */,
399
+ absl::Span<const std::string>, absl::string_view,
318
400
  double) override {
319
401
  // Not aggregatable
320
402
  }
321
- void IntGauge(absl::Span<const std::string>, absl::string_view,
403
+ void IntGauge(absl::Span<const std::string> /* label_keys */,
404
+ absl::Span<const std::string>, absl::string_view,
322
405
  int64_t) override {
323
406
  // Not aggregatable
324
407
  }
325
- void UintGauge(absl::Span<const std::string>, absl::string_view,
408
+ void UintGauge(absl::Span<const std::string> /* label_keys */,
409
+ absl::Span<const std::string>, absl::string_view,
326
410
  uint64_t) override {
327
411
  // Not aggregatable
328
412
  }
329
413
 
330
414
  void Publish(MetricsSink& sink) const {
331
415
  for (const auto& [key, value] : uint64_counters_) {
332
- sink.Counter(std::get<0>(key), std::get<1>(key), value);
416
+ sink.Counter(label_keys_, std::get<0>(key), std::get<1>(key), value);
417
+ }
418
+ for (const auto& [key, value] : uint64_up_down_counters_) {
419
+ sink.UpDownCounter(label_keys_, std::get<0>(key), std::get<1>(key),
420
+ value);
333
421
  }
334
422
  for (const auto& [key, value] : histograms_) {
335
- sink.Histogram(std::get<0>(key), std::get<1>(key), value.bounds,
336
- value.counts);
423
+ sink.Histogram(label_keys_, std::get<0>(key), std::get<1>(key),
424
+ value.bounds, value.counts);
337
425
  }
338
426
  }
339
427
 
340
428
  private:
341
429
  std::tuple<std::vector<std::string>, absl::string_view> ConstructKey(
342
- absl::Span<const std::string> label, absl::string_view name) const {
430
+ absl::Span<const std::string> label_values,
431
+ absl::string_view name) const {
343
432
  std::vector<std::string> key;
344
433
  key.reserve(include_labels_.size());
345
434
  for (auto i : include_labels_) {
346
- key.push_back(label[i]);
435
+ key.push_back(label_values[i]);
347
436
  }
348
437
  return std::tuple(std::move(key), name);
349
438
  }
350
439
 
351
440
  absl::Span<const size_t> include_labels_;
441
+ absl::Span<const std::string> label_keys_;
352
442
  absl::flat_hash_map<std::tuple<std::vector<std::string>, absl::string_view>,
353
443
  uint64_t>
354
444
  uint64_counters_;
445
+ absl::flat_hash_map<std::tuple<std::vector<std::string>, absl::string_view>,
446
+ uint64_t>
447
+ uint64_up_down_counters_;
355
448
  struct HistogramValue {
356
449
  HistogramValue(HistogramBuckets bounds, absl::Span<const uint64_t> counts)
357
450
  : bounds(bounds), counts(counts.begin(), counts.end()) {}
@@ -362,7 +455,7 @@ void MetricsQuery::Apply(absl::Span<const std::string> label_names,
362
455
  HistogramValue>
363
456
  histograms_;
364
457
  };
365
- Filter filter(include_labels);
458
+ Filter filter(include_labels, label_keys);
366
459
  ApplyLabelChecks(label_names, fn, filter);
367
460
  filter.Publish(sink);
368
461
  }
@@ -393,39 +486,51 @@ void MetricsQuery::ApplyLabelChecks(absl::Span<const std::string> label_names,
393
486
  absl::Span<const LabelEq> inclusion_checks)
394
487
  : inclusion_checks_(inclusion_checks), sink_(sink) {}
395
488
 
396
- void Counter(absl::Span<const std::string> label, absl::string_view name,
397
- uint64_t value) override {
398
- if (!Matches(label)) return;
399
- sink_.Counter(label, name, value);
489
+ void Counter(absl::Span<const std::string> label_keys,
490
+ absl::Span<const std::string> label_values,
491
+ absl::string_view name, uint64_t value) override {
492
+ if (!Matches(label_values)) return;
493
+ sink_.Counter(label_keys, label_values, name, value);
400
494
  }
401
495
 
402
- void Histogram(absl::Span<const std::string> label, absl::string_view name,
403
- HistogramBuckets bounds,
496
+ void UpDownCounter(absl::Span<const std::string> label_keys,
497
+ absl::Span<const std::string> label_values,
498
+ absl::string_view name, uint64_t value) override {
499
+ if (!Matches(label_values)) return;
500
+ sink_.UpDownCounter(label_keys, label_values, name, value);
501
+ }
502
+
503
+ void Histogram(absl::Span<const std::string> label_keys,
504
+ absl::Span<const std::string> label_values,
505
+ absl::string_view name, HistogramBuckets bounds,
404
506
  absl::Span<const uint64_t> counts) override {
405
- if (!Matches(label)) return;
406
- sink_.Histogram(label, name, bounds, counts);
507
+ if (!Matches(label_values)) return;
508
+ sink_.Histogram(label_keys, label_values, name, bounds, counts);
407
509
  }
408
510
 
409
- void DoubleGauge(absl::Span<const std::string> label,
511
+ void DoubleGauge(absl::Span<const std::string> label_keys,
512
+ absl::Span<const std::string> label_values,
410
513
  absl::string_view name, double value) override {
411
- if (!Matches(label)) return;
412
- sink_.DoubleGauge(label, name, value);
514
+ if (!Matches(label_values)) return;
515
+ sink_.DoubleGauge(label_keys, label_values, name, value);
413
516
  }
414
- void IntGauge(absl::Span<const std::string> label, absl::string_view name,
415
- int64_t value) override {
416
- if (!Matches(label)) return;
417
- sink_.IntGauge(label, name, value);
517
+ void IntGauge(absl::Span<const std::string> label_keys,
518
+ absl::Span<const std::string> label_values,
519
+ absl::string_view name, int64_t value) override {
520
+ if (!Matches(label_values)) return;
521
+ sink_.IntGauge(label_keys, label_values, name, value);
418
522
  }
419
- void UintGauge(absl::Span<const std::string> label, absl::string_view name,
420
- uint64_t value) override {
421
- if (!Matches(label)) return;
422
- sink_.UintGauge(label, name, value);
523
+ void UintGauge(absl::Span<const std::string> label_keys,
524
+ absl::Span<const std::string> label_values,
525
+ absl::string_view name, uint64_t value) override {
526
+ if (!Matches(label_values)) return;
527
+ sink_.UintGauge(label_keys, label_values, name, value);
423
528
  }
424
529
 
425
530
  private:
426
- bool Matches(absl::Span<const std::string> label) const {
531
+ bool Matches(absl::Span<const std::string> label_values) const {
427
532
  for (const auto& check : inclusion_checks_) {
428
- if (label[check.offset] != check.value) return false;
533
+ if (label_values[check.offset] != check.value) return false;
429
534
  }
430
535
  return true;
431
536
  }
@@ -475,13 +580,129 @@ const InstrumentMetadata::Description* InstrumentIndex::Find(
475
580
 
476
581
  DomainStorage::DomainStorage(QueryableDomain* domain,
477
582
  std::vector<std::string> label)
478
- : domain_(domain), label_(std::move(label)) {}
479
-
480
- void DomainStorage::Orphaned() { domain_->DomainStorageOrphaned(this); }
583
+ : DataSource(MakeRefCounted<channelz::MetricsDomainStorageNode>(
584
+ absl::StrCat(domain->name(), ":", absl::StrJoin(label, ",")))),
585
+ domain_(domain),
586
+ label_(std::move(label)) {
587
+ channelz_node()->AddParent(domain->channelz_node().get());
588
+ SourceConstructed();
589
+ }
590
+
591
+ void DomainStorage::Orphaned() { SourceDestructing(); }
592
+
593
+ void DomainStorage::AddData(channelz::DataSink sink) {
594
+ sink.AddData(
595
+ "domain_storage",
596
+ channelz::PropertyList()
597
+ .Set("label",
598
+ [this]() {
599
+ channelz::PropertyGrid grid;
600
+ for (size_t i = 0; i < label_.size(); ++i) {
601
+ grid.SetRow(
602
+ domain_->label_names()[i],
603
+ channelz::PropertyList().Set("value", label_[i]));
604
+ }
605
+ return grid;
606
+ }())
607
+ .Set("metrics", [this]() {
608
+ GaugeStorage storage(domain_);
609
+ FillGaugeStorage(storage);
610
+ channelz::PropertyGrid grid;
611
+ for (const auto* metric : domain_->metrics_) {
612
+ Match(
613
+ metric->shape,
614
+ [&, this](InstrumentMetadata::CounterShape) {
615
+ grid.SetRow(metric->name,
616
+ channelz::PropertyList().Set(
617
+ "value", SumCounter(metric->offset)));
618
+ },
619
+ [&, this](InstrumentMetadata::UpDownCounterShape) {
620
+ grid.SetRow(metric->name,
621
+ channelz::PropertyList().Set(
622
+ "value", SumCounter(metric->offset)));
623
+ },
624
+ [&](InstrumentMetadata::DoubleGaugeShape) {
625
+ grid.SetRow(
626
+ metric->name,
627
+ channelz::PropertyList().Set(
628
+ "value", storage.GetDouble(metric->offset)));
629
+ },
630
+ [&](InstrumentMetadata::IntGaugeShape) {
631
+ grid.SetRow(metric->name,
632
+ channelz::PropertyList().Set(
633
+ "value", storage.GetInt(metric->offset)));
634
+ },
635
+ [&](InstrumentMetadata::UintGaugeShape) {
636
+ grid.SetRow(metric->name,
637
+ channelz::PropertyList().Set(
638
+ "value", storage.GetUint(metric->offset)));
639
+ },
640
+ [&](const InstrumentMetadata::HistogramShape& h) {
641
+ channelz::PropertyTable table;
642
+ for (size_t i = 0; i < h.size(); ++i) {
643
+ table.AppendRow(
644
+ channelz::PropertyList()
645
+ .Set("bucket_max", h[i])
646
+ .Set("count", SumCounter(metric->offset + i)));
647
+ }
648
+ grid.SetRow(metric->name, channelz::PropertyList().Set(
649
+ "value", std::move(table)));
650
+ });
651
+ }
652
+ return grid;
653
+ }()));
654
+ }
481
655
 
482
656
  ////////////////////////////////////////////////////////////////////////////////
483
657
  // QueryableDomain
484
658
 
659
+ void QueryableDomain::AddData(channelz::DataSink sink) {
660
+ sink.AddData(
661
+ "domain",
662
+ channelz::PropertyList()
663
+ .Set("allocated_counter_slots", allocated_counter_slots_)
664
+ .Set("allocated_double_gauge_slots", allocated_double_gauge_slots_)
665
+ .Set("allocated_int_gauge_slots", allocated_int_gauge_slots_)
666
+ .Set("allocated_uint_gauge_slots", allocated_uint_gauge_slots_)
667
+ .Set("map_shards", map_shards_size_)
668
+ .Set("metrics",
669
+ [this]() {
670
+ channelz::PropertyGrid grid;
671
+ for (auto* metric : metrics_) {
672
+ grid.SetRow(
673
+ metric->name,
674
+ channelz::PropertyList()
675
+ .Set("description", metric->description)
676
+ .Set("unit", metric->unit)
677
+ .Set("offset", metric->offset)
678
+ .Set("shape",
679
+ Match(
680
+ metric->shape,
681
+ [](InstrumentMetadata::CounterShape)
682
+ -> std::string { return "counter"; },
683
+ [](InstrumentMetadata::UpDownCounterShape)
684
+ -> std::string {
685
+ return "up_down_counter";
686
+ },
687
+ [](InstrumentMetadata::DoubleGaugeShape)
688
+ -> std::string {
689
+ return "double_gauge";
690
+ },
691
+ [](InstrumentMetadata::IntGaugeShape)
692
+ -> std::string { return "int_gauge"; },
693
+ [](InstrumentMetadata::UintGaugeShape)
694
+ -> std::string { return "uint_gauge"; },
695
+ [](const InstrumentMetadata::HistogramShape&
696
+ h) -> std::string {
697
+ return absl::StrCat(
698
+ "histogram:", absl::StrJoin(h, ","));
699
+ })));
700
+ }
701
+ return grid;
702
+ }())
703
+ .Set("labels", absl::StrJoin(label_names_, ",")));
704
+ }
705
+
485
706
  void QueryableDomain::Constructed() {
486
707
  GRPC_CHECK_EQ(prev_, nullptr);
487
708
  prev_ = last_;
@@ -507,15 +728,7 @@ size_t QueryableDomain::TestOnlyCountStorageHeld() const {
507
728
  return count;
508
729
  }
509
730
 
510
- void QueryableDomain::DomainStorageOrphaned(DomainStorage* storage) {
511
- auto label = storage->label();
512
- auto& map_shard = GetMapShard(label);
513
- MutexLock lock(&map_shard.mu);
514
- auto* found_storage = map_shard.storage_map.Lookup(label);
515
- if (found_storage == nullptr) return;
516
- if (found_storage->get() != storage) return;
517
- map_shard.storage_map = map_shard.storage_map.Remove(label);
518
- }
731
+ void QueryableDomain::DomainStorageOrphaned(DomainStorage* /*storage*/) {}
519
732
 
520
733
  QueryableDomain::MapShard& QueryableDomain::GetMapShard(
521
734
  absl::Span<const std::string> label) {
@@ -530,40 +743,9 @@ QueryableDomain::MapShard& QueryableDomain::GetMapShard(
530
743
  return map_shards_[shard];
531
744
  }
532
745
 
533
- std::unique_ptr<StorageSet> QueryableDomain::CreateStorageSet() {
534
- return std::make_unique<StorageSet>(this, map_shards_size_);
535
- }
536
-
537
- void QueryableDomain::RegisterStorageSet(StorageSet* storage_set) {
538
- // Now register the new set.
539
- std::vector<RefCountedPtr<DomainStorage>> added_storage;
540
- MutexLock lock(&active_storage_sets_mu_);
541
- active_storage_sets_.push_back(storage_set);
542
- for (size_t i = 0; i < map_shards_size_; ++i) {
543
- MutexLock lock(&map_shards_[i].mu);
544
- map_shards_[i].storage_map.ForEach(
545
- [&](const auto&, const auto& weak_storage) {
546
- // Only add storage that is not already orphaned.
547
- if (auto storage = weak_storage->RefIfNonZero(); storage != nullptr) {
548
- added_storage.emplace_back(storage);
549
- storage_set->AddStorage(weak_storage);
550
- }
551
- });
552
- }
553
- }
554
-
555
- void QueryableDomain::UnregisterStorageSet(StorageSet* storage_set) {
556
- MutexLock lock(&active_storage_sets_mu_);
557
- active_storage_sets_.erase(
558
- std::remove(active_storage_sets_.begin(), active_storage_sets_.end(),
559
- storage_set),
560
- active_storage_sets_.end());
561
- }
562
-
563
746
  void QueryableDomain::TestOnlyReset() {
747
+ channelz_.Reset();
564
748
  map_shards_ = std::make_unique<MapShard[]>(map_shards_size_);
565
- MutexLock lock(&active_storage_sets_mu_);
566
- active_storage_sets_.clear();
567
749
  }
568
750
 
569
751
  const InstrumentMetadata::Description* QueryableDomain::AllocateCounter(
@@ -577,6 +759,17 @@ const InstrumentMetadata::Description* QueryableDomain::AllocateCounter(
577
759
  return desc;
578
760
  }
579
761
 
762
+ const InstrumentMetadata::Description* QueryableDomain::AllocateUpDownCounter(
763
+ absl::string_view name, absl::string_view description,
764
+ absl::string_view unit) {
765
+ const size_t offset = allocated_counter_slots_++;
766
+ auto* desc =
767
+ InstrumentIndex::Get().Register(this, offset, name, description, unit,
768
+ InstrumentMetadata::UpDownCounterShape{});
769
+ metrics_.push_back(desc);
770
+ return desc;
771
+ }
772
+
580
773
  const InstrumentMetadata::Description* QueryableDomain::AllocateHistogram(
581
774
  absl::string_view name, absl::string_view description,
582
775
  absl::string_view unit, HistogramBuckets bounds) {
@@ -627,68 +820,31 @@ void QueryableDomain::TestOnlyResetAll() {
627
820
  }
628
821
 
629
822
  RefCountedPtr<DomainStorage> QueryableDomain::GetDomainStorage(
630
- std::vector<std::string> label) {
631
- MapShard& map_shard = GetMapShard(label);
632
- // First try to get an existing storage.
633
- map_shard.mu.Lock();
634
- auto storage_map = map_shard.storage_map;
635
- map_shard.mu.Unlock();
636
- // With an AVL we can search outside the lock.
637
- auto* weak_storage = storage_map.Lookup(label);
638
- if (weak_storage != nullptr) {
639
- // Found a weak pointer, try to upgrade it to a strong pointer.
640
- RefCountedPtr<DomainStorage> strong_storage =
641
- (*weak_storage)->RefIfNonZero();
642
- if (strong_storage != nullptr) {
643
- // Upgrade successful, return the strong pointer.
644
- return strong_storage;
645
- }
646
- }
647
- // No hit, or the storage is orphaned: now we lock and search again.
648
- RefCountedPtr<DomainStorage> new_storage;
649
- {
650
- MutexLock lock(&map_shard.mu);
651
- storage_map = map_shard.storage_map;
652
- // We must look up the storage map again, as it may have been created
653
- // by another thread while we were not holding the lock.
654
- weak_storage = storage_map.Lookup(label);
655
- if (weak_storage != nullptr) {
656
- // Found a weak pointer, try to upgrade it to a strong pointer.
657
- RefCountedPtr<DomainStorage> strong_storage =
658
- (*weak_storage)->RefIfNonZero();
659
- if (strong_storage != nullptr) {
660
- // Upgrade successful, return the strong pointer.
661
- return strong_storage;
662
- }
823
+ RefCountedPtr<CollectionScope> scope,
824
+ absl::Span<const std::string> label_values) {
825
+ auto key_labels =
826
+ FilterLabels(label_names_, scope->labels_of_interest_, label_values);
827
+ if (scope->parents_.size() == 1 && scope->parents_[0] != nullptr) {
828
+ auto parent_key_labels = FilterLabels(
829
+ label_names_, scope->parents_[0]->labels_of_interest_, label_values);
830
+ if (key_labels == parent_key_labels) {
831
+ return GetDomainStorage(scope->parents_[0], label_values);
663
832
  }
664
- // Still no hit or orphaned: with the lock held we allocate a new storage
665
- // and insert it into the map.
666
- new_storage = CreateDomainStorage(std::move(label));
667
- auto new_weak_storage = new_storage->WeakRef();
668
- map_shard.storage_map =
669
- map_shard.storage_map.Add(new_weak_storage->label(), new_weak_storage);
670
833
  }
671
- // Add to active storage sets
672
- MutexLock lock(&active_storage_sets_mu_);
673
- for (auto* storage_set : active_storage_sets_) {
674
- storage_set->AddStorage(new_storage->WeakRef());
834
+ size_t shard_idx = absl::HashOf(key_labels) % scope->storage_shards_.size();
835
+ auto& shard = scope->storage_shards_[shard_idx];
836
+ MutexLock lock(&shard.mu);
837
+ auto it = shard.storage.find({this, key_labels});
838
+ if (it != shard.storage.end()) {
839
+ return it->second;
675
840
  }
676
- return new_storage;
841
+ auto storage = CreateDomainStorage(key_labels);
842
+ shard.storage.emplace(std::pair(this, key_labels), storage);
843
+ return storage;
677
844
  }
678
845
 
679
846
  } // namespace instrument_detail
680
847
 
681
- void TestOnlyResetInstruments() {
682
- Hook* hook = hooks.load(std::memory_order_acquire);
683
- while (hook != nullptr) {
684
- Hook* next = hook->next;
685
- delete hook;
686
- hook = next;
687
- }
688
- hooks.store(nullptr, std::memory_order_release);
689
- instrument_detail::QueryableDomain::TestOnlyResetAll();
690
- }
691
-
692
848
  LowContentionBackend::LowContentionBackend(size_t size)
693
849
  : counters_(new std::atomic<uint64_t>[size]) {
694
850
  for (size_t i = 0; i < size; ++i) {
@@ -702,7 +858,7 @@ uint64_t LowContentionBackend::Sum(size_t index) {
702
858
 
703
859
  HighContentionBackend::HighContentionBackend(size_t size) {
704
860
  for (auto& shard : counters_) {
705
- shard = std::make_unique<std::atomic<uint64_t>[]>(size);
861
+ shard = std::make_unique<std::atomic<int64_t>[]>(size);
706
862
  for (size_t i = 0; i < size; ++i) {
707
863
  shard[i].store(0, std::memory_order_relaxed);
708
864
  }
@@ -710,10 +866,134 @@ HighContentionBackend::HighContentionBackend(size_t size) {
710
866
  }
711
867
 
712
868
  uint64_t HighContentionBackend::Sum(size_t index) {
713
- uint64_t sum = 0;
869
+ uint64_t positive_sum = 0;
870
+ uint64_t negative_sum = 0;
714
871
  for (auto& shard : counters_) {
715
- sum += shard[index].load(std::memory_order_relaxed);
872
+ int64_t value = shard[index].load(std::memory_order_relaxed);
873
+ if (value > 0) {
874
+ positive_sum += value;
875
+ } else if (value < 0) {
876
+ negative_sum += -value;
877
+ }
716
878
  }
717
- return sum;
879
+ // Every decrement should have a corresponding increment.
880
+ GRPC_CHECK(positive_sum >= negative_sum);
881
+ return positive_sum - negative_sum;
718
882
  }
883
+
884
+ class GlobalCollectionScopeManager {
885
+ public:
886
+ GlobalCollectionScopeManager(const GlobalCollectionScopeManager&) = delete;
887
+ GlobalCollectionScopeManager& operator=(const GlobalCollectionScopeManager&) =
888
+ delete;
889
+
890
+ static GlobalCollectionScopeManager& Get() {
891
+ static GlobalCollectionScopeManager* manager =
892
+ new GlobalCollectionScopeManager();
893
+ return *manager;
894
+ }
895
+
896
+ RefCountedPtr<CollectionScope> CreateRootScope(
897
+ absl::Span<const std::string> labels, size_t child_shards_count,
898
+ size_t storage_shards_count) {
899
+ MutexLock lock(&mu_);
900
+ if (auto* building = std::get_if<Building>(&state_); building != nullptr) {
901
+ auto scope = CreateCollectionScope({}, labels, child_shards_count,
902
+ storage_shards_count);
903
+ building->root_scopes.push_back(scope);
904
+ return scope;
905
+ } else {
906
+ // Global scope is already created, we can no longer subset labels.
907
+ auto& published = std::get<Published>(state_);
908
+ std::vector<std::string> missing_labels;
909
+ for (const auto& label : labels) {
910
+ if (!published.global_scope->ObservesLabel(label)) {
911
+ missing_labels.push_back(label);
912
+ }
913
+ }
914
+ if (missing_labels.empty()) {
915
+ LOG(ERROR) << "Attempt to create a root scope with labels ["
916
+ << absl::StrJoin(labels, ", ")
917
+ << "] after the global scope was already created. "
918
+ "All requested labels are collected by the global scope, "
919
+ "so this scope will be returned instead. "
920
+ "To eliminate this message, ensure the root scope "
921
+ "creation that triggered it occurs before the first call "
922
+ "to GlobalCollectionScope().";
923
+ } else {
924
+ LOG(ERROR) << "Attempt to create a root scope with labels ["
925
+ << absl::StrJoin(labels, ", ")
926
+ << "] after the global scope was already created. "
927
+ "The following labels are not collected by the global "
928
+ "scope, and so will not be available: ["
929
+ << absl::StrJoin(missing_labels, ", ")
930
+ << "]."
931
+ "To eliminate this message, ensure the root scope "
932
+ "creation that triggered it occurs before the first call "
933
+ "to GlobalCollectionScope().";
934
+ }
935
+ return published.global_scope;
936
+ }
937
+ }
938
+
939
+ RefCountedPtr<CollectionScope> GetGlobalScope() {
940
+ MutexLock lock(&mu_);
941
+ if (auto* building = std::get_if<Building>(&state_); building != nullptr) {
942
+ auto global_scope =
943
+ CreateCollectionScope(building->root_scopes, {}, 32, 32);
944
+ state_ = Published{global_scope};
945
+ return global_scope;
946
+ } else {
947
+ return std::get<Published>(state_).global_scope;
948
+ }
949
+ }
950
+
951
+ void TestOnlyReset() {
952
+ std::variant<Building, Published> state;
953
+ MutexLock lock(&mu_);
954
+ state = std::exchange(state_, Building{});
955
+ if (auto* published = std::get_if<Published>(&state);
956
+ published != nullptr) {
957
+ published->global_scope->TestOnlyReset();
958
+ }
959
+ }
960
+
961
+ private:
962
+ GlobalCollectionScopeManager() = default;
963
+
964
+ struct Building {
965
+ std::vector<RefCountedPtr<CollectionScope>> root_scopes;
966
+ };
967
+
968
+ struct Published {
969
+ RefCountedPtr<CollectionScope> global_scope;
970
+ };
971
+
972
+ Mutex mu_;
973
+ std::variant<Building, Published> state_ ABSL_GUARDED_BY(mu_);
974
+ };
975
+
976
+ RefCountedPtr<CollectionScope> CreateRootCollectionScope(
977
+ absl::Span<const std::string> labels, size_t child_shards_count,
978
+ size_t storage_shards_count) {
979
+ return GlobalCollectionScopeManager::Get().CreateRootScope(
980
+ labels, child_shards_count, storage_shards_count);
981
+ }
982
+
983
+ RefCountedPtr<CollectionScope> GlobalCollectionScope() {
984
+ return GlobalCollectionScopeManager::Get().GetGlobalScope();
985
+ }
986
+
987
+ void TestOnlyResetInstruments() {
988
+ Hook* hook = hooks.load(std::memory_order_acquire);
989
+ while (hook != nullptr) {
990
+ Hook* next = hook->next;
991
+ delete hook;
992
+ hook = next;
993
+ }
994
+ hooks.store(nullptr, std::memory_order_release);
995
+ instrument_detail::QueryableDomain::TestOnlyResetAll();
996
+ GlobalCollectionScopeManager::Get().TestOnlyReset();
997
+ }
998
+
719
999
  } // namespace grpc_core