From 1f960697c5020db85743a68b3533b8ef45a9629e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 3 Feb 2023 13:18:23 -0800 Subject: [PATCH] Revert "Revert "Revert "server: introduce ServerMetricRecorder API and move per-call reporting from a C++ interceptor to a C-core filter (#32106)" (#32272)" (#32279)" (#32293) This reverts commit 4475e74c6aa50f5dcf35a7d6e794df2b6c84e57b. --- BUILD | 37 +-- CMakeLists.txt | 33 +- Makefile | 2 - build_autogenerated.yaml | 58 ++-- config.m4 | 2 - config.w32 | 2 - gRPC-C++.podspec | 13 +- gRPC-Core.podspec | 9 +- grpc.gemspec | 3 - grpc.gyp | 6 +- include/grpc/impl/grpc_types.h | 3 - include/grpcpp/ext/call_metric_recorder.h | 43 ++- include/grpcpp/ext/orca_service.h | 33 +- include/grpcpp/ext/server_metric_recorder.h | 108 ------ include/grpcpp/server.h | 17 +- include/grpcpp/server_builder.h | 16 +- include/grpcpp/server_context.h | 16 +- include/grpcpp/server_interface.h | 10 - package.xml | 3 - src/core/BUILD | 43 --- .../backend_metrics/backend_metric_filter.cc | 148 --------- .../backend_metrics/backend_metric_filter.h | 52 --- .../backend_metrics/backend_metric_provider.h | 29 -- src/core/lib/channel/context.h | 4 - .../plugin_registry/grpc_plugin_registry.cc | 2 - src/cpp/server/backend_metric_recorder.cc | 311 ------------------ src/cpp/server/backend_metric_recorder.h | 81 ----- src/cpp/server/orca/call_metric_recorder.cc | 125 +++++++ src/cpp/server/orca/orca_interceptor.cc | 76 +++++ src/cpp/server/orca/orca_interceptor.h | 49 +++ src/cpp/server/orca/orca_service.cc | 93 ++++-- src/cpp/server/server_builder.cc | 17 +- src/cpp/server/server_cc.cc | 22 +- src/cpp/server/server_context.cc | 12 +- src/python/grpcio/grpc_core_dependencies.py | 1 - test/cpp/end2end/BUILD | 5 +- test/cpp/end2end/client_lb_end2end_test.cc | 300 ++++++++--------- test/cpp/end2end/orca_service_end2end_test.cc | 30 +- test/cpp/end2end/xds/BUILD | 1 + test/cpp/end2end/xds/xds_end2end_test_lib.cc | 2 +- tools/doxygen/Doxyfile.c++ | 1 - tools/doxygen/Doxyfile.c++.internal | 7 +- tools/doxygen/Doxyfile.core.internal | 3 - 43 files changed, 634 insertions(+), 1194 deletions(-) delete mode 100644 include/grpcpp/ext/server_metric_recorder.h delete mode 100644 src/core/ext/filters/backend_metrics/backend_metric_filter.cc delete mode 100644 src/core/ext/filters/backend_metrics/backend_metric_filter.h delete mode 100644 src/core/ext/filters/backend_metrics/backend_metric_provider.h delete mode 100644 src/cpp/server/backend_metric_recorder.cc delete mode 100644 src/cpp/server/backend_metric_recorder.h create mode 100644 src/cpp/server/orca/call_metric_recorder.cc create mode 100644 src/cpp/server/orca/orca_interceptor.cc create mode 100644 src/cpp/server/orca/orca_interceptor.h diff --git a/BUILD b/BUILD index ae04a406d63..b0d1fa2bd1d 100644 --- a/BUILD +++ b/BUILD @@ -762,7 +762,6 @@ grpc_cc_library( "grpc_base", # standard plugins "census", - "//src/core:grpc_backend_metric_filter", "//src/core:grpc_deadline_filter", "//src/core:grpc_client_authority_filter", "//src/core:grpc_lb_policy_grpclb", @@ -1824,7 +1823,6 @@ grpc_cc_library( "grpc_security_base", "grpc_service_config_impl", "grpc_trace", - "grpcpp_backend_metric_recorder", "grpcpp_call_metric_recorder", "grpcpp_status", "iomgr_timer", @@ -1840,7 +1838,6 @@ grpc_cc_library( "//src/core:error", "//src/core:gpr_atm", "//src/core:gpr_manual_constructor", - "//src/core:grpc_backend_metric_provider", "//src/core:grpc_service_config", "//src/core:grpc_transport_inproc", "//src/core:json", @@ -1893,7 +1890,6 @@ grpc_cc_library( "grpc_service_config_impl", "grpc_trace", "grpc_unsecure", - "grpcpp_backend_metric_recorder", "grpcpp_call_metric_recorder", "grpcpp_status", "iomgr_timer", @@ -1905,7 +1901,6 @@ grpc_cc_library( "//src/core:error", "//src/core:gpr_atm", "//src/core:gpr_manual_constructor", - "//src/core:grpc_backend_metric_provider", "//src/core:grpc_insecure_credentials", "//src/core:grpc_service_config", "//src/core:grpc_transport_inproc", @@ -1983,42 +1978,45 @@ grpc_cc_library( grpc_cc_library( name = "grpcpp_call_metric_recorder", + srcs = [ + "src/cpp/server/orca/call_metric_recorder.cc", + ], external_deps = [ "absl/strings", "absl/types:optional", + "upb_lib", ], language = "c++", public_hdrs = [ "include/grpcpp/ext/call_metric_recorder.h", ], visibility = ["@grpc:public"], - deps = ["grpc++_public_hdrs"], + deps = [ + "grpc++_public_hdrs", + "xds_orca_upb", + "//src/core:arena", + "//src/core:grpc_backend_metric_data", + ], ) grpc_cc_library( - name = "grpcpp_backend_metric_recorder", + name = "grpcpp_orca_interceptor", srcs = [ - "src/cpp/server/backend_metric_recorder.cc", + "src/cpp/server/orca/orca_interceptor.cc", ], hdrs = [ - "src/cpp/server/backend_metric_recorder.h", + "src/cpp/server/orca/orca_interceptor.h", ], external_deps = [ - "absl/base:core_headers", "absl/strings", + "absl/types:optional", ], language = "c++", - public_hdrs = [ - "include/grpcpp/ext/server_metric_recorder.h", - ], visibility = ["@grpc:public"], deps = [ - "gpr", - "grpc++_public_hdrs", - "grpc_trace", + "grpc++", + "grpc_base", "grpcpp_call_metric_recorder", - "//src/core:grpc_backend_metric_data", - "//src/core:grpc_backend_metric_provider", ], ) @@ -2029,7 +2027,6 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", - "absl/strings", "absl/time", "absl/types:optional", "upb_lib", @@ -2045,13 +2042,11 @@ grpc_cc_library( "gpr", "grpc++", "grpc_base", - "grpcpp_backend_metric_recorder", "protobuf_duration_upb", "ref_counted_ptr", "xds_orca_service_upb", "xds_orca_upb", "//src/core:default_event_engine", - "//src/core:grpc_backend_metric_data", "//src/core:ref_counted", "//src/core:time", ], diff --git a/CMakeLists.txt b/CMakeLists.txt index 83d1c751df4..816a4b40d0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1705,7 +1705,6 @@ endif() add_library(grpc - src/core/ext/filters/backend_metrics/backend_metric_filter.cc src/core/ext/filters/census/grpc_context.cc src/core/ext/filters/channel_idle/channel_idle_filter.cc src/core/ext/filters/channel_idle/idle_filter_state.cc @@ -2723,7 +2722,6 @@ endif() endif() add_library(grpc_unsecure - src/core/ext/filters/backend_metrics/backend_metric_filter.cc src/core/ext/filters/census/grpc_context.cc src/core/ext/filters/channel_idle/channel_idle_filter.cc src/core/ext/filters/channel_idle/idle_filter_state.cc @@ -3360,7 +3358,6 @@ add_library(grpc++ src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -3368,6 +3365,7 @@ add_library(grpc++ src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -3506,7 +3504,6 @@ foreach(_hdr include/grpcpp/create_channel_posix.h include/grpcpp/ext/call_metric_recorder.h include/grpcpp/ext/health_check_service_server_builder_option.h - include/grpcpp/ext/server_metric_recorder.h include/grpcpp/generic/async_generic_service.h include/grpcpp/generic/generic_stub.h include/grpcpp/grpcpp.h @@ -4066,7 +4063,6 @@ add_library(grpc++_unsecure src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -4074,6 +4070,7 @@ add_library(grpc++_unsecure src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc src/cpp/server/server_cc.cc @@ -4209,7 +4206,6 @@ foreach(_hdr include/grpcpp/create_channel_posix.h include/grpcpp/ext/call_metric_recorder.h include/grpcpp/ext/health_check_service_server_builder_option.h - include/grpcpp/ext/server_metric_recorder.h include/grpcpp/generic/async_generic_service.h include/grpcpp/generic/generic_stub.h include/grpcpp/grpcpp.h @@ -7145,7 +7141,6 @@ add_executable(binder_transport_test src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -7153,6 +7148,7 @@ add_executable(binder_transport_test src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -8815,6 +8811,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/orca_load_report.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/orca_load_report.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/orca_load_report.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc src/cpp/server/orca/orca_service.cc test/core/util/test_lb_policies.cc test/cpp/end2end/client_lb_end2end_test.cc @@ -10039,7 +10036,6 @@ add_executable(endpoint_binder_pool_test src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -10047,6 +10043,7 @@ add_executable(endpoint_binder_pool_test src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -10733,7 +10730,6 @@ add_executable(fake_binder_test src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -10741,6 +10737,7 @@ add_executable(fake_binder_test src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -21530,7 +21527,6 @@ add_executable(transport_stream_receiver_test src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -21538,6 +21534,7 @@ add_executable(transport_stream_receiver_test src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -22277,7 +22274,6 @@ add_executable(wire_reader_test src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -22285,6 +22281,7 @@ add_executable(wire_reader_test src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -22377,7 +22374,6 @@ add_executable(wire_writer_test src/cpp/common/validate_service_config.cc src/cpp/common/version_cc.cc src/cpp/server/async_generic_service.cc - src/cpp/server/backend_metric_recorder.cc src/cpp/server/channel_argument_option.cc src/cpp/server/create_default_thread_pool.cc src/cpp/server/external_connection_acceptor_impl.cc @@ -22385,6 +22381,7 @@ add_executable(wire_writer_test src/cpp/server/health/health_check_service.cc src/cpp/server/health/health_check_service_server_builder_option.cc src/cpp/server/insecure_server_credentials.cc + src/cpp/server/orca/call_metric_recorder.cc src/cpp/server/secure_server_credentials.cc src/cpp/server/server_builder.cc src/cpp/server/server_callback.cc @@ -22829,6 +22826,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/connection_attempt_injector.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_cluster_end2end_test.cc @@ -23103,6 +23101,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/connection_attempt_injector.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_cluster_type_end2end_test.cc @@ -23351,6 +23350,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_core_end2end_test.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -23630,6 +23630,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h src/cpp/server/csds/csds.cc + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_csds_end2end_test.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -23813,6 +23814,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/tls.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -24047,6 +24049,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc test/cpp/end2end/xds/xds_fault_injection_end2end_test.cc @@ -24741,6 +24744,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc test/cpp/end2end/xds/xds_outlier_detection_end2end_test.cc @@ -24920,6 +24924,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc test/cpp/end2end/xds/xds_override_host_end2end_test.cc @@ -25165,6 +25170,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/connection_attempt_injector.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -25341,6 +25347,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/rls_server.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -25633,6 +25640,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/string.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc test/cpp/end2end/xds/xds_routing_end2end_test.cc @@ -25808,6 +25816,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/v3/wrr_locality.grpc.pb.h + src/cpp/server/orca/orca_interceptor.cc test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds/xds_end2end_test_lib.cc test/cpp/end2end/xds/xds_server.cc diff --git a/Makefile b/Makefile index 344731eec5f..83ad85ff6ac 100644 --- a/Makefile +++ b/Makefile @@ -959,7 +959,6 @@ endif # start of build recipe for library "grpc" (generated by makelib(lib) template function) LIBGRPC_SRC = \ - src/core/ext/filters/backend_metrics/backend_metric_filter.cc \ src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.cc \ src/core/ext/filters/channel_idle/idle_filter_state.cc \ @@ -1830,7 +1829,6 @@ endif # start of build recipe for library "grpc_unsecure" (generated by makelib(lib) template function) LIBGRPC_UNSECURE_SRC = \ - src/core/ext/filters/backend_metrics/backend_metric_filter.cc \ src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.cc \ src/core/ext/filters/channel_idle/idle_filter_state.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 281e1b66061..51c1d37f80c 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -326,8 +326,6 @@ libs: - include/grpc/support/time.h - include/grpc/support/workaround_list.h headers: - - src/core/ext/filters/backend_metrics/backend_metric_filter.h - - src/core/ext/filters/backend_metrics/backend_metric_provider.h - src/core/ext/filters/channel_idle/channel_idle_filter.h - src/core/ext/filters/channel_idle/idle_filter_state.h - src/core/ext/filters/client_channel/backend_metric.h @@ -1098,7 +1096,6 @@ libs: - src/core/tsi/transport_security_interface.h - third_party/xxhash/xxhash.h src: - - src/core/ext/filters/backend_metrics/backend_metric_filter.cc - src/core/ext/filters/census/grpc_context.cc - src/core/ext/filters/channel_idle/channel_idle_filter.cc - src/core/ext/filters/channel_idle/idle_filter_state.cc @@ -1994,8 +1991,6 @@ libs: - include/grpc/support/time.h - include/grpc/support/workaround_list.h headers: - - src/core/ext/filters/backend_metrics/backend_metric_filter.h - - src/core/ext/filters/backend_metrics/backend_metric_provider.h - src/core/ext/filters/channel_idle/channel_idle_filter.h - src/core/ext/filters/channel_idle/idle_filter_state.h - src/core/ext/filters/client_channel/backend_metric.h @@ -2380,7 +2375,6 @@ libs: - src/core/tsi/transport_security_interface.h - third_party/xxhash/xxhash.h src: - - src/core/ext/filters/backend_metrics/backend_metric_filter.cc - src/core/ext/filters/census/grpc_context.cc - src/core/ext/filters/channel_idle/channel_idle_filter.cc - src/core/ext/filters/channel_idle/idle_filter_state.cc @@ -2888,7 +2882,6 @@ libs: - include/grpcpp/create_channel_posix.h - include/grpcpp/ext/call_metric_recorder.h - include/grpcpp/ext/health_check_service_server_builder_option.h - - include/grpcpp/ext/server_metric_recorder.h - include/grpcpp/generic/async_generic_service.h - include/grpcpp/generic/generic_stub.h - include/grpcpp/grpcpp.h @@ -3033,7 +3026,6 @@ libs: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -3085,7 +3077,6 @@ libs: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -3093,6 +3084,7 @@ libs: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -3309,7 +3301,6 @@ libs: - include/grpcpp/create_channel_posix.h - include/grpcpp/ext/call_metric_recorder.h - include/grpcpp/ext/health_check_service_server_builder_option.h - - include/grpcpp/ext/server_metric_recorder.h - include/grpcpp/generic/async_generic_service.h - include/grpcpp/generic/generic_stub.h - include/grpcpp/grpcpp.h @@ -3429,7 +3420,6 @@ libs: headers: - src/cpp/client/create_channel_internal.h - src/cpp/common/channel_filter.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -3454,7 +3444,6 @@ libs: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -3462,6 +3451,7 @@ libs: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc - src/cpp/server/server_cc.cc @@ -5101,7 +5091,6 @@ targets: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -5153,7 +5142,6 @@ targets: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -5161,6 +5149,7 @@ targets: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -5991,6 +5980,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/core/util/test_lb_policies.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/test_service_impl.h @@ -6000,6 +5990,7 @@ targets: - src/proto/grpc/testing/echo_messages.proto - src/proto/grpc/testing/simple_messages.proto - src/proto/grpc/testing/xds/v3/orca_load_report.proto + - src/cpp/server/orca/orca_interceptor.cc - src/cpp/server/orca/orca_service.cc - test/core/util/test_lb_policies.cc - test/cpp/end2end/client_lb_end2end_test.cc @@ -6459,7 +6450,6 @@ targets: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -6511,7 +6501,6 @@ targets: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -6519,6 +6508,7 @@ targets: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -6882,7 +6872,6 @@ targets: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -6934,7 +6923,6 @@ targets: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -6942,6 +6930,7 @@ targets: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -12148,7 +12137,6 @@ targets: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -12199,7 +12187,6 @@ targets: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -12207,6 +12194,7 @@ targets: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -12546,7 +12534,6 @@ targets: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -12598,7 +12585,6 @@ targets: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -12606,6 +12592,7 @@ targets: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -12651,7 +12638,6 @@ targets: - src/cpp/client/secure_credentials.h - src/cpp/common/channel_filter.h - src/cpp/common/secure_auth_context.h - - src/cpp/server/backend_metric_recorder.h - src/cpp/server/dynamic_thread_pool.h - src/cpp/server/external_connection_acceptor_impl.h - src/cpp/server/health/default_health_check_service.h @@ -12703,7 +12689,6 @@ targets: - src/cpp/common/validate_service_config.cc - src/cpp/common/version_cc.cc - src/cpp/server/async_generic_service.cc - - src/cpp/server/backend_metric_recorder.cc - src/cpp/server/channel_argument_option.cc - src/cpp/server/create_default_thread_pool.cc - src/cpp/server/external_connection_acceptor_impl.cc @@ -12711,6 +12696,7 @@ targets: - src/cpp/server/health/health_check_service.cc - src/cpp/server/health/health_check_service_server_builder_option.cc - src/cpp/server/insecure_server_credentials.cc + - src/cpp/server/orca/call_metric_recorder.cc - src/cpp/server/secure_server_credentials.cc - src/cpp/server/server_builder.cc - src/cpp/server/server_callback.cc @@ -12835,6 +12821,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h @@ -12873,6 +12860,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/connection_attempt_injector.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_cluster_end2end_test.cc @@ -12919,6 +12907,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h @@ -12958,6 +12947,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/connection_attempt_injector.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_cluster_type_end2end_test.cc @@ -13008,6 +12998,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/core/util/scoped_env_var.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h @@ -13046,6 +13037,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_core_end2end_test.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -13112,6 +13104,7 @@ targets: language: c++ headers: - src/cpp/server/csds/csds.h + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -13152,6 +13145,7 @@ targets: - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto - src/cpp/server/csds/csds.cc + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_csds_end2end_test.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -13169,6 +13163,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -13210,6 +13205,7 @@ targets: - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto - src/proto/grpc/testing/xds/v3/tls.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -13245,6 +13241,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -13284,6 +13281,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc - test/cpp/end2end/xds/xds_fault_injection_end2end_test.cc @@ -13480,6 +13478,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -13519,6 +13518,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc - test/cpp/end2end/xds/xds_outlier_detection_end2end_test.cc @@ -13535,6 +13535,7 @@ targets: build: test language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/core/util/scoped_env_var.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h @@ -13576,6 +13577,7 @@ targets: - src/proto/grpc/testing/xds/v3/stateful_session.proto - src/proto/grpc/testing/xds/v3/stateful_session_cookie.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc - test/cpp/end2end/xds/xds_override_host_end2end_test.cc @@ -13614,6 +13616,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h @@ -13653,6 +13656,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/connection_attempt_injector.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -13670,6 +13674,7 @@ targets: build: test language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/core/util/scoped_env_var.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/rls_server.h @@ -13711,6 +13716,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/rls_server.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -13771,6 +13777,7 @@ targets: run: false language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h - test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -13810,6 +13817,7 @@ targets: - src/proto/grpc/testing/xds/v3/route.proto - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc - test/cpp/end2end/xds/xds_routing_end2end_test.cc @@ -13826,6 +13834,7 @@ targets: build: test language: c++ headers: + - src/cpp/server/orca/orca_interceptor.h - test/core/util/scoped_env_var.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h @@ -13866,6 +13875,7 @@ targets: - src/proto/grpc/testing/xds/v3/router.proto - src/proto/grpc/testing/xds/v3/string.proto - src/proto/grpc/testing/xds/v3/wrr_locality.proto + - src/cpp/server/orca/orca_interceptor.cc - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds/xds_end2end_test_lib.cc - test/cpp/end2end/xds/xds_server.cc diff --git a/config.m4 b/config.m4 index 98b27744058..66aed674cf9 100644 --- a/config.m4 +++ b/config.m4 @@ -40,7 +40,6 @@ if test "$PHP_GRPC" != "no"; then PHP_SUBST(GRPC_SHARED_LIBADD) PHP_NEW_EXTENSION(grpc, - src/core/ext/filters/backend_metrics/backend_metric_filter.cc \ src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.cc \ src/core/ext/filters/channel_idle/idle_filter_state.cc \ @@ -1270,7 +1269,6 @@ if test "$PHP_GRPC" != "no"; then -DGRPC_XDS_USER_AGENT_NAME_SUFFIX='"\"PHP\""' \ -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX='"\"1.53.0dev\""') - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/backend_metrics) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/channel_idle) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel) diff --git a/config.w32 b/config.w32 index 12bf9850cc3..e742f8bb2e4 100644 --- a/config.w32 +++ b/config.w32 @@ -6,7 +6,6 @@ ARG_WITH("grpc", "grpc support", "no"); if (PHP_GRPC != "no") { EXTENSION("grpc", - "src\\core\\ext\\filters\\backend_metrics\\backend_metric_filter.cc " + "src\\core\\ext\\filters\\census\\grpc_context.cc " + "src\\core\\ext\\filters\\channel_idle\\channel_idle_filter.cc " + "src\\core\\ext\\filters\\channel_idle\\idle_filter_state.cc " + @@ -1268,7 +1267,6 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\backend_metrics"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\census"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\channel_idle"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 123435c836c..fa4734e9879 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -91,7 +91,6 @@ Pod::Spec.new do |s| 'include/grpcpp/create_channel_posix.h', 'include/grpcpp/ext/call_metric_recorder.h', 'include/grpcpp/ext/health_check_service_server_builder_option.h', - 'include/grpcpp/ext/server_metric_recorder.h', 'include/grpcpp/generic/async_generic_service.h', 'include/grpcpp/generic/generic_stub.h', 'include/grpcpp/grpcpp.h', @@ -239,9 +238,7 @@ Pod::Spec.new do |s| ss.dependency 'abseil/types/variant', abseil_version ss.dependency 'abseil/utility/utility', abseil_version - ss.source_files = 'src/core/ext/filters/backend_metrics/backend_metric_filter.h', - 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', - 'src/core/ext/filters/channel_idle/channel_idle_filter.h', + ss.source_files = 'src/core/ext/filters/channel_idle/channel_idle_filter.h', 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/client_channel/backend_metric.h', 'src/core/ext/filters/client_channel/backup_poller.h', @@ -1103,8 +1100,6 @@ Pod::Spec.new do |s| 'src/cpp/common/validate_service_config.cc', 'src/cpp/common/version_cc.cc', 'src/cpp/server/async_generic_service.cc', - 'src/cpp/server/backend_metric_recorder.cc', - 'src/cpp/server/backend_metric_recorder.h', 'src/cpp/server/channel_argument_option.cc', 'src/cpp/server/create_default_thread_pool.cc', 'src/cpp/server/dynamic_thread_pool.h', @@ -1115,6 +1110,7 @@ Pod::Spec.new do |s| 'src/cpp/server/health/health_check_service.cc', 'src/cpp/server/health/health_check_service_server_builder_option.cc', 'src/cpp/server/insecure_server_credentials.cc', + 'src/cpp/server/orca/call_metric_recorder.cc', 'src/cpp/server/secure_server_credentials.cc', 'src/cpp/server/secure_server_credentials.h', 'src/cpp/server/server_builder.cc', @@ -1189,9 +1185,7 @@ Pod::Spec.new do |s| 'third_party/upb/upb/upb.hpp', 'third_party/xxhash/xxhash.h' - ss.private_header_files = 'src/core/ext/filters/backend_metrics/backend_metric_filter.h', - 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', - 'src/core/ext/filters/channel_idle/channel_idle_filter.h', + ss.private_header_files = 'src/core/ext/filters/channel_idle/channel_idle_filter.h', 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/client_channel/backend_metric.h', 'src/core/ext/filters/client_channel/backup_poller.h', @@ -2009,7 +2003,6 @@ Pod::Spec.new do |s| 'src/cpp/client/secure_credentials.h', 'src/cpp/common/channel_filter.h', 'src/cpp/common/secure_auth_context.h', - 'src/cpp/server/backend_metric_recorder.h', 'src/cpp/server/dynamic_thread_pool.h', 'src/cpp/server/external_connection_acceptor_impl.h', 'src/cpp/server/health/default_health_check_service.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 928f3acb90e..46f12b2ed37 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -206,10 +206,7 @@ Pod::Spec.new do |s| ss.dependency 'abseil/utility/utility', abseil_version ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC -Wno-unreachable-code -Wno-shorten-64-to-32' - ss.source_files = 'src/core/ext/filters/backend_metrics/backend_metric_filter.cc', - 'src/core/ext/filters/backend_metrics/backend_metric_filter.h', - 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', - 'src/core/ext/filters/census/grpc_context.cc', + ss.source_files = 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/channel_idle/channel_idle_filter.cc', 'src/core/ext/filters/channel_idle/channel_idle_filter.h', 'src/core/ext/filters/channel_idle/idle_filter_state.cc', @@ -1894,9 +1891,7 @@ Pod::Spec.new do |s| 'third_party/upb/upb/upb.h', 'third_party/upb/upb/upb.hpp', 'third_party/xxhash/xxhash.h' - ss.private_header_files = 'src/core/ext/filters/backend_metrics/backend_metric_filter.h', - 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', - 'src/core/ext/filters/channel_idle/channel_idle_filter.h', + ss.private_header_files = 'src/core/ext/filters/channel_idle/channel_idle_filter.h', 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/client_channel/backend_metric.h', 'src/core/ext/filters/client_channel/backup_poller.h', diff --git a/grpc.gemspec b/grpc.gemspec index 9adc8350126..afd461dc910 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -115,9 +115,6 @@ Gem::Specification.new do |s| s.files += %w( include/grpc/support/thd_id.h ) s.files += %w( include/grpc/support/time.h ) s.files += %w( include/grpc/support/workaround_list.h ) - s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_filter.cc ) - s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_filter.h ) - s.files += %w( src/core/ext/filters/backend_metrics/backend_metric_provider.h ) s.files += %w( src/core/ext/filters/census/grpc_context.cc ) s.files += %w( src/core/ext/filters/channel_idle/channel_idle_filter.cc ) s.files += %w( src/core/ext/filters/channel_idle/channel_idle_filter.h ) diff --git a/grpc.gyp b/grpc.gyp index a9ee344878a..7478fd23460 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -372,7 +372,6 @@ 'upb', ], 'sources': [ - 'src/core/ext/filters/backend_metrics/backend_metric_filter.cc', 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/channel_idle/channel_idle_filter.cc', 'src/core/ext/filters/channel_idle/idle_filter_state.cc', @@ -1185,7 +1184,6 @@ 'upb', ], 'sources': [ - 'src/core/ext/filters/backend_metrics/backend_metric_filter.cc', 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/channel_idle/channel_idle_filter.cc', 'src/core/ext/filters/channel_idle/idle_filter_state.cc', @@ -1625,7 +1623,6 @@ 'src/cpp/common/validate_service_config.cc', 'src/cpp/common/version_cc.cc', 'src/cpp/server/async_generic_service.cc', - 'src/cpp/server/backend_metric_recorder.cc', 'src/cpp/server/channel_argument_option.cc', 'src/cpp/server/create_default_thread_pool.cc', 'src/cpp/server/external_connection_acceptor_impl.cc', @@ -1633,6 +1630,7 @@ 'src/cpp/server/health/health_check_service.cc', 'src/cpp/server/health/health_check_service_server_builder_option.cc', 'src/cpp/server/insecure_server_credentials.cc', + 'src/cpp/server/orca/call_metric_recorder.cc', 'src/cpp/server/secure_server_credentials.cc', 'src/cpp/server/server_builder.cc', 'src/cpp/server/server_callback.cc', @@ -1758,7 +1756,6 @@ 'src/cpp/common/validate_service_config.cc', 'src/cpp/common/version_cc.cc', 'src/cpp/server/async_generic_service.cc', - 'src/cpp/server/backend_metric_recorder.cc', 'src/cpp/server/channel_argument_option.cc', 'src/cpp/server/create_default_thread_pool.cc', 'src/cpp/server/external_connection_acceptor_impl.cc', @@ -1766,6 +1763,7 @@ 'src/cpp/server/health/health_check_service.cc', 'src/cpp/server/health/health_check_service_server_builder_option.cc', 'src/cpp/server/insecure_server_credentials.cc', + 'src/cpp/server/orca/call_metric_recorder.cc', 'src/cpp/server/server_builder.cc', 'src/cpp/server/server_callback.cc', 'src/cpp/server/server_cc.cc', diff --git a/include/grpc/impl/grpc_types.h b/include/grpc/impl/grpc_types.h index 7206cca8b56..7640e04833f 100644 --- a/include/grpc/impl/grpc_types.h +++ b/include/grpc/impl/grpc_types.h @@ -141,9 +141,6 @@ typedef struct { #define GRPC_ARG_ENABLE_CENSUS "grpc.census" /** If non-zero, enable load reporting. */ #define GRPC_ARG_ENABLE_LOAD_REPORTING "grpc.loadreporting" -/** If non-zero, call metric recording is enabled. */ -#define GRPC_ARG_SERVER_CALL_METRIC_RECORDING \ - "grpc.server_call_metric_recording" /** Request that optional features default to off (regardless of what they usually default to) - to enable tight control over what gets enabled */ #define GRPC_ARG_MINIMAL_STACK "grpc.minimal_stack" diff --git a/include/grpcpp/ext/call_metric_recorder.h b/include/grpcpp/ext/call_metric_recorder.h index 70ef2a9d933..85e77162957 100644 --- a/include/grpcpp/ext/call_metric_recorder.h +++ b/include/grpcpp/ext/call_metric_recorder.h @@ -28,30 +28,43 @@ #include #include +namespace grpc_core { +class Arena; +struct BackendMetricData; +} // namespace grpc_core + namespace grpc { +class ServerBuilder; + namespace experimental { +class OrcaServerInterceptor; + +// Registers the per-rpc orca load reporter into the \a ServerBuilder. +// Once this is done, the server will automatically send the load metrics +// after each RPC as they were reported. In order to report load metrics, +// call the \a ServerContext::ExperimentalGetCallMetricRecorder() method to +// retrieve the recorder for the current call. +void EnableCallMetricRecording(ServerBuilder*); /// Records call metrics for the purpose of load balancing. /// During an RPC, call \a ServerContext::ExperimentalGetCallMetricRecorder() /// method to retrive the recorder for the current call. class CallMetricRecorder { public: - virtual ~CallMetricRecorder() = default; + explicit CallMetricRecorder(grpc_core::Arena* arena); + ~CallMetricRecorder(); /// Records a call metric measurement for CPU utilization. /// Multiple calls to this method will override the stored value. - /// Values outside of the valid range [0, 1] are ignored. - virtual CallMetricRecorder& RecordCpuUtilizationMetric(double value) = 0; + CallMetricRecorder& RecordCpuUtilizationMetric(double value); /// Records a call metric measurement for memory utilization. /// Multiple calls to this method will override the stored value. - /// Values outside of the valid range [0, 1] are ignored. - virtual CallMetricRecorder& RecordMemoryUtilizationMetric(double value) = 0; + CallMetricRecorder& RecordMemoryUtilizationMetric(double value); - /// Records a call metric measurement for queries per second. + /// Records a call metric measurement for QPS. /// Multiple calls to this method will override the stored value. - /// Values outside of the valid range [0, infy) are ignored. - virtual CallMetricRecorder& RecordQpsMetric(double value) = 0; + CallMetricRecorder& RecordQpsMetric(double value); /// Records a call metric measurement for utilization. /// Multiple calls to this method with the same name will @@ -60,9 +73,7 @@ class CallMetricRecorder { /// itself, since it's going to be sent as trailers after the RPC /// finishes. It is assumed the strings are common names that /// are global constants. - /// Values outside of the valid range [0, 1] are ignored. - virtual CallMetricRecorder& RecordUtilizationMetric(string_ref name, - double value) = 0; + CallMetricRecorder& RecordUtilizationMetric(string_ref name, double value); /// Records a call metric measurement for request cost. /// Multiple calls to this method with the same name will @@ -71,8 +82,14 @@ class CallMetricRecorder { /// itself, since it's going to be sent as trailers after the RPC /// finishes. It is assumed the strings are common names that /// are global constants. - virtual CallMetricRecorder& RecordRequestCostMetric(string_ref name, - double value) = 0; + CallMetricRecorder& RecordRequestCostMetric(string_ref name, double value); + + private: + absl::optional CreateSerializedReport(); + + internal::Mutex mu_; + grpc_core::BackendMetricData* backend_metric_data_ ABSL_GUARDED_BY(&mu_); + friend class experimental::OrcaServerInterceptor; }; } // namespace experimental diff --git a/include/grpcpp/ext/orca_service.h b/include/grpcpp/ext/orca_service.h index 83a676095dc..52053d30991 100644 --- a/include/grpcpp/ext/orca_service.h +++ b/include/grpcpp/ext/orca_service.h @@ -23,7 +23,6 @@ #include "absl/time/time.h" #include "absl/types/optional.h" -#include #include #include #include @@ -49,22 +48,38 @@ class OrcaService : public Service { } }; - // ServerMetricRecorder is required. - OrcaService(ServerMetricRecorder* const server_metric_recorder, - Options options); + explicit OrcaService(Options options); + + // Sets or removes the CPU utilization value to be reported to clients. + void SetCpuUtilization(double cpu_utilization); + void DeleteCpuUtilization(); + + // Sets of removes the memory utilization value to be reported to clients. + void SetMemoryUtilization(double memory_utilization); + void DeleteMemoryUtilization(); + + // Sets of removes the QPS value to be reported to clients. + void SetQps(double qps); + void DeleteQps(); + + // Sets or removed named utilization values to be reported to clients. + void SetNamedUtilization(std::string name, double utilization); + void DeleteNamedUtilization(const std::string& name); + void SetAllNamedUtilization(std::map named_utilization); private: class Reactor; Slice GetOrCreateSerializedResponse(); - const ServerMetricRecorder* const server_metric_recorder_; const absl::Duration min_report_duration_; + grpc::internal::Mutex mu_; - // Contains the last serialized metrics from server_metric_recorder_. - absl::optional response_slice_ ABSL_GUARDED_BY(mu_); - // The update sequence number of metrics serialized in response_slice_. - absl::optional response_slice_seq_ ABSL_GUARDED_BY(mu_); + double cpu_utilization_ ABSL_GUARDED_BY(&mu_) = -1; + double memory_utilization_ ABSL_GUARDED_BY(&mu_) = -1; + double qps_ ABSL_GUARDED_BY(&mu_) = -1; + std::map named_utilization_ ABSL_GUARDED_BY(&mu_); + absl::optional response_slice_ ABSL_GUARDED_BY(&mu_); }; } // namespace experimental diff --git a/include/grpcpp/ext/server_metric_recorder.h b/include/grpcpp/ext/server_metric_recorder.h deleted file mode 100644 index 4397490f7e1..00000000000 --- a/include/grpcpp/ext/server_metric_recorder.h +++ /dev/null @@ -1,108 +0,0 @@ -// -// -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// - -#ifndef GRPCPP_EXT_SERVER_METRIC_RECORDER_H -#define GRPCPP_EXT_SERVER_METRIC_RECORDER_H - -#include -#include -#include - -#include -#include - -namespace grpc_core { -struct BackendMetricData; -} // namespace grpc_core - -namespace grpc { -class BackendMetricState; - -namespace experimental { -/// Records server wide metrics to be reported to the client. -/// Server implementation creates an instance and reports server metrics to it, -/// and then passes it to -/// ServerBuilder::experimental_type::EnableCallMetricRecording or -/// experimental::OrcaService that read metrics to include in the report. -class ServerMetricRecorder { - public: - // Factory method. Use this to create. - static std::unique_ptr Create(); - /// Records the server CPU utilization in the range [0, 1]. - /// Values outside of the valid range are rejected. - /// Overrides the stored value when called again with a valid value. - void SetCpuUtilization(double value); - /// Records the server memory utilization in the range [0, 1]. - /// Values outside of the valid range are rejected. - /// Overrides the stored value when called again with a valid value. - void SetMemoryUtilization(double value); - /// Records number of queries per second to the server in the range [0, infy). - /// Values outside of the valid range are rejected. - /// Overrides the stored value when called again with a valid value. - void SetQps(double value); - /// Records a named resource utilization value in the range [0, 1]. - /// Values outside of the valid range are rejected. - /// Overrides the stored value when called again with the same name. - /// The name string should remain valid while this utilization remains - /// in this recorder. It is assumed that strings are common names that are - /// global constants. - void SetNamedUtilization(string_ref name, double value); - /// Replaces all named resource utilization values. No range validation. - /// The name strings should remain valid while utilization values remain - /// in this recorder. It is assumed that strings are common names that are - /// global constants. - void SetAllNamedUtilization(std::map named_utilization); - - /// Clears the server CPU utilization if recorded. - void ClearCpuUtilization(); - /// Clears the server memory utilization if recorded. - void ClearMemoryUtilization(); - /// Clears number of queries per second to the server if recorded. - void ClearQps(); - /// Clears a named utilization value if exists. - void ClearNamedUtilization(string_ref name); - - private: - // To access GetMetrics(). - friend class grpc::BackendMetricState; - friend class OrcaService; - - struct BackendMetricDataState; - - // No direct creation, use the factory method Create() above. - ServerMetricRecorder(); - - // Updates the metric state by applying `updater` to the data and incrementing - // the sequence number. - void UpdateBackendMetricDataState( - std::function updater); - - grpc_core::BackendMetricData GetMetrics() const; - // Returned metric data is guaranteed to be identical between two calls if the - // sequence numbers match. - std::shared_ptr GetMetricsIfChanged() const; - - mutable grpc::internal::Mutex mu_; - std::shared_ptr metric_state_ - ABSL_GUARDED_BY(mu_); -}; - -} // namespace experimental -} // namespace grpc - -#endif // GRPCPP_EXT_SERVER_METRIC_RECORDER_H diff --git a/include/grpcpp/server.h b/include/grpcpp/server.h index 63ae1c69d61..120f03c3cbd 100644 --- a/include/grpcpp/server.h +++ b/include/grpcpp/server.h @@ -183,8 +183,7 @@ class Server : public ServerInterface, private internal::GrpcLibrary { std::vector< std::unique_ptr> interceptor_creators = std::vector>(), - experimental::ServerMetricRecorder* server_metric_recorder = nullptr); + experimental::ServerInterceptorFactoryInterface>>()); /// Start the server. /// @@ -256,14 +255,6 @@ class Server : public ServerInterface, private internal::GrpcLibrary { return max_receive_message_size_; } - bool call_metric_recording_enabled() const override { - return call_metric_recording_enabled_; - } - - experimental::ServerMetricRecorder* server_metric_recorder() const override { - return server_metric_recorder_; - } - CompletionQueue* CallbackCQ() ABSL_LOCKS_EXCLUDED(mu_) override; ServerInitializer* initializer(); @@ -347,12 +338,6 @@ class Server : public ServerInterface, private internal::GrpcLibrary { // Shutdown. Even though this is only used with NDEBUG, instantiate it in all // cases since otherwise the size will be inconsistent. std::vector cq_list_; - - // Whetner per-call load reporting is enabled. - bool call_metric_recording_enabled_ = false; - - // Interface to read or update server-wide metrics. Optional. - experimental::ServerMetricRecorder* server_metric_recorder_ = nullptr; }; } // namespace grpc diff --git a/include/grpcpp/server_builder.h b/include/grpcpp/server_builder.h index 9f5e2cc7dc2..9e08c873e8a 100644 --- a/include/grpcpp/server_builder.h +++ b/include/grpcpp/server_builder.h @@ -59,6 +59,7 @@ class ExternalConnectionAcceptorImpl; class CallbackGenericService; namespace experimental { +class OrcaServerInterceptorFactory; // EXPERIMENTAL API: // Interface for a grpc server to build transports with connections created out // of band. @@ -282,16 +283,6 @@ class ServerBuilder { std::shared_ptr provider); - /// Enables per-call load reporting. The server will automatically send the - /// load metrics after each RPC. The caller can report load metrics for the - /// current call to what ServerContext::ExperimentalGetCallMetricRecorder() - /// returns. The server merges metrics from the optional - /// server_metric_recorder when provided where the call metric recorder take - /// a higher precedence. The caller owns and must ensure the server metric - /// recorder outlives the server. - void EnableCallMetricRecording( - experimental::ServerMetricRecorder* server_metric_recorder = nullptr); - private: ServerBuilder* builder_; }; @@ -364,6 +355,7 @@ class ServerBuilder { private: friend class grpc::testing::ServerBuilderPluginTest; + friend class grpc::experimental::OrcaServerInterceptorFactory; struct SyncServerSettings { SyncServerSettings() @@ -414,12 +406,14 @@ class ServerBuilder { std::vector< std::unique_ptr> interceptor_creators_; + std::vector< + std::unique_ptr> + internal_interceptor_creators_; std::vector> acceptors_; grpc_server_config_fetcher* server_config_fetcher_ = nullptr; std::shared_ptr authorization_provider_; - experimental::ServerMetricRecorder* server_metric_recorder_ = nullptr; }; } // namespace grpc diff --git a/include/grpcpp/server_context.h b/include/grpcpp/server_context.h index abb6739ec8e..b745c9091cc 100644 --- a/include/grpcpp/server_context.h +++ b/include/grpcpp/server_context.h @@ -116,8 +116,8 @@ class DefaultReactorTestPeer; } // namespace testing namespace experimental { +class OrcaServerInterceptor; class CallMetricRecorder; -class ServerMetricRecorder; } // namespace experimental /// Base class of ServerContext. @@ -404,6 +404,7 @@ class ServerContextBase { friend class grpc::ClientContext; friend class grpc::GenericServerContext; friend class grpc::GenericCallbackServerContext; + friend class grpc::experimental::OrcaServerInterceptor; /// Prevent copying. ServerContextBase(const ServerContextBase&); @@ -417,13 +418,7 @@ class ServerContextBase { /// Return the tag queued by BeginCompletionOp() grpc::internal::CompletionQueueTag* GetCompletionOpTag(); - void set_call(grpc_call* call, bool call_metric_recording_enabled, - experimental::ServerMetricRecorder* server_metric_recorder) { - call_.call = call; - if (call_metric_recording_enabled) { - CreateCallMetricRecorder(server_metric_recorder); - } - } + void set_call(grpc_call* call) { call_.call = call; } void BindDeadlineAndMetadata(gpr_timespec deadline, grpc_metadata_array* arr); @@ -450,10 +445,7 @@ class ServerContextBase { } } - // This should be called only once and only when call metric recording is - // enabled. - void CreateCallMetricRecorder( - experimental::ServerMetricRecorder* server_metric_recorder = nullptr); + void CreateCallMetricRecorder(); struct CallWrapper { ~CallWrapper(); diff --git a/include/grpcpp/server_interface.h b/include/grpcpp/server_interface.h index 60ce4b3562a..23ccb3afd60 100644 --- a/include/grpcpp/server_interface.h +++ b/include/grpcpp/server_interface.h @@ -54,7 +54,6 @@ class CallbackGenericService; namespace experimental { class ServerInterceptorFactoryInterface; -class ServerMetricRecorder; } // namespace experimental class ServerInterface : public internal::CallHook { @@ -186,8 +185,6 @@ class ServerInterface : public internal::CallHook { internal::Call call_wrapper_; internal::InterceptorBatchMethodsImpl interceptor_methods_; bool done_intercepting_; - bool call_metric_recording_enabled_; - experimental::ServerMetricRecorder* server_metric_recorder_; }; /// RegisteredAsyncRequest is not part of the C++ API @@ -353,13 +350,6 @@ class ServerInterface : public internal::CallHook { return nullptr; } - // Whether per-call load reporting is enabled. - virtual bool call_metric_recording_enabled() const = 0; - - // Interface to read or update server-wide metrics. Returns null when not set. - virtual experimental::ServerMetricRecorder* server_metric_recorder() - const = 0; - // A method to get the callbackable completion queue associated with this // server. If the return value is nullptr, this server doesn't support // callback operations. diff --git a/package.xml b/package.xml index a6385b21344..1b8a5cb408d 100644 --- a/package.xml +++ b/package.xml @@ -97,9 +97,6 @@ - - - diff --git a/src/core/BUILD b/src/core/BUILD index 1ed3421c4c4..2d259e334fe 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -3714,14 +3714,6 @@ grpc_cc_library( deps = ["//:gpr_platform"], ) -grpc_cc_library( - name = "grpc_backend_metric_provider", - hdrs = [ - "ext/filters/backend_metrics/backend_metric_provider.h", - ], - language = "c++", -) - grpc_cc_library( name = "grpc_lb_policy_rls", srcs = [ @@ -4752,41 +4744,6 @@ grpc_cc_library( alwayslink = 1, ) -grpc_cc_library( - name = "grpc_backend_metric_filter", - srcs = [ - "ext/filters/backend_metrics/backend_metric_filter.cc", - ], - hdrs = [ - "ext/filters/backend_metrics/backend_metric_filter.h", - ], - external_deps = [ - "absl/status:statusor", - "absl/strings", - "absl/types:optional", - "upb_lib", - ], - language = "c++", - deps = [ - "arena_promise", - "channel_args", - "channel_fwd", - "channel_stack_type", - "context", - "grpc_backend_metric_data", - "grpc_backend_metric_provider", - "map", - "slice", - "//:channel_stack_builder", - "//:config", - "//:gpr", - "//:gpr_platform", - "//:grpc_base", - "//:grpc_trace", - "//:xds_orca_upb", - ], -) - grpc_cc_library( name = "polling_resolver", srcs = [ diff --git a/src/core/ext/filters/backend_metrics/backend_metric_filter.cc b/src/core/ext/filters/backend_metrics/backend_metric_filter.cc deleted file mode 100644 index c66de1beab9..00000000000 --- a/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include - -#include "src/core/ext/filters/backend_metrics/backend_metric_filter.h" - -#include -#include -#include - -#include -#include -#include -#include - -#include "absl/strings/string_view.h" -#include "upb/upb.h" -#include "upb/upb.hpp" -#include "xds/data/orca/v3/orca_load_report.upb.h" - -#include -#include - -#include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h" -#include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/channel/channel_stack_builder.h" -#include "src/core/lib/channel/context.h" -#include "src/core/lib/config/core_configuration.h" -#include "src/core/lib/debug/trace.h" -#include "src/core/lib/promise/context.h" -#include "src/core/lib/promise/map.h" -#include "src/core/lib/slice/slice.h" -#include "src/core/lib/surface/channel_stack_type.h" -#include "src/core/lib/transport/metadata_batch.h" - -namespace grpc_core { - -TraceFlag grpc_backend_metric_filter_trace(false, "backend_metric_filter"); - -absl::optional BackendMetricFilter::MaybeSerializeBackendMetrics( - BackendMetricProvider* provider) const { - if (provider == nullptr) return absl::nullopt; - BackendMetricData data = provider->GetBackendMetricData(); - upb::Arena arena; - xds_data_orca_v3_OrcaLoadReport* response = - xds_data_orca_v3_OrcaLoadReport_new(arena.ptr()); - bool has_data = false; - if (data.cpu_utilization != -1) { - xds_data_orca_v3_OrcaLoadReport_set_cpu_utilization(response, - data.cpu_utilization); - has_data = true; - } - if (data.mem_utilization != -1) { - xds_data_orca_v3_OrcaLoadReport_set_mem_utilization(response, - data.mem_utilization); - has_data = true; - } - if (data.qps != -1) { - xds_data_orca_v3_OrcaLoadReport_set_rps_fractional(response, data.qps); - has_data = true; - } - for (const auto& p : data.request_cost) { - xds_data_orca_v3_OrcaLoadReport_request_cost_set( - response, - upb_StringView_FromDataAndSize(p.first.data(), p.first.size()), - p.second, arena.ptr()); - has_data = true; - } - for (const auto& p : data.utilization) { - xds_data_orca_v3_OrcaLoadReport_utilization_set( - response, - upb_StringView_FromDataAndSize(p.first.data(), p.first.size()), - p.second, arena.ptr()); - has_data = true; - } - if (!has_data) { - return absl::nullopt; - } - size_t len; - char* buf = - xds_data_orca_v3_OrcaLoadReport_serialize(response, arena.ptr(), &len); - return std::string(buf, len); -} - -const grpc_channel_filter BackendMetricFilter::kFilter = - MakePromiseBasedFilter( - "backend_metric"); - -absl::StatusOr BackendMetricFilter::Create( - const ChannelArgs&, ChannelFilter::Args) { - return BackendMetricFilter(); -} - -ArenaPromise BackendMetricFilter::MakeCallPromise( - CallArgs call_args, NextPromiseFactory next_promise_factory) { - return ArenaPromise(Map( - next_promise_factory(std::move(call_args)), - [this](ServerMetadataHandle trailing_metadata) { - auto* ctx = &GetContext< - grpc_call_context_element>()[GRPC_CONTEXT_BACKEND_METRIC_PROVIDER]; - if (ctx == nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) { - gpr_log(GPR_INFO, "[%p] No BackendMetricProvider.", this); - } - return trailing_metadata; - } - absl::optional serialized = MaybeSerializeBackendMetrics( - reinterpret_cast(ctx->value)); - if (serialized.has_value() && !serialized->empty()) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) { - gpr_log(GPR_INFO, - "[%p] Backend metrics serialized. size: %" PRIuPTR, this, - serialized->size()); - } - trailing_metadata->Set( - EndpointLoadMetricsBinMetadata(), - Slice::FromCopiedString(std::move(*serialized))); - } else if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_filter_trace)) { - gpr_log(GPR_INFO, "[%p] No backend metrics.", this); - } - return trailing_metadata; - })); -} - -void RegisterBackendMetricFilter(CoreConfiguration::Builder* builder) { - builder->channel_init()->RegisterStage( - GRPC_SERVER_CHANNEL, INT_MAX, [](ChannelStackBuilder* builder) { - if (builder->channel_args().Contains( - GRPC_ARG_SERVER_CALL_METRIC_RECORDING)) { - builder->PrependFilter(&BackendMetricFilter::kFilter); - } - return true; - }); -} - -} // namespace grpc_core diff --git a/src/core/ext/filters/backend_metrics/backend_metric_filter.h b/src/core/ext/filters/backend_metrics/backend_metric_filter.h deleted file mode 100644 index 403028b023a..00000000000 --- a/src/core/ext/filters/backend_metrics/backend_metric_filter.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_FILTER_H -#define GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_FILTER_H - -#include - -#include - -#include "absl/status/statusor.h" -#include "absl/types/optional.h" - -#include "src/core/ext/filters/backend_metrics/backend_metric_provider.h" -#include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/channel/channel_fwd.h" -#include "src/core/lib/channel/promise_based_filter.h" -#include "src/core/lib/promise/arena_promise.h" -#include "src/core/lib/transport/transport.h" - -namespace grpc_core { - -class BackendMetricFilter : public ChannelFilter { - public: - static const grpc_channel_filter kFilter; - - static absl::StatusOr Create(const ChannelArgs& args, - ChannelFilter::Args); - - // Construct a promise for one call. - ArenaPromise MakeCallPromise( - CallArgs call_args, NextPromiseFactory next_promise_factory) override; - - private: - absl::optional MaybeSerializeBackendMetrics( - BackendMetricProvider* provider) const; -}; - -} // namespace grpc_core - -#endif // GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_FILTER_H diff --git a/src/core/ext/filters/backend_metrics/backend_metric_provider.h b/src/core/ext/filters/backend_metrics/backend_metric_provider.h deleted file mode 100644 index 42ecc909529..00000000000 --- a/src/core/ext/filters/backend_metrics/backend_metric_provider.h +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_PROVIDER_H -#define GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_PROVIDER_H - -namespace grpc_core { - -struct BackendMetricData; -class BackendMetricProvider { - public: - virtual ~BackendMetricProvider() = default; - virtual BackendMetricData GetBackendMetricData() = 0; -}; - -} // namespace grpc_core - -#endif // GRPC_SRC_CORE_EXT_FILTERS_BACKEND_METRICS_BACKEND_METRIC_PROVIDER_H diff --git a/src/core/lib/channel/context.h b/src/core/lib/channel/context.h index ea67e4d7654..7e568786b45 100644 --- a/src/core/lib/channel/context.h +++ b/src/core/lib/channel/context.h @@ -45,10 +45,6 @@ typedef enum { /// Holds a pointer to ServiceConfigCallData associated with this call. GRPC_CONTEXT_SERVICE_CONFIG_CALL_DATA, - /// Holds a pointer to BackendMetricProvider associated with this call on - /// the server. - GRPC_CONTEXT_BACKEND_METRIC_PROVIDER, - GRPC_CONTEXT_COUNT } grpc_context_index; diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index c120471fbec..84aa9c09372 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -50,7 +50,6 @@ extern void RegisterServiceConfigChannelArgFilter( extern void RegisterExtraFilters(CoreConfiguration::Builder* builder); extern void RegisterResourceQuota(CoreConfiguration::Builder* builder); extern void FaultInjectionFilterRegister(CoreConfiguration::Builder* builder); -extern void RegisterBackendMetricFilter(CoreConfiguration::Builder* builder); extern void RegisterNativeDnsResolver(CoreConfiguration::Builder* builder); extern void RegisterAresDnsResolver(CoreConfiguration::Builder* builder); extern void RegisterSockaddrResolver(CoreConfiguration::Builder* builder); @@ -111,7 +110,6 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) { #endif // !GRPC_NO_RLS // Run last so it gets a consistent location. // TODO(ctiller): Is this actually necessary? - RegisterBackendMetricFilter(builder); RegisterSecurityFilters(builder); RegisterExtraFilters(builder); RegisterBuiltins(builder); diff --git a/src/cpp/server/backend_metric_recorder.cc b/src/cpp/server/backend_metric_recorder.cc deleted file mode 100644 index cbe6945f819..00000000000 --- a/src/cpp/server/backend_metric_recorder.cc +++ /dev/null @@ -1,311 +0,0 @@ -// -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#include "src/cpp/server/backend_metric_recorder.h" - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h" -#include "src/core/lib/debug/trace.h" - -using grpc_core::BackendMetricData; - -namespace { -// All utilization values must be in [0, 1]. -bool IsUtilizationValid(double utilization) { - return utilization >= 0.0 && utilization <= 1.0; -} - -// QPS must be in [0, infy). -bool IsQpsValid(double qps) { return qps >= 0.0; } - -grpc_core::TraceFlag grpc_backend_metric_trace(false, "backend_metric"); -} // namespace - -namespace grpc { -namespace experimental { - -std::unique_ptr ServerMetricRecorder::Create() { - return std::unique_ptr(new ServerMetricRecorder()); -} - -ServerMetricRecorder::ServerMetricRecorder() - : metric_state_(std::make_shared()) {} - -void ServerMetricRecorder::UpdateBackendMetricDataState( - std::function updater) { - internal::MutexLock lock(&mu_); - auto new_state = std::make_shared(*metric_state_); - updater(&new_state->data); - ++new_state->sequence_number; - metric_state_ = std::move(new_state); -} - -void ServerMetricRecorder::SetCpuUtilization(double value) { - if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] CPU utilization rejected: %f", this, value); - } - return; - } - UpdateBackendMetricDataState( - [value](BackendMetricData* data) { data->cpu_utilization = value; }); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] CPU utilization set: %f", this, value); - } -} - -void ServerMetricRecorder::SetMemoryUtilization(double value) { - if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Mem utilization rejected: %f", this, value); - } - return; - } - UpdateBackendMetricDataState( - [value](BackendMetricData* data) { data->mem_utilization = value; }); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Mem utilization set: %f", this, value); - } -} - -void ServerMetricRecorder::SetQps(double value) { - if (!IsQpsValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] QPS rejected: %f", this, value); - } - return; - } - UpdateBackendMetricDataState( - [value](BackendMetricData* data) { data->qps = value; }); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] QPS set: %f", this, value); - } -} - -void ServerMetricRecorder::SetNamedUtilization(string_ref name, double value) { - if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Named utilization rejected: %f name: %s", this, - value, std::string(name.data(), name.size()).c_str()); - } - return; - } - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Named utilization set: %f name: %s", this, value, - std::string(name.data(), name.size()).c_str()); - } - UpdateBackendMetricDataState([name, value](BackendMetricData* data) { - data->utilization[absl::string_view(name.data(), name.size())] = value; - }); -} - -void ServerMetricRecorder::SetAllNamedUtilization( - std::map named_utilization) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] All named utilization updated. size: %" PRIuPTR, - this, named_utilization.size()); - } - UpdateBackendMetricDataState( - [utilization = std::move(named_utilization)](BackendMetricData* data) { - data->utilization.clear(); - for (const auto& u : utilization) { - data->utilization[absl::string_view(u.first.data(), u.first.size())] = - u.second; - } - }); -} - -void ServerMetricRecorder::ClearCpuUtilization() { - UpdateBackendMetricDataState( - [](BackendMetricData* data) { data->cpu_utilization = -1; }); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] CPU utilization cleared.", this); - } -} - -void ServerMetricRecorder::ClearMemoryUtilization() { - UpdateBackendMetricDataState( - [](BackendMetricData* data) { data->mem_utilization = -1; }); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Mem utilization cleared.", this); - } -} - -void ServerMetricRecorder::ClearQps() { - UpdateBackendMetricDataState([](BackendMetricData* data) { data->qps = -1; }); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] QPS utilization cleared.", this); - } -} - -void ServerMetricRecorder::ClearNamedUtilization(string_ref name) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Named utilization cleared. name: %s", this, - std::string(name.data(), name.size()).c_str()); - } - UpdateBackendMetricDataState([name](BackendMetricData* data) { - data->utilization.erase(absl::string_view(name.data(), name.size())); - }); -} - -grpc_core::BackendMetricData ServerMetricRecorder::GetMetrics() const { - auto result = GetMetricsIfChanged(); - return result->data; -} - -std::shared_ptr -ServerMetricRecorder::GetMetricsIfChanged() const { - std::shared_ptr result; - { - internal::MutexLock lock(&mu_); - result = metric_state_; - } - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - const auto& data = result->data; - gpr_log(GPR_INFO, - "[%p] GetMetrics() returned: seq:%" PRIu64 - " cpu:%f mem:%f qps:%f utilization size: %" PRIuPTR, - this, result->sequence_number, data.cpu_utilization, - data.mem_utilization, data.qps, data.utilization.size()); - } - return result; -} - -} // namespace experimental - -experimental::CallMetricRecorder& -BackendMetricState::RecordCpuUtilizationMetric(double value) { - if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] CPU utilization value rejected: %f", this, value); - } - return *this; - } - cpu_utilization_.store(value, std::memory_order_relaxed); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] CPU utilization recorded: %f", this, value); - } - return *this; -} - -experimental::CallMetricRecorder& -BackendMetricState::RecordMemoryUtilizationMetric(double value) { - if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Mem utilization value rejected: %f", this, value); - } - return *this; - } - mem_utilization_.store(value, std::memory_order_relaxed); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Mem utilization recorded: %f", this, value); - } - return *this; -} - -experimental::CallMetricRecorder& BackendMetricState::RecordQpsMetric( - double value) { - if (!IsQpsValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] QPS value rejected: %f", this, value); - } - return *this; - } - qps_.store(value, std::memory_order_relaxed); - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] QPS recorded: %f", this, value); - } - return *this; -} - -experimental::CallMetricRecorder& BackendMetricState::RecordUtilizationMetric( - string_ref name, double value) { - if (!IsUtilizationValid(value)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Utilization value rejected: %s %f", this, - std::string(name.data(), name.length()).c_str(), value); - } - return *this; - } - internal::MutexLock lock(&mu_); - absl::string_view name_sv(name.data(), name.length()); - utilization_[name_sv] = value; - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Utilization recorded: %s %f", this, - std::string(name_sv).c_str(), value); - } - return *this; -} - -experimental::CallMetricRecorder& BackendMetricState::RecordRequestCostMetric( - string_ref name, double value) { - internal::MutexLock lock(&mu_); - absl::string_view name_sv(name.data(), name.length()); - request_cost_[name_sv] = value; - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, "[%p] Request cost recorded: %s %f", this, - std::string(name_sv).c_str(), value); - } - return *this; -} - -BackendMetricData BackendMetricState::GetBackendMetricData() { - // Merge metrics from the ServerMetricRecorder first since metrics recorded - // to CallMetricRecorder takes a higher precedence. - BackendMetricData data; - if (server_metric_recorder_ != nullptr) { - data = server_metric_recorder_->GetMetrics(); - } - // Only overwrite if the value is set i.e. in the valid range. - const double cpu = cpu_utilization_.load(std::memory_order_relaxed); - if (IsUtilizationValid(cpu)) { - data.cpu_utilization = cpu; - } - const double mem = mem_utilization_.load(std::memory_order_relaxed); - if (IsUtilizationValid(mem)) { - data.mem_utilization = mem; - } - const double qps = qps_.load(std::memory_order_relaxed); - if (IsQpsValid(qps)) { - data.qps = qps; - } - { - internal::MutexLock lock(&mu_); - data.utilization = std::move(utilization_); - data.request_cost = std::move(request_cost_); - } - if (GRPC_TRACE_FLAG_ENABLED(grpc_backend_metric_trace)) { - gpr_log(GPR_INFO, - "[%p] Backend metric data returned: cpu:%f mem:%f qps:%f " - "utilization size:%" PRIuPTR " request_cost size:%" PRIuPTR, - this, data.cpu_utilization, data.mem_utilization, data.qps, - data.utilization.size(), data.request_cost.size()); - } - return data; -} - -} // namespace grpc diff --git a/src/cpp/server/backend_metric_recorder.h b/src/cpp/server/backend_metric_recorder.h deleted file mode 100644 index 32eed169741..00000000000 --- a/src/cpp/server/backend_metric_recorder.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// -// Copyright 2023 gRPC authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// - -#ifndef GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H -#define GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H - -#include - -#include -#include - -#include "absl/base/thread_annotations.h" -#include "absl/strings/string_view.h" - -#include -#include -#include -#include - -#include "src/core/ext/filters/backend_metrics/backend_metric_provider.h" -#include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h" - -namespace grpc { -namespace experimental { - -// Backend metrics and an associated update sequence number. -struct ServerMetricRecorder::BackendMetricDataState { - grpc_core::BackendMetricData data; - uint64_t sequence_number = 0; -}; - -} // namespace experimental - -class BackendMetricState : public grpc_core::BackendMetricProvider, - public experimental::CallMetricRecorder { - public: - // `server_metric_recorder` is optional. When set, GetBackendMetricData() - // merges metrics from `server_metric_recorder` with metrics recorded to this. - explicit BackendMetricState( - experimental::ServerMetricRecorder* server_metric_recorder) - : server_metric_recorder_(server_metric_recorder) {} - experimental::CallMetricRecorder& RecordCpuUtilizationMetric( - double value) override; - experimental::CallMetricRecorder& RecordMemoryUtilizationMetric( - double value) override; - experimental::CallMetricRecorder& RecordQpsMetric(double value) override; - experimental::CallMetricRecorder& RecordUtilizationMetric( - string_ref name, double value) override; - experimental::CallMetricRecorder& RecordRequestCostMetric( - string_ref name, double value) override; - // This clears metrics currently recorded. Don't call twice. - grpc_core::BackendMetricData GetBackendMetricData() override; - - private: - experimental::ServerMetricRecorder* server_metric_recorder_; - std::atomic cpu_utilization_{-1.0}; - std::atomic mem_utilization_{-1.0}; - std::atomic qps_{-1.0}; - internal::Mutex mu_; - std::map utilization_ ABSL_GUARDED_BY(mu_); - std::map request_cost_ ABSL_GUARDED_BY(mu_); -}; - -} // namespace grpc - -#endif // GRPC_SRC_CPP_SERVER_BACKEND_METRIC_RECORDER_H diff --git a/src/cpp/server/orca/call_metric_recorder.cc b/src/cpp/server/orca/call_metric_recorder.cc new file mode 100644 index 00000000000..d4548ab3dcc --- /dev/null +++ b/src/cpp/server/orca/call_metric_recorder.cc @@ -0,0 +1,125 @@ +// +// Copyright 2022 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include +#include +#include + +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" +#include "upb/upb.h" +#include "upb/upb.hpp" +#include "xds/data/orca/v3/orca_load_report.upb.h" + +#include +#include +#include + +#include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h" +#include "src/core/lib/resource_quota/arena.h" + +namespace grpc { +namespace experimental { + +CallMetricRecorder::CallMetricRecorder(grpc_core::Arena* arena) + : backend_metric_data_(arena->New()) {} + +CallMetricRecorder::~CallMetricRecorder() { + backend_metric_data_->~BackendMetricData(); +} + +CallMetricRecorder& CallMetricRecorder::RecordCpuUtilizationMetric( + double value) { + internal::MutexLock lock(&mu_); + backend_metric_data_->cpu_utilization = value; + return *this; +} + +CallMetricRecorder& CallMetricRecorder::RecordMemoryUtilizationMetric( + double value) { + internal::MutexLock lock(&mu_); + backend_metric_data_->mem_utilization = value; + return *this; +} + +CallMetricRecorder& CallMetricRecorder::RecordQpsMetric(double value) { + internal::MutexLock lock(&mu_); + backend_metric_data_->qps = value; + return *this; +} + +CallMetricRecorder& CallMetricRecorder::RecordUtilizationMetric( + grpc::string_ref name, double value) { + internal::MutexLock lock(&mu_); + absl::string_view name_sv(name.data(), name.length()); + backend_metric_data_->utilization[name_sv] = value; + return *this; +} + +CallMetricRecorder& CallMetricRecorder::RecordRequestCostMetric( + grpc::string_ref name, double value) { + internal::MutexLock lock(&mu_); + absl::string_view name_sv(name.data(), name.length()); + backend_metric_data_->request_cost[name_sv] = value; + return *this; +} + +absl::optional CallMetricRecorder::CreateSerializedReport() { + upb::Arena arena; + internal::MutexLock lock(&mu_); + bool has_data = backend_metric_data_->cpu_utilization != -1 || + backend_metric_data_->mem_utilization != -1 || + !backend_metric_data_->utilization.empty() || + !backend_metric_data_->request_cost.empty(); + if (!has_data) { + return absl::nullopt; + } + xds_data_orca_v3_OrcaLoadReport* response = + xds_data_orca_v3_OrcaLoadReport_new(arena.ptr()); + if (backend_metric_data_->cpu_utilization != -1) { + xds_data_orca_v3_OrcaLoadReport_set_cpu_utilization( + response, backend_metric_data_->cpu_utilization); + } + if (backend_metric_data_->mem_utilization != -1) { + xds_data_orca_v3_OrcaLoadReport_set_mem_utilization( + response, backend_metric_data_->mem_utilization); + } + if (backend_metric_data_->qps != -1) { + xds_data_orca_v3_OrcaLoadReport_set_rps_fractional( + response, backend_metric_data_->qps); + } + for (const auto& p : backend_metric_data_->request_cost) { + xds_data_orca_v3_OrcaLoadReport_request_cost_set( + response, + upb_StringView_FromDataAndSize(p.first.data(), p.first.size()), + p.second, arena.ptr()); + } + for (const auto& p : backend_metric_data_->utilization) { + xds_data_orca_v3_OrcaLoadReport_utilization_set( + response, + upb_StringView_FromDataAndSize(p.first.data(), p.first.size()), + p.second, arena.ptr()); + } + size_t buf_length; + char* buf = xds_data_orca_v3_OrcaLoadReport_serialize(response, arena.ptr(), + &buf_length); + return std::string(buf, buf_length); +} + +} // namespace experimental +} // namespace grpc diff --git a/src/cpp/server/orca/orca_interceptor.cc b/src/cpp/server/orca/orca_interceptor.cc new file mode 100644 index 00000000000..c377c037b3c --- /dev/null +++ b/src/cpp/server/orca/orca_interceptor.cc @@ -0,0 +1,76 @@ +// +// Copyright 2022 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "src/cpp/server/orca/orca_interceptor.h" + +#include +#include +#include +#include +#include +#include + +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" + +#include +#include +#include + +#include "src/core/lib/transport/metadata_batch.h" + +namespace grpc { +namespace experimental { + +void OrcaServerInterceptor::Intercept(InterceptorBatchMethods* methods) { + if (methods->QueryInterceptionHookPoint( + InterceptionHookPoints::POST_RECV_INITIAL_METADATA)) { + auto context = info_->server_context(); + context->CreateCallMetricRecorder(); + } else if (methods->QueryInterceptionHookPoint( + InterceptionHookPoints::PRE_SEND_STATUS)) { + auto trailers = methods->GetSendTrailingMetadata(); + if (trailers != nullptr) { + auto context = info_->server_context(); + auto* recorder = context->call_metric_recorder_; + auto serialized = recorder->CreateSerializedReport(); + if (serialized.has_value() && !serialized->empty()) { + std::string key = + std::string(grpc_core::EndpointLoadMetricsBinMetadata::key()); + trailers->emplace( + std::make_pair(std::move(key), std::move(serialized.value()))); + } + } + } + methods->Proceed(); +} + +Interceptor* OrcaServerInterceptorFactory::CreateServerInterceptor( + ServerRpcInfo* info) { + return new OrcaServerInterceptor(info); +} + +void OrcaServerInterceptorFactory::Register(grpc::ServerBuilder* builder) { + builder->internal_interceptor_creators_.push_back( + std::make_unique()); +} + +void EnableCallMetricRecording(grpc::ServerBuilder* builder) { + OrcaServerInterceptorFactory::Register(builder); +} + +} // namespace experimental +} // namespace grpc diff --git a/src/cpp/server/orca/orca_interceptor.h b/src/cpp/server/orca/orca_interceptor.h new file mode 100644 index 00000000000..9a2e4e7df3c --- /dev/null +++ b/src/cpp/server/orca/orca_interceptor.h @@ -0,0 +1,49 @@ +// +// Copyright 2022 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef GRPC_SRC_CPP_SERVER_ORCA_ORCA_INTERCEPTOR_H +#define GRPC_SRC_CPP_SERVER_ORCA_ORCA_INTERCEPTOR_H + +#include +#include + +namespace grpc { + +class ServerBuilder; + +namespace experimental { +class ServerRpcInfo; + +class OrcaServerInterceptor : public Interceptor { + public: + explicit OrcaServerInterceptor(ServerRpcInfo* info) : info_(info) {} + + void Intercept(InterceptorBatchMethods* methods) override; + + private: + ServerRpcInfo* info_; +}; + +class OrcaServerInterceptorFactory : public ServerInterceptorFactoryInterface { + public: + static void Register(ServerBuilder* builder); + Interceptor* CreateServerInterceptor(ServerRpcInfo* info) override; +}; + +} // namespace experimental +} // namespace grpc + +#endif // GRPC_SRC_CPP_SERVER_ORCA_ORCA_INTERCEPTOR_H diff --git a/src/cpp/server/orca/orca_service.cc b/src/cpp/server/orca/orca_service.cc index 0419a496a48..ab99842a2ab 100644 --- a/src/cpp/server/orca/orca_service.cc +++ b/src/cpp/server/orca/orca_service.cc @@ -15,14 +15,13 @@ // #include -#include #include #include +#include #include #include "absl/base/thread_annotations.h" -#include "absl/strings/string_view.h" #include "absl/time/time.h" #include "absl/types/optional.h" #include "google/protobuf/duration.upb.h" @@ -34,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -45,14 +43,12 @@ #include #include -#include "src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h" #include "src/core/lib/event_engine/default_event_engine.h" #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/time.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/cpp/server/backend_metric_recorder.h" namespace grpc { namespace experimental { @@ -170,11 +166,8 @@ class OrcaService::Reactor : public ServerWriteReactor, // OrcaService // -OrcaService::OrcaService(ServerMetricRecorder* const server_metric_recorder, - Options options) - : server_metric_recorder_(server_metric_recorder), - min_report_duration_(options.min_report_duration) { - GPR_ASSERT(server_metric_recorder_ != nullptr); +OrcaService::OrcaService(OrcaService::Options options) + : min_report_duration_(options.min_report_duration) { AddMethod(new internal::RpcServiceMethod( "/xds.service.orca.v3.OpenRcaService/StreamCoreMetrics", internal::RpcMethod::SERVER_STREAMING, /*handler=*/nullptr)); @@ -185,38 +178,88 @@ OrcaService::OrcaService(ServerMetricRecorder* const server_metric_recorder, })); } +void OrcaService::SetCpuUtilization(double cpu_utilization) { + grpc::internal::MutexLock lock(&mu_); + cpu_utilization_ = cpu_utilization; + response_slice_.reset(); +} + +void OrcaService::DeleteCpuUtilization() { + grpc::internal::MutexLock lock(&mu_); + cpu_utilization_ = -1; + response_slice_.reset(); +} + +void OrcaService::SetMemoryUtilization(double memory_utilization) { + grpc::internal::MutexLock lock(&mu_); + memory_utilization_ = memory_utilization; + response_slice_.reset(); +} + +void OrcaService::DeleteMemoryUtilization() { + grpc::internal::MutexLock lock(&mu_); + memory_utilization_ = -1; + response_slice_.reset(); +} + +void OrcaService::SetQps(double qps) { + grpc::internal::MutexLock lock(&mu_); + qps_ = qps; + response_slice_.reset(); +} + +void OrcaService::DeleteQps() { + grpc::internal::MutexLock lock(&mu_); + qps_ = -1; + response_slice_.reset(); +} + +void OrcaService::SetNamedUtilization(std::string name, double utilization) { + grpc::internal::MutexLock lock(&mu_); + named_utilization_[std::move(name)] = utilization; + response_slice_.reset(); +} + +void OrcaService::DeleteNamedUtilization(const std::string& name) { + grpc::internal::MutexLock lock(&mu_); + named_utilization_.erase(name); + response_slice_.reset(); +} + +void OrcaService::SetAllNamedUtilization( + std::map named_utilization) { + grpc::internal::MutexLock lock(&mu_); + named_utilization_ = std::move(named_utilization); + response_slice_.reset(); +} + Slice OrcaService::GetOrCreateSerializedResponse() { grpc::internal::MutexLock lock(&mu_); - std::shared_ptr result = - server_metric_recorder_->GetMetricsIfChanged(); - if (!response_slice_seq_.has_value() || - *response_slice_seq_ != result->sequence_number) { - const auto& data = result->data; + if (!response_slice_.has_value()) { upb::Arena arena; xds_data_orca_v3_OrcaLoadReport* response = xds_data_orca_v3_OrcaLoadReport_new(arena.ptr()); - if (data.cpu_utilization != -1) { + if (cpu_utilization_ != -1) { xds_data_orca_v3_OrcaLoadReport_set_cpu_utilization(response, - data.cpu_utilization); + cpu_utilization_); } - if (data.mem_utilization != -1) { + if (memory_utilization_ != -1) { xds_data_orca_v3_OrcaLoadReport_set_mem_utilization(response, - data.mem_utilization); + memory_utilization_); } - if (data.qps != -1) { - xds_data_orca_v3_OrcaLoadReport_set_rps_fractional(response, data.qps); + if (qps_ != -1) { + xds_data_orca_v3_OrcaLoadReport_set_rps_fractional(response, qps_); } - for (const auto& u : data.utilization) { + for (const auto& p : named_utilization_) { xds_data_orca_v3_OrcaLoadReport_utilization_set( response, - upb_StringView_FromDataAndSize(u.first.data(), u.first.size()), - u.second, arena.ptr()); + upb_StringView_FromDataAndSize(p.first.data(), p.first.size()), + p.second, arena.ptr()); } size_t buf_length; char* buf = xds_data_orca_v3_OrcaLoadReport_serialize(response, arena.ptr(), &buf_length); response_slice_.emplace(buf, buf_length); - response_slice_seq_ = result->sequence_number; } return Slice(*response_slice_); } diff --git a/src/cpp/server/server_builder.cc b/src/cpp/server/server_builder.cc index efa813af2ba..d0c1bef4362 100644 --- a/src/cpp/server/server_builder.cc +++ b/src/cpp/server/server_builder.cc @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -157,13 +158,6 @@ void ServerBuilder::experimental_type::SetAuthorizationPolicyProvider( builder_->authorization_provider_ = std::move(provider); } -void ServerBuilder::experimental_type::EnableCallMetricRecording( - experimental::ServerMetricRecorder* server_metric_recorder) { - builder_->AddChannelArgument(GRPC_ARG_SERVER_CALL_METRIC_RECORDING, 1); - GPR_ASSERT(builder_->server_metric_recorder_ == nullptr); - builder_->server_metric_recorder_ = server_metric_recorder; -} - ServerBuilder& ServerBuilder::SetOption( std::unique_ptr option) { options_.push_back(std::move(option)); @@ -361,11 +355,18 @@ std::unique_ptr ServerBuilder::BuildAndStart() { gpr_log(GPR_INFO, "Callback server."); } + // Merge the application and internal interceptors together. + // Internal interceptors go first. + auto creators = std::move(internal_interceptor_creators_); + creators.insert(creators.end(), + std::make_move_iterator(interceptor_creators_.begin()), + std::make_move_iterator(interceptor_creators_.end())); + std::unique_ptr server(new grpc::Server( &args, sync_server_cqs, sync_server_settings_.min_pollers, sync_server_settings_.max_pollers, sync_server_settings_.cq_timeout_msec, std::move(acceptors_), server_config_fetcher_, resource_quota_, - std::move(interceptor_creators_), server_metric_recorder_)); + std::move(creators))); ServerInitializer* initializer = server->initializer(); diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc index 2fa1b9547a4..bc64cf319a6 100644 --- a/src/cpp/server/server_cc.cc +++ b/src/cpp/server/server_cc.cc @@ -155,8 +155,6 @@ ServerInterface::BaseAsyncRequest::BaseAsyncRequest( interceptor_methods_.SetCall(&call_wrapper_); interceptor_methods_.SetReverse(); call_cq_->RegisterAvalanching(); // This op will trigger more ops - call_metric_recording_enabled_ = server_->call_metric_recording_enabled(); - server_metric_recorder_ = server_->server_metric_recorder(); } ServerInterface::BaseAsyncRequest::~BaseAsyncRequest() { @@ -172,8 +170,7 @@ bool ServerInterface::BaseAsyncRequest::FinalizeResult(void** tag, } return true; } - context_->set_call(call_, call_metric_recording_enabled_, - server_metric_recorder_); + context_->set_call(call_); context_->cq_ = call_cq_; if (call_wrapper_.call() == nullptr) { // Fill it since it is empty. @@ -411,8 +408,7 @@ class Server::SyncRequest final : public grpc::internal::CompletionQueueTag { call_, server_, &cq_, server_->max_receive_message_size(), ctx_->ctx.set_server_rpc_info(method_->name(), method_->method_type(), server_->interceptor_creators_)); - ctx_->ctx.set_call(call_, server_->call_metric_recording_enabled(), - server_->server_metric_recorder()); + ctx_->ctx.set_call(call_); ctx_->ctx.cq_ = &cq_; request_metadata_.count = 0; @@ -640,9 +636,7 @@ class Server::CallbackRequest final } // Bind the call, deadline, and metadata from what we got - req_->ctx_->set_call(req_->call_, - req_->server_->call_metric_recording_enabled(), - req_->server_->server_metric_recorder()); + req_->ctx_->set_call(req_->call_); req_->ctx_->cq_ = req_->cq_; req_->ctx_->BindDeadlineAndMetadata(req_->deadline_, &req_->request_metadata_); @@ -884,8 +878,7 @@ Server::Server( grpc_resource_quota* server_rq, std::vector< std::unique_ptr> - interceptor_creators, - experimental::ServerMetricRecorder* server_metric_recorder) + interceptor_creators) : acceptors_(std::move(acceptors)), interceptor_creators_(std::move(interceptor_creators)), max_receive_message_size_(INT_MIN), @@ -895,8 +888,7 @@ Server::Server( shutdown_notified_(false), server_(nullptr), server_initializer_(new ServerInitializer(this)), - health_check_service_disabled_(false), - server_metric_recorder_(server_metric_recorder) { + health_check_service_disabled_(false) { gpr_once_init(&grpc::g_once_init_callbacks, grpc::InitGlobalCallbacks); global_callbacks_ = grpc::g_callbacks; global_callbacks_->UpdateArguments(args); @@ -943,10 +935,6 @@ Server::Server( strcmp(channel_args.args[i].key, GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH)) { max_receive_message_size_ = channel_args.args[i].value.integer; } - if (0 == strcmp(channel_args.args[i].key, - GRPC_ARG_SERVER_CALL_METRIC_RECORDING)) { - call_metric_recording_enabled_ = channel_args.args[i].value.integer; - } } server_ = grpc_server_create(&channel_args, nullptr); grpc_server_set_config_fetcher(server_, server_config_fetcher); diff --git a/src/cpp/server/server_context.cc b/src/cpp/server/server_context.cc index 2b6aa4bb5df..31cf15b2e88 100644 --- a/src/cpp/server/server_context.cc +++ b/src/cpp/server/server_context.cc @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -55,13 +54,11 @@ #include #include -#include "src/core/lib/channel/context.h" #include "src/core/lib/gprpp/crash.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/resource_quota/arena.h" #include "src/core/lib/surface/call.h" -#include "src/cpp/server/backend_metric_recorder.h" namespace grpc { @@ -401,15 +398,10 @@ void ServerContextBase::SetLoadReportingCosts( } } -void ServerContextBase::CreateCallMetricRecorder( - experimental::ServerMetricRecorder* server_metric_recorder) { +void ServerContextBase::CreateCallMetricRecorder() { GPR_ASSERT(call_metric_recorder_ == nullptr); grpc_core::Arena* arena = grpc_call_get_arena(call_.call); - auto* backend_metric_state = - arena->New(server_metric_recorder); - call_metric_recorder_ = backend_metric_state; - grpc_call_context_set(call_.call, GRPC_CONTEXT_BACKEND_METRIC_PROVIDER, - backend_metric_state, nullptr); + call_metric_recorder_ = arena->New(arena); } grpc::string_ref ServerContextBase::ExperimentalGetAuthority() const { diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 6f474ac2029..b451ce1cfa5 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -15,7 +15,6 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_core_dependencies.py.template`!!! CORE_SOURCE_FILES = [ - 'src/core/ext/filters/backend_metrics/backend_metric_filter.cc', 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/channel_idle/channel_idle_filter.cc', 'src/core/ext/filters/channel_idle/idle_filter_state.cc', diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index df433c774a9..182ccb1b13c 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -495,8 +495,7 @@ grpc_cc_test( "//:gpr", "//:grpc", "//:grpc++", - "//:grpcpp_backend_metric_recorder", - "//:grpcpp_call_metric_recorder", + "//:grpcpp_orca_interceptor", "//:grpcpp_orca_service", "//src/core:channel_args", "//src/proto/grpc/testing:echo_messages_proto", @@ -947,8 +946,6 @@ grpc_cc_test( ], deps = [ "//:grpc++", - "//:grpcpp_backend_metric_recorder", - "//:grpcpp_call_metric_recorder", "//:grpcpp_orca_service", "//src/proto/grpc/testing/xds/v3:orca_service_proto", "//test/core/util:grpc_test_util", diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index 0c95d5599fe..b853676c6d3 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -41,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -95,29 +94,44 @@ class MyTestServiceImpl : public TestServiceImpl { ++request_count_; } AddClient(context->peer()); + absl::optional load_report; + { + grpc_core::MutexLock lock(&load_report_mu_); + load_report = load_report_; + } if (request->has_param() && request->param().has_backend_metrics()) { + if (!load_report.has_value()) load_report.emplace(); const auto& request_metrics = request->param().backend_metrics(); - auto* recorder = context->ExperimentalGetCallMetricRecorder(); - EXPECT_NE(recorder, nullptr); - // Do not record when zero since it indicates no test per-call report. if (request_metrics.cpu_utilization() > 0) { - recorder->RecordCpuUtilizationMetric(request_metrics.cpu_utilization()); + load_report->set_cpu_utilization(request_metrics.cpu_utilization()); } if (request_metrics.mem_utilization() > 0) { - recorder->RecordMemoryUtilizationMetric( - request_metrics.mem_utilization()); + load_report->set_mem_utilization(request_metrics.mem_utilization()); } if (request_metrics.rps_fractional() > 0) { - recorder->RecordQpsMetric(request_metrics.rps_fractional()); + load_report->set_rps_fractional(request_metrics.rps_fractional()); } for (const auto& p : request_metrics.request_cost()) { + (*load_report->mutable_request_cost())[p.first] = p.second; + } + for (const auto& p : request_metrics.utilization()) { + (*load_report->mutable_utilization())[p.first] = p.second; + } + } + if (load_report.has_value()) { + auto* recorder = context->ExperimentalGetCallMetricRecorder(); + EXPECT_NE(recorder, nullptr); + recorder->RecordCpuUtilizationMetric(load_report->cpu_utilization()) + .RecordMemoryUtilizationMetric(load_report->mem_utilization()) + .RecordQpsMetric(load_report->rps_fractional()); + for (const auto& p : load_report->request_cost()) { char* key = static_cast( grpc_call_arena_alloc(context->c_call(), p.first.size() + 1)); strncpy(key, p.first.data(), p.first.size()); key[p.first.size()] = '\0'; recorder->RecordRequestCostMetric(key, p.second); } - for (const auto& p : request_metrics.utilization()) { + for (const auto& p : load_report->utilization()) { char* key = static_cast( grpc_call_arena_alloc(context->c_call(), p.first.size() + 1)); strncpy(key, p.first.data(), p.first.size()); @@ -128,7 +142,7 @@ class MyTestServiceImpl : public TestServiceImpl { return TestServiceImpl::Echo(context, request, response); } - size_t request_count() { + int request_count() { grpc_core::MutexLock lock(&mu_); return request_count_; } @@ -143,6 +157,15 @@ class MyTestServiceImpl : public TestServiceImpl { return clients_; } + // TODO(roth): Once the backend utilization APIs are updated, change + // this to use those instead of manually constructing the data for + // each call. + void SetLoadReport( + absl::optional load_report) { + grpc_core::MutexLock lock(&load_report_mu_); + load_report_ = std::move(load_report); + } + private: void AddClient(const std::string& client) { grpc_core::MutexLock lock(&clients_mu_); @@ -150,10 +173,14 @@ class MyTestServiceImpl : public TestServiceImpl { } grpc_core::Mutex mu_; - size_t request_count_ ABSL_GUARDED_BY(&mu_) = 0; + int request_count_ ABSL_GUARDED_BY(&mu_) = 0; grpc_core::Mutex clients_mu_; std::set clients_ ABSL_GUARDED_BY(&clients_mu_); + + grpc_core::Mutex load_report_mu_; + absl::optional load_report_ + ABSL_GUARDED_BY(&load_report_mu_); }; class FakeResolverResponseGeneratorWrapper { @@ -251,6 +278,16 @@ class ClientLbEnd2endTest : public ::testing::Test { creds_(new SecureChannelCredentials( grpc_fake_transport_security_credentials_create())) {} + static void SetUpTestSuite() { + // Make the backup poller poll very frequently in order to pick up + // updates from all the subchannels's FDs. + GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1); +#if TARGET_OS_IPHONE + // Workaround Apple CFStream bug + grpc_core::SetEnv("grpc_cfstream", "0"); +#endif + } + void SetUp() override { grpc_init(); bool localhost_resolves_to_ipv4 = false; @@ -381,16 +418,14 @@ class ClientLbEnd2endTest : public ::testing::Test { const grpc_core::DebugLocation& debug_location, const std::unique_ptr& stub, std::function continue_predicate, - EchoRequest* request_ptr = nullptr, int timeout_ms = 15000) { + int timeout_ms = 15000) { absl::Time deadline = absl::InfiniteFuture(); if (timeout_ms != 0) { deadline = absl::Now() + (absl::Milliseconds(timeout_ms) * grpc_test_slowdown_factor()); } while (true) { - Status status = - SendRpc(stub, /*response=*/nullptr, /*timeout_ms=*/1000, - /*wait_for_ready=*/false, /*request=*/request_ptr); + Status status = SendRpc(stub); if (!continue_predicate(status)) return; EXPECT_LE(absl::Now(), deadline) << debug_location.file() << ":" << debug_location.line(); @@ -402,7 +437,6 @@ class ClientLbEnd2endTest : public ::testing::Test { const int port_; std::unique_ptr server_; MyTestServiceImpl service_; - std::unique_ptr server_metric_recorder_; experimental::OrcaService orca_service_; std::unique_ptr thread_; @@ -413,11 +447,7 @@ class ClientLbEnd2endTest : public ::testing::Test { explicit ServerData(int port = 0) : port_(port > 0 ? port : grpc_pick_unused_port_or_die()), - server_metric_recorder_(experimental::ServerMetricRecorder::Create()), - orca_service_( - server_metric_recorder_.get(), - experimental::OrcaService::Options().set_min_report_duration( - absl::Seconds(0.1))) {} + orca_service_(experimental::OrcaService::Options()) {} void Start(const std::string& server_host) { gpr_log(GPR_INFO, "starting server on port %d", port_); @@ -436,13 +466,12 @@ class ClientLbEnd2endTest : public ::testing::Test { std::ostringstream server_address; server_address << server_host << ":" << port_; ServerBuilder builder; + experimental::EnableCallMetricRecording(&builder); std::shared_ptr creds(new SecureServerCredentials( grpc_fake_transport_security_server_credentials_create())); builder.AddListeningPort(server_address.str(), std::move(creds)); builder.RegisterService(&service_); builder.RegisterService(&orca_service_); - grpc::ServerBuilder::experimental_type(&builder) - .EnableCallMetricRecording(server_metric_recorder_.get()); server_ = builder.BuildAndStart(); grpc_core::MutexLock lock(&mu_); server_ready_ = true; @@ -2523,12 +2552,8 @@ TEST_F(ClientLbInterceptTrailingMetadataTest, BackendMetricData) { (*request_cost)["foo"] = 0.8; (*request_cost)["bar"] = 1.4; auto* utilization = load_report.mutable_utilization(); - (*utilization)["baz"] = 1.0; + (*utilization)["baz"] = 1.1; (*utilization)["quux"] = 0.9; - // This will be rejected. - (*utilization)["out_of_range_invalid"] = 1.1; - auto expected = load_report; - expected.mutable_utilization()->erase("out_of_range_invalid"); auto response_generator = BuildResolverResponseGenerator(); auto channel = BuildChannel("intercept_trailing_metadata_lb", response_generator); @@ -2540,19 +2565,19 @@ TEST_F(ClientLbInterceptTrailingMetadataTest, BackendMetricData) { ASSERT_TRUE(actual.has_value()); // TODO(roth): Change this to use EqualsProto() once that becomes // available in OSS. - EXPECT_EQ(actual->cpu_utilization(), expected.cpu_utilization()); - EXPECT_EQ(actual->mem_utilization(), expected.mem_utilization()); - EXPECT_EQ(actual->rps_fractional(), expected.rps_fractional()); - EXPECT_EQ(actual->request_cost().size(), expected.request_cost().size()); + EXPECT_EQ(actual->cpu_utilization(), load_report.cpu_utilization()); + EXPECT_EQ(actual->mem_utilization(), load_report.mem_utilization()); + EXPECT_EQ(actual->rps_fractional(), load_report.rps_fractional()); + EXPECT_EQ(actual->request_cost().size(), load_report.request_cost().size()); for (const auto& p : actual->request_cost()) { - auto it = expected.request_cost().find(p.first); - ASSERT_NE(it, expected.request_cost().end()); + auto it = load_report.request_cost().find(p.first); + ASSERT_NE(it, load_report.request_cost().end()); EXPECT_EQ(it->second, p.second); } - EXPECT_EQ(actual->utilization().size(), expected.utilization().size()); + EXPECT_EQ(actual->utilization().size(), load_report.utilization().size()); for (const auto& p : actual->utilization()) { - auto it = expected.utilization().find(p.first); - ASSERT_NE(it, expected.utilization().end()); + auto it = load_report.utilization().find(p.first); + ASSERT_NE(it, load_report.utilization().end()); EXPECT_EQ(it->second, p.second); } } @@ -2711,10 +2736,10 @@ TEST_F(OobBackendMetricTest, Basic) { StartServers(1); // Set initial backend metric data on server. constexpr char kMetricName[] = "foo"; - servers_[0]->server_metric_recorder_->SetCpuUtilization(0.1); - servers_[0]->server_metric_recorder_->SetMemoryUtilization(0.2); - servers_[0]->server_metric_recorder_->SetQps(0.3); - servers_[0]->server_metric_recorder_->SetNamedUtilization(kMetricName, 0.4); + servers_[0]->orca_service_.SetCpuUtilization(0.1); + servers_[0]->orca_service_.SetMemoryUtilization(0.2); + servers_[0]->orca_service_.SetQps(0.3); + servers_[0]->orca_service_.SetNamedUtilization(kMetricName, 0.4); // Start client. auto response_generator = BuildResolverResponseGenerator(); auto channel = BuildChannel("oob_backend_metric_test_lb", response_generator); @@ -2726,7 +2751,6 @@ TEST_F(OobBackendMetricTest, Basic) { EXPECT_EQ("oob_backend_metric_test_lb", channel->GetLoadBalancingPolicyName()); // Check report seen by client. - bool report_seen = false; for (size_t i = 0; i < 5; ++i) { auto report = GetBackendMetricReport(); if (report.has_value()) { @@ -2737,22 +2761,19 @@ TEST_F(OobBackendMetricTest, Basic) { EXPECT_THAT( report->second.utilization(), ::testing::UnorderedElementsAre(::testing::Pair(kMetricName, 0.4))); - report_seen = true; break; } gpr_sleep_until(grpc_timeout_seconds_to_deadline(1)); } - ASSERT_TRUE(report_seen); // Now update the utilization data on the server. // Note that the server may send a new report while we're updating these, // so we set them in reverse order, so that we know we'll get all new // data once we see a report with the new CPU utilization value. - servers_[0]->server_metric_recorder_->SetNamedUtilization(kMetricName, 0.7); - servers_[0]->server_metric_recorder_->SetQps(0.6); - servers_[0]->server_metric_recorder_->SetMemoryUtilization(0.5); - servers_[0]->server_metric_recorder_->SetCpuUtilization(0.4); + servers_[0]->orca_service_.SetNamedUtilization(kMetricName, 0.7); + servers_[0]->orca_service_.SetQps(0.6); + servers_[0]->orca_service_.SetMemoryUtilization(0.5); + servers_[0]->orca_service_.SetCpuUtilization(0.4); // Wait for client to see new report. - report_seen = false; for (size_t i = 0; i < 5; ++i) { auto report = GetBackendMetricReport(); if (report.has_value()) { @@ -2764,13 +2785,11 @@ TEST_F(OobBackendMetricTest, Basic) { EXPECT_THAT( report->second.utilization(), ::testing::UnorderedElementsAre(::testing::Pair(kMetricName, 0.7))); - report_seen = true; break; } } gpr_sleep_until(grpc_timeout_seconds_to_deadline(1)); } - ASSERT_TRUE(report_seen); } // @@ -2863,125 +2882,97 @@ TEST_F(ControlPlaneStatusRewritingTest, RewritesFromConfigSelector) { // WeightedRoundRobinTest // -const char kServiceConfigPerCall[] = - "{\n" - " \"loadBalancingConfig\": [\n" - " {\"weighted_round_robin_experimental\": {\n" - " \"blackoutPeriod\": \"0s\",\n" - " \"weightUpdatePeriod\": \"0.1s\"\n" - " }}\n" - " ]\n" - "}"; - -const char kServiceConfigOob[] = - "{\n" - " \"loadBalancingConfig\": [\n" - " {\"weighted_round_robin_experimental\": {\n" - " \"blackoutPeriod\": \"0s\",\n" - " \"weightUpdatePeriod\": \"0.1s\",\n" - " \"enableOobLoadReport\": true\n" - " }}\n" - " ]\n" - "}"; - -class WeightedRoundRobinTest : public ClientLbEnd2endTest { - protected: - void ExpectWeightedRoundRobinPicks( - const grpc_core::DebugLocation& location, - const std::unique_ptr& stub, - const std::vector& expected_weights, size_t total_passes = 3, - EchoRequest* request_ptr = nullptr) { - GPR_ASSERT(expected_weights.size() == servers_.size()); - size_t total_picks_per_pass = 0; - for (size_t picks : expected_weights) { - total_picks_per_pass += picks; - } - size_t num_picks = 0; - size_t num_passes = 0; - SendRpcsUntil( - location, stub, - [&](const Status&) { - if (++num_picks == total_picks_per_pass) { - bool match = true; - for (size_t i = 0; i < expected_weights.size(); ++i) { - if (servers_[i]->service_.request_count() != - expected_weights[i]) { - match = false; - break; - } - } - if (match) { - if (++num_passes == total_passes) return false; - } else { - num_passes = 0; - } - num_picks = 0; - ResetCounters(); - } - return true; - }, - request_ptr); - } -}; +using WeightedRoundRobinTest = ClientLbEnd2endTest; -TEST_F(WeightedRoundRobinTest, CallAndServerMetric) { +TEST_F(WeightedRoundRobinTest, Basic) { const int kNumServers = 3; StartServers(kNumServers); - // Report server metrics that should give 1:2:4 WRR picks. - servers_[0]->server_metric_recorder_->SetCpuUtilization(0.9); - servers_[0]->server_metric_recorder_->SetQps(9); - servers_[1]->server_metric_recorder_->SetCpuUtilization(0.3); - servers_[1]->server_metric_recorder_->SetQps(6); - servers_[2]->server_metric_recorder_->SetCpuUtilization(0.3); - servers_[2]->server_metric_recorder_->SetQps(12); + // Tell each server to report the appropriate CPU utilization. + xds::data::orca::v3::OrcaLoadReport load_report; + load_report.set_rps_fractional(100); + load_report.set_cpu_utilization(0.9); + servers_[0]->service_.SetLoadReport(load_report); + load_report.set_cpu_utilization(0.3); + servers_[1]->service_.SetLoadReport(load_report); + servers_[2]->service_.SetLoadReport(load_report); // Create channel. auto response_generator = BuildResolverResponseGenerator(); auto channel = BuildChannel("", response_generator); auto stub = BuildStub(channel); - response_generator.SetNextResolution(GetServersPorts(), - kServiceConfigPerCall); - // Send requests with per-call reported QPS set to 100. - // This should override per-server QPS above and give 1:3:3 WRR picks. - EchoRequest request; - request.mutable_param()->mutable_backend_metrics()->set_rps_fractional(100); - ExpectWeightedRoundRobinPicks(DEBUG_LOCATION, stub, - /*expected_weights=*/{1, 3, 3}, - /*total_passes=*/3, &request); - // Now send requests without per-call reported QPS. - // This should change WRR picks back to 1:2:4. - ExpectWeightedRoundRobinPicks(DEBUG_LOCATION, stub, - /*expected_weights=*/{1, 2, 4}); + const char kServiceConfig[] = + "{\n" + " \"loadBalancingConfig\": [\n" + " {\"weighted_round_robin_experimental\": {\n" + " \"blackoutPeriod\": \"0s\"\n" + " }}\n" + " ]\n" + "}"; + response_generator.SetNextResolution(GetServersPorts(), kServiceConfig); + // Wait for the right set of WRR picks. + size_t num_picks = 0; + SendRpcsUntil(DEBUG_LOCATION, stub, [&](const Status&) { + if (++num_picks == 7) { + gpr_log(GPR_INFO, "request counts: %d %d %d", + servers_[0]->service_.request_count(), + servers_[1]->service_.request_count(), + servers_[2]->service_.request_count()); + if (servers_[0]->service_.request_count() == 1 && + servers_[1]->service_.request_count() == 3 && + servers_[2]->service_.request_count() == 3) { + return false; + } + num_picks = 0; + ResetCounters(); + } + return true; + }); // Check LB policy name for the channel. EXPECT_EQ("weighted_round_robin_experimental", channel->GetLoadBalancingPolicyName()); } -class WeightedRoundRobinParamTest - : public WeightedRoundRobinTest, - public ::testing::WithParamInterface {}; - -INSTANTIATE_TEST_SUITE_P(WeightedRoundRobin, WeightedRoundRobinParamTest, - ::testing::Values(kServiceConfigPerCall, - kServiceConfigOob)); - -TEST_P(WeightedRoundRobinParamTest, Basic) { +TEST_F(WeightedRoundRobinTest, OobReporting) { const int kNumServers = 3; StartServers(kNumServers); - // Report server metrics that should give 1:3:3 WRR picks. - servers_[0]->server_metric_recorder_->SetCpuUtilization(0.9); - servers_[0]->server_metric_recorder_->SetQps(100); - servers_[1]->server_metric_recorder_->SetCpuUtilization(0.3); - servers_[1]->server_metric_recorder_->SetQps(100); - servers_[2]->server_metric_recorder_->SetCpuUtilization(0.3); - servers_[2]->server_metric_recorder_->SetQps(100); + // Tell each server to report the appropriate CPU utilization. + servers_[0]->orca_service_.SetCpuUtilization(0.9); + servers_[0]->orca_service_.SetQps(100); + servers_[1]->orca_service_.SetCpuUtilization(0.3); + servers_[1]->orca_service_.SetQps(100); + servers_[2]->orca_service_.SetCpuUtilization(0.3); + servers_[2]->orca_service_.SetQps(100); // Create channel. auto response_generator = BuildResolverResponseGenerator(); auto channel = BuildChannel("", response_generator); auto stub = BuildStub(channel); - response_generator.SetNextResolution(GetServersPorts(), GetParam()); + const char kServiceConfig[] = + "{\n" + " \"loadBalancingConfig\": [\n" + " {\"weighted_round_robin_experimental\": {\n" + " \"blackoutPeriod\": \"0s\",\n" + " \"enableOobLoadReport\": true\n" + " }}\n" + " ]\n" + "}"; + response_generator.SetNextResolution(GetServersPorts(), kServiceConfig); // Wait for the right set of WRR picks. - ExpectWeightedRoundRobinPicks(DEBUG_LOCATION, stub, - /*expected_weights=*/{1, 3, 3}); + size_t num_picks = 0; + SendRpcsUntil(DEBUG_LOCATION, stub, [&](const Status&) { + if (++num_picks == 7) { + gpr_log(GPR_INFO, "request counts: %d %d %d", + servers_[0]->service_.request_count(), + servers_[1]->service_.request_count(), + servers_[2]->service_.request_count()); + if (servers_[0]->service_.request_count() == 1 && + servers_[1]->service_.request_count() == 3 && + servers_[2]->service_.request_count() == 3) { + return false; + } + num_picks = 0; + ResetCounters(); + } + return true; + }); // Check LB policy name for the channel. EXPECT_EQ("weighted_round_robin_experimental", channel->GetLoadBalancingPolicyName()); @@ -2993,13 +2984,6 @@ TEST_P(WeightedRoundRobinParamTest, Basic) { int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); - // Make the backup poller poll very frequently in order to pick up - // updates from all the subchannels's FDs. - GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1); -#if TARGET_OS_IPHONE - // Workaround Apple CFStream bug - grpc_core::SetEnv("grpc_cfstream", "0"); -#endif grpc::testing::TestEnvironment env(&argc, argv); grpc_init(); grpc::testing::ConnectionAttemptInjector::Init(); diff --git a/test/cpp/end2end/orca_service_end2end_test.cc b/test/cpp/end2end/orca_service_end2end_test.cc index a1d9ec3ab9d..d390bcc820c 100644 --- a/test/cpp/end2end/orca_service_end2end_test.cc +++ b/test/cpp/end2end/orca_service_end2end_test.cc @@ -24,9 +24,7 @@ #include #include #include -#include #include -#include #include #include #include @@ -46,7 +44,6 @@ namespace testing { namespace { using experimental::OrcaService; -using experimental::ServerMetricRecorder; class OrcaServiceEnd2endTest : public ::testing::Test { protected: @@ -94,10 +91,8 @@ class OrcaServiceEnd2endTest : public ::testing::Test { }; OrcaServiceEnd2endTest() - : server_metric_recorder_(ServerMetricRecorder::Create()), - orca_service_(server_metric_recorder_.get(), - OrcaService::Options().set_min_report_duration( - absl::ZeroDuration())) { + : orca_service_(OrcaService::Options().set_min_report_duration( + absl::ZeroDuration())) { std::string server_address = absl::StrCat("localhost:", grpc_pick_unused_port_or_die()); ServerBuilder builder; @@ -112,7 +107,6 @@ class OrcaServiceEnd2endTest : public ::testing::Test { ~OrcaServiceEnd2endTest() override { server_->Shutdown(); } std::string server_address_; - std::unique_ptr server_metric_recorder_; OrcaService orca_service_; std::unique_ptr server_; std::unique_ptr stub_; @@ -146,24 +140,24 @@ TEST_F(OrcaServiceEnd2endTest, Basic) { EXPECT_THAT(response.utilization(), ::testing::UnorderedElementsAre()); }); // Now set CPU utilization on the server. - server_metric_recorder_->SetCpuUtilization(0.5); + orca_service_.SetCpuUtilization(0.5); ReadResponses([](const OrcaLoadReport& response) { EXPECT_EQ(response.cpu_utilization(), 0.5); EXPECT_EQ(response.mem_utilization(), 0); EXPECT_THAT(response.utilization(), ::testing::UnorderedElementsAre()); }); // Update CPU utilization and set memory utilization. - server_metric_recorder_->SetCpuUtilization(0.8); - server_metric_recorder_->SetMemoryUtilization(0.4); + orca_service_.SetCpuUtilization(0.8); + orca_service_.SetMemoryUtilization(0.4); ReadResponses([](const OrcaLoadReport& response) { EXPECT_EQ(response.cpu_utilization(), 0.8); EXPECT_EQ(response.mem_utilization(), 0.4); EXPECT_THAT(response.utilization(), ::testing::UnorderedElementsAre()); }); // Unset CPU and memory utilization and set a named utilization. - server_metric_recorder_->ClearCpuUtilization(); - server_metric_recorder_->ClearMemoryUtilization(); - server_metric_recorder_->SetNamedUtilization(kMetricName1, 0.3); + orca_service_.DeleteCpuUtilization(); + orca_service_.DeleteMemoryUtilization(); + orca_service_.SetNamedUtilization(kMetricName1, 0.3); ReadResponses([&](const OrcaLoadReport& response) { EXPECT_EQ(response.cpu_utilization(), 0); EXPECT_EQ(response.mem_utilization(), 0); @@ -172,9 +166,9 @@ TEST_F(OrcaServiceEnd2endTest, Basic) { ::testing::UnorderedElementsAre(::testing::Pair(kMetricName1, 0.3))); }); // Unset the previous named utilization and set two new ones. - server_metric_recorder_->ClearNamedUtilization(kMetricName1); - server_metric_recorder_->SetNamedUtilization(kMetricName2, 0.2); - server_metric_recorder_->SetNamedUtilization(kMetricName3, 0.1); + orca_service_.DeleteNamedUtilization(kMetricName1); + orca_service_.SetNamedUtilization(kMetricName2, 0.2); + orca_service_.SetNamedUtilization(kMetricName3, 0.1); ReadResponses([&](const OrcaLoadReport& response) { EXPECT_EQ(response.cpu_utilization(), 0); EXPECT_EQ(response.mem_utilization(), 0); @@ -184,7 +178,7 @@ TEST_F(OrcaServiceEnd2endTest, Basic) { ::testing::Pair(kMetricName3, 0.1))); }); // Replace the entire named metric map at once. - server_metric_recorder_->SetAllNamedUtilization( + orca_service_.SetAllNamedUtilization( {{kMetricName2, 0.5}, {kMetricName4, 0.9}}); ReadResponses([&](const OrcaLoadReport& response) { EXPECT_EQ(response.cpu_utilization(), 0); diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index 827d729d815..d69cf3c1ce8 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -59,6 +59,7 @@ grpc_cc_library( "//:grpc", "//:grpc++", "//:grpc_resolver_fake", + "//:grpcpp_orca_interceptor", "//src/proto/grpc/testing:echo_messages_proto", "//src/proto/grpc/testing:echo_proto", "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", diff --git a/test/cpp/end2end/xds/xds_end2end_test_lib.cc b/test/cpp/end2end/xds/xds_end2end_test_lib.cc index 53061468986..7228a3214b5 100644 --- a/test/cpp/end2end/xds/xds_end2end_test_lib.cc +++ b/test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -251,7 +251,7 @@ XdsEnd2endTest::BackendServerThread::Credentials() { void XdsEnd2endTest::BackendServerThread::RegisterAllServices( ServerBuilder* builder) { - ServerBuilder::experimental_type(builder).EnableCallMetricRecording(); + experimental::EnableCallMetricRecording(builder); builder->RegisterService(&backend_service_); builder->RegisterService(&backend_service1_); builder->RegisterService(&backend_service2_); diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index e8d374ba082..f9bd153690a 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -952,7 +952,6 @@ include/grpcpp/create_channel_binder.h \ include/grpcpp/create_channel_posix.h \ include/grpcpp/ext/call_metric_recorder.h \ include/grpcpp/ext/health_check_service_server_builder_option.h \ -include/grpcpp/ext/server_metric_recorder.h \ include/grpcpp/generic/async_generic_service.h \ include/grpcpp/generic/generic_stub.h \ include/grpcpp/grpcpp.h \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 00b8aec67f0..90e689b6788 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -952,7 +952,6 @@ include/grpcpp/create_channel_binder.h \ include/grpcpp/create_channel_posix.h \ include/grpcpp/ext/call_metric_recorder.h \ include/grpcpp/ext/health_check_service_server_builder_option.h \ -include/grpcpp/ext/server_metric_recorder.h \ include/grpcpp/generic/async_generic_service.h \ include/grpcpp/generic/generic_stub.h \ include/grpcpp/grpcpp.h \ @@ -1072,9 +1071,6 @@ include/grpcpp/support/time.h \ include/grpcpp/support/validate_service_config.h \ include/grpcpp/version_info.h \ include/grpcpp/xds_server_builder.h \ -src/core/ext/filters/backend_metrics/backend_metric_filter.cc \ -src/core/ext/filters/backend_metrics/backend_metric_filter.h \ -src/core/ext/filters/backend_metrics/backend_metric_provider.h \ src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.h \ @@ -2728,8 +2724,6 @@ src/cpp/common/tls_credentials_options.cc \ src/cpp/common/validate_service_config.cc \ src/cpp/common/version_cc.cc \ src/cpp/server/async_generic_service.cc \ -src/cpp/server/backend_metric_recorder.cc \ -src/cpp/server/backend_metric_recorder.h \ src/cpp/server/channel_argument_option.cc \ src/cpp/server/create_default_thread_pool.cc \ src/cpp/server/dynamic_thread_pool.h \ @@ -2740,6 +2734,7 @@ src/cpp/server/health/default_health_check_service.h \ src/cpp/server/health/health_check_service.cc \ src/cpp/server/health/health_check_service_server_builder_option.cc \ src/cpp/server/insecure_server_credentials.cc \ +src/cpp/server/orca/call_metric_recorder.cc \ src/cpp/server/secure_server_credentials.cc \ src/cpp/server/secure_server_credentials.h \ src/cpp/server/server_builder.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index f3cdcd87d02..b06a51435d6 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -877,9 +877,6 @@ include/grpc/support/time.h \ include/grpc/support/workaround_list.h \ src/core/README.md \ src/core/ext/README.md \ -src/core/ext/filters/backend_metrics/backend_metric_filter.cc \ -src/core/ext/filters/backend_metrics/backend_metric_filter.h \ -src/core/ext/filters/backend_metrics/backend_metric_provider.h \ src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.cc \ src/core/ext/filters/channel_idle/channel_idle_filter.h \