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