[PSM Interop] Add flag to enable CSM Observability in c++ image (#34866)

Roll forward of #34832, 3rd attempt. Will run a grpc import cherry-pick
to make sure the next import is going to be clean.
pull/34869/head
Stanley Cheung 1 year ago committed by GitHub
parent 9303b86010
commit ff2c0313e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      test/cpp/interop/BUILD
  2. 25
      test/cpp/interop/xds_interop_client.cc
  3. 25
      test/cpp/interop/xds_interop_server.cc

@ -268,6 +268,8 @@ grpc_cc_binary(
], ],
external_deps = [ external_deps = [
"absl/flags:flag", "absl/flags:flag",
"otel/exporters/prometheus:prometheus_exporter",
"otel/sdk/src/metrics",
], ],
deps = [ deps = [
":rpc_behavior_lb_policy", ":rpc_behavior_lb_policy",
@ -275,6 +277,7 @@ grpc_cc_binary(
"//:grpc++", "//:grpc++",
"//:grpc++_reflection", "//:grpc++_reflection",
"//:grpcpp_admin", "//:grpcpp_admin",
"//:grpcpp_csm_observability",
"//src/proto/grpc/testing:empty_proto", "//src/proto/grpc/testing:empty_proto",
"//src/proto/grpc/testing:messages_proto", "//src/proto/grpc/testing:messages_proto",
"//src/proto/grpc/testing:test_proto", "//src/proto/grpc/testing:test_proto",
@ -313,10 +316,13 @@ grpc_cc_binary(
], ],
external_deps = [ external_deps = [
"absl/flags:flag", "absl/flags:flag",
"otel/exporters/prometheus:prometheus_exporter",
"otel/sdk/src/metrics",
], ],
deps = [ deps = [
":xds_interop_server_lib", ":xds_interop_server_lib",
"//:grpc++", "//:grpc++",
"//:grpcpp_csm_observability",
"//test/core/util:grpc_test_util", "//test/core/util:grpc_test_util",
"//test/cpp/end2end:test_health_check_service_impl", "//test/cpp/end2end:test_health_check_service_impl",
"//test/cpp/util:test_config", "//test/cpp/util:test_config",

@ -33,8 +33,12 @@
#include "absl/algorithm/container.h" #include "absl/algorithm/container.h"
#include "absl/flags/flag.h" #include "absl/flags/flag.h"
#include "absl/strings/str_split.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 <grpcpp/ext/admin_services.h> #include <grpcpp/ext/admin_services.h>
#include <grpcpp/ext/csm_observability.h>
#include <grpcpp/ext/proto_server_reflection_plugin.h> #include <grpcpp/ext/proto_server_reflection_plugin.h>
#include <grpcpp/grpcpp.h> #include <grpcpp/grpcpp.h>
#include <grpcpp/server.h> #include <grpcpp/server.h>
@ -69,6 +73,8 @@ ABSL_FLAG(std::string, expect_status, "OK",
ABSL_FLAG( ABSL_FLAG(
bool, secure_mode, false, bool, secure_mode, false,
"If true, XdsCredentials are used, InsecureChannelCredentials otherwise"); "If true, XdsCredentials are used, InsecureChannelCredentials otherwise");
ABSL_FLAG(bool, enable_csm_observability, false,
"Whether to enable CSM Observability");
using grpc::Channel; using grpc::Channel;
using grpc::ClientAsyncResponseReader; using grpc::ClientAsyncResponseReader;
@ -386,6 +392,22 @@ void RunTestLoop(std::chrono::duration<double> duration_per_query,
GPR_UNREACHABLE_CODE(thread.join()); 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<opentelemetry::sdk::metrics::MeterProvider>();
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, void RunServer(const int port, StatsWatchers* stats_watchers,
RpcConfigurationsQueue* rpc_configs_queue) { RpcConfigurationsQueue* rpc_configs_queue) {
GPR_ASSERT(port != 0); GPR_ASSERT(port != 0);
@ -474,6 +496,9 @@ int main(int argc, char** argv) {
} }
BuildRpcConfigsFromFlags(&rpc_config_queue); BuildRpcConfigsFromFlags(&rpc_config_queue);
if (absl::GetFlag(FLAGS_enable_csm_observability)) {
EnableCsmObservability();
}
std::chrono::duration<double> duration_per_query = std::chrono::duration<double> duration_per_query =
std::chrono::nanoseconds(std::chrono::seconds(1)) / std::chrono::nanoseconds(std::chrono::seconds(1)) /

@ -19,8 +19,12 @@
#include <iostream> #include <iostream>
#include "absl/flags/flag.h" #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 <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpcpp/ext/csm_observability.h>
#include <grpcpp/health_check_service_interface.h> #include <grpcpp/health_check_service_interface.h>
#include "src/core/lib/iomgr/gethostname.h" #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, ABSL_FLAG(bool, secure_mode, false,
"If true, XdsServerCredentials are used, InsecureServerCredentials " "If true, XdsServerCredentials are used, InsecureServerCredentials "
"otherwise"); "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<opentelemetry::sdk::metrics::MeterProvider>();
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) { int main(int argc, char** argv) {
grpc::testing::TestEnvironment env(&argc, argv); grpc::testing::TestEnvironment env(&argc, argv);
@ -56,6 +78,9 @@ int main(int argc, char** argv) {
return 1; return 1;
} }
grpc::EnableDefaultHealthCheckService(false); grpc::EnableDefaultHealthCheckService(false);
if (absl::GetFlag(FLAGS_enable_csm_observability)) {
EnableCsmObservability();
}
grpc::testing::RunServer( grpc::testing::RunServer(
absl::GetFlag(FLAGS_secure_mode), port, maintenance_port, hostname, absl::GetFlag(FLAGS_secure_mode), port, maintenance_port, hostname,
absl::GetFlag(FLAGS_server_id), [](grpc::Server* /* unused */) {}); absl::GetFlag(FLAGS_server_id), [](grpc::Server* /* unused */) {});

Loading…
Cancel
Save