diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD index ca3321b2211..8262b29ab27 100644 --- a/test/cpp/interop/BUILD +++ b/test/cpp/interop/BUILD @@ -268,6 +268,8 @@ grpc_cc_binary( ], external_deps = [ "absl/flags:flag", + "otel/exporters/prometheus:prometheus_exporter", + "otel/sdk/src/metrics", ], deps = [ ":rpc_behavior_lb_policy", @@ -275,6 +277,7 @@ grpc_cc_binary( "//:grpc++", "//:grpc++_reflection", "//:grpcpp_admin", + "//:grpcpp_csm_observability", "//src/proto/grpc/testing:empty_proto", "//src/proto/grpc/testing:messages_proto", "//src/proto/grpc/testing:test_proto", @@ -313,10 +316,13 @@ grpc_cc_binary( ], external_deps = [ "absl/flags:flag", + "otel/exporters/prometheus:prometheus_exporter", + "otel/sdk/src/metrics", ], deps = [ ":xds_interop_server_lib", "//:grpc++", + "//:grpcpp_csm_observability", "//test/core/util:grpc_test_util", "//test/cpp/end2end:test_health_check_service_impl", "//test/cpp/util:test_config", diff --git a/test/cpp/interop/xds_interop_client.cc b/test/cpp/interop/xds_interop_client.cc index 6fe2dd38533..8484e06f6a2 100644 --- a/test/cpp/interop/xds_interop_client.cc +++ b/test/cpp/interop/xds_interop_client.cc @@ -33,8 +33,12 @@ #include "absl/algorithm/container.h" #include "absl/flags/flag.h" #include "absl/strings/str_split.h" +#include "opentelemetry/exporters/prometheus/exporter_factory.h" +#include "opentelemetry/exporters/prometheus/exporter_options.h" +#include "opentelemetry/sdk/metrics/meter_provider.h" #include +#include #include #include #include @@ -69,6 +73,8 @@ ABSL_FLAG(std::string, expect_status, "OK", ABSL_FLAG( bool, secure_mode, false, "If true, XdsCredentials are used, InsecureChannelCredentials otherwise"); +ABSL_FLAG(bool, enable_csm_observability, false, + "Whether to enable CSM Observability"); using grpc::Channel; using grpc::ClientAsyncResponseReader; @@ -386,6 +392,22 @@ void RunTestLoop(std::chrono::duration duration_per_query, GPR_UNREACHABLE_CODE(thread.join()); } +void EnableCsmObservability() { + gpr_log(GPR_DEBUG, "Registering Prometheus exporter"); + opentelemetry::exporter::metrics::PrometheusExporterOptions opts; + // default was "localhost:9464" which causes connection issue across GKE + // pods + opts.url = "0.0.0.0:9464"; + auto prometheus_exporter = + opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); + auto meter_provider = + std::make_shared(); + meter_provider->AddMetricReader(std::move(prometheus_exporter)); + auto observability = grpc::experimental::CsmObservabilityBuilder(); + observability.SetMeterProvider(std::move(meter_provider)); + auto status = observability.BuildAndRegister(); +} + void RunServer(const int port, StatsWatchers* stats_watchers, RpcConfigurationsQueue* rpc_configs_queue) { GPR_ASSERT(port != 0); @@ -474,6 +496,9 @@ int main(int argc, char** argv) { } BuildRpcConfigsFromFlags(&rpc_config_queue); + if (absl::GetFlag(FLAGS_enable_csm_observability)) { + EnableCsmObservability(); + } std::chrono::duration duration_per_query = std::chrono::nanoseconds(std::chrono::seconds(1)) / diff --git a/test/cpp/interop/xds_interop_server.cc b/test/cpp/interop/xds_interop_server.cc index eacf26f23cb..a3b95485af0 100644 --- a/test/cpp/interop/xds_interop_server.cc +++ b/test/cpp/interop/xds_interop_server.cc @@ -19,8 +19,12 @@ #include #include "absl/flags/flag.h" +#include "opentelemetry/exporters/prometheus/exporter_factory.h" +#include "opentelemetry/exporters/prometheus/exporter_options.h" +#include "opentelemetry/sdk/metrics/meter_provider.h" #include +#include #include #include "src/core/lib/iomgr/gethostname.h" @@ -36,6 +40,24 @@ ABSL_FLAG(std::string, server_id, "cpp_server", ABSL_FLAG(bool, secure_mode, false, "If true, XdsServerCredentials are used, InsecureServerCredentials " "otherwise"); +ABSL_FLAG(bool, enable_csm_observability, false, + "Whether to enable CSM Observability"); + +void EnableCsmObservability() { + gpr_log(GPR_DEBUG, "Registering Prometheus exporter"); + opentelemetry::exporter::metrics::PrometheusExporterOptions opts; + // default was "localhost:9464" which causes connection issue across GKE + // pods + opts.url = "0.0.0.0:9464"; + auto prometheus_exporter = + opentelemetry::exporter::metrics::PrometheusExporterFactory::Create(opts); + auto meter_provider = + std::make_shared(); + meter_provider->AddMetricReader(std::move(prometheus_exporter)); + auto observability = grpc::experimental::CsmObservabilityBuilder(); + observability.SetMeterProvider(std::move(meter_provider)); + auto status = observability.BuildAndRegister(); +} int main(int argc, char** argv) { grpc::testing::TestEnvironment env(&argc, argv); @@ -56,6 +78,9 @@ int main(int argc, char** argv) { return 1; } grpc::EnableDefaultHealthCheckService(false); + if (absl::GetFlag(FLAGS_enable_csm_observability)) { + EnableCsmObservability(); + } grpc::testing::RunServer( absl::GetFlag(FLAGS_secure_mode), port, maintenance_port, hostname, absl::GetFlag(FLAGS_server_id), [](grpc::Server* /* unused */) {});