[OTel C++] Add APIs to enable/disable metrics (#36183)

Closes #36183

COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/36183 from yashykt:OTelEnableDisableMetrics 948abe7235
PiperOrigin-RevId: 619696880
pull/35796/head
Yash Tibrewal 11 months ago committed by Craig Tiller
parent 95c4f32b23
commit 1312ff0625
  1. 7
      include/grpcpp/ext/otel_plugin.h
  2. 33
      src/cpp/ext/otel/otel_plugin.cc
  3. 10
      src/cpp/ext/otel/otel_plugin.h
  4. 4
      test/cpp/ext/csm/metadata_exchange_test.cc
  5. 18
      test/cpp/ext/otel/otel_plugin_test.cc
  6. 4
      test/cpp/ext/otel/otel_test_library.cc
  7. 4
      test/cpp/ext/otel/otel_test_library.h

@ -100,6 +100,13 @@ class OpenTelemetryPluginBuilder {
OpenTelemetryPluginBuilder& SetGenericMethodAttributeFilter(
absl::AnyInvocable<bool(absl::string_view /*generic_method*/) const>
generic_method_attribute_filter);
// Methods to manipulate which instruments are enabled in the OpenTelemetry
// Stats Plugin.
OpenTelemetryPluginBuilder& EnableMetrics(
absl::Span<const absl::string_view> metric_names);
OpenTelemetryPluginBuilder& DisableMetrics(
absl::Span<const absl::string_view> metric_names);
OpenTelemetryPluginBuilder& DisableAllMetrics();
/// Add a plugin option to add to the opentelemetry plugin being built. At
/// present, this type is an opaque type. Ownership of \a option is
/// transferred when `AddPluginOption` is invoked. A maximum of 64 plugin

@ -150,15 +150,19 @@ OpenTelemetryPluginBuilderImpl::SetMeterProvider(
return *this;
}
OpenTelemetryPluginBuilderImpl& OpenTelemetryPluginBuilderImpl::EnableMetric(
absl::string_view metric_name) {
metrics_.emplace(metric_name);
OpenTelemetryPluginBuilderImpl& OpenTelemetryPluginBuilderImpl::EnableMetrics(
absl::Span<const absl::string_view> metric_names) {
for (const auto& metric_name : metric_names) {
metrics_.emplace(metric_name);
}
return *this;
}
OpenTelemetryPluginBuilderImpl& OpenTelemetryPluginBuilderImpl::DisableMetric(
absl::string_view metric_name) {
metrics_.erase(metric_name);
OpenTelemetryPluginBuilderImpl& OpenTelemetryPluginBuilderImpl::DisableMetrics(
absl::Span<const absl::string_view> metric_names) {
for (const auto& metric_name : metric_names) {
metrics_.erase(metric_name);
}
return *this;
}
@ -607,6 +611,23 @@ OpenTelemetryPluginBuilder::SetGenericMethodAttributeFilter(
return *this;
}
OpenTelemetryPluginBuilder& OpenTelemetryPluginBuilder::EnableMetrics(
absl::Span<const absl::string_view> metric_names) {
impl_->EnableMetrics(metric_names);
return *this;
}
OpenTelemetryPluginBuilder& OpenTelemetryPluginBuilder::DisableMetrics(
absl::Span<const absl::string_view> metric_names) {
impl_->DisableMetrics(metric_names);
return *this;
}
OpenTelemetryPluginBuilder& OpenTelemetryPluginBuilder::DisableAllMetrics() {
impl_->DisableAllMetrics();
return *this;
}
OpenTelemetryPluginBuilder& OpenTelemetryPluginBuilder::AddPluginOption(
std::unique_ptr<OpenTelemetryPluginOption> option) {
impl_->AddPluginOption(

@ -135,8 +135,10 @@ class OpenTelemetryPluginBuilderImpl {
// grpc.server.call.duration
// grpc.server.call.sent_total_compressed_message_size
// grpc.server.call.rcvd_total_compressed_message_size
OpenTelemetryPluginBuilderImpl& EnableMetric(absl::string_view metric_name);
OpenTelemetryPluginBuilderImpl& DisableMetric(absl::string_view metric_name);
OpenTelemetryPluginBuilderImpl& EnableMetrics(
absl::Span<const absl::string_view> metric_names);
OpenTelemetryPluginBuilderImpl& DisableMetrics(
absl::Span<const absl::string_view> metric_names);
OpenTelemetryPluginBuilderImpl& DisableAllMetrics();
// If set, \a target_selector is called per channel to decide whether to
// collect metrics on that target or not.
@ -173,6 +175,10 @@ class OpenTelemetryPluginBuilderImpl {
absl::string_view optional_label_key);
absl::Status BuildAndRegisterGlobal();
const absl::flat_hash_set<std::string>& TestOnlyEnabledMetrics() {
return metrics_;
}
private:
std::shared_ptr<opentelemetry::metrics::MeterProvider> meter_provider_;
std::unique_ptr<LabelsInjector> labels_injector_;

@ -155,7 +155,7 @@ class MetadataExchangeTest
: public OpenTelemetryPluginEnd2EndTest,
public ::testing::WithParamInterface<TestScenario> {
protected:
void Init(absl::flat_hash_set<absl::string_view> metric_names,
void Init(const std::vector<absl::string_view>& metric_names,
bool enable_client_side_injector = true,
std::map<std::string, std::string> labels_to_inject = {}) {
const char* kBootstrap =
@ -178,7 +178,7 @@ class MetadataExchangeTest
}
OpenTelemetryPluginEnd2EndTest::Init(std::move(
Options()
.set_metric_names(std::move(metric_names))
.set_metric_names(metric_names)
.add_plugin_option(std::make_unique<MeshLabelsPluginOption>(
GetParam().GetTestResource().GetAttributes()))
.set_labels_to_inject(std::move(labels_to_inject))

@ -1353,6 +1353,24 @@ TEST_F(OpenTelemetryPluginNPCMetricsTest,
HistogramResultEq(kSum, kMin, kMax, kCount))))));
}
TEST(OpenTelemetryPluginMetricsEnablingDisablingTest, TestEnableDisableAPIs) {
grpc::internal::OpenTelemetryPluginBuilderImpl builder;
// First disable all metrics
builder.DisableAllMetrics();
EXPECT_TRUE(builder.TestOnlyEnabledMetrics().empty());
// Add in a few metrics
builder.EnableMetrics(
{"grpc.test.metric_1", "grpc.test.metric_2", "grpc.test.metric_3"});
EXPECT_THAT(
builder.TestOnlyEnabledMetrics(),
::testing::UnorderedElementsAre(
"grpc.test.metric_1", "grpc.test.metric_2", "grpc.test.metric_3"));
// Now remove a few metrics
builder.DisableMetrics({"grpc.test.metric_1", "grpc.test.metric_2"});
EXPECT_THAT(builder.TestOnlyEnabledMetrics(),
::testing::UnorderedElementsAre("grpc.test.metric_3"));
}
} // namespace
} // namespace testing
} // namespace grpc

@ -199,9 +199,7 @@ OpenTelemetryPluginEnd2EndTest::BuildAndRegisterOpenTelemetryPlugin(
std::make_shared<grpc::testing::MockMetricReader>();
meter_provider->AddMetricReader(reader);
ot_builder.DisableAllMetrics();
for (const auto& metric_name : options.metric_names) {
ot_builder.EnableMetric(metric_name);
}
ot_builder.EnableMetrics(options.metric_names);
if (options.use_meter_provider) {
auto meter_provider =
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();

@ -60,7 +60,7 @@ class OpenTelemetryPluginEnd2EndTest : public ::testing::Test {
protected:
struct Options {
public:
Options& set_metric_names(absl::flat_hash_set<absl::string_view> names) {
Options& set_metric_names(std::vector<absl::string_view> names) {
metric_names = std::move(names);
return *this;
}
@ -119,7 +119,7 @@ class OpenTelemetryPluginEnd2EndTest : public ::testing::Test {
return *this;
}
absl::flat_hash_set<absl::string_view> metric_names;
std::vector<absl::string_view> metric_names;
// TODO(yashykt): opentelemetry::sdk::resource::Resource doesn't have a copy
// assignment operator so wrapping it in a unique_ptr till it is fixed.
std::unique_ptr<opentelemetry::sdk::resource::Resource> resource =

Loading…
Cancel
Save