From 2f8c975cfcf85e3aff0104e871de5d48fd4b3173 Mon Sep 17 00:00:00 2001 From: yijiem Date: Wed, 24 Jul 2024 15:44:08 -0700 Subject: [PATCH] Do not construct NPCMetricsKeyValueIterable when calling OTel API when the instrument has empty label and optional label --- src/cpp/ext/otel/otel_plugin.cc | 115 ++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 42 deletions(-) diff --git a/src/cpp/ext/otel/otel_plugin.cc b/src/cpp/ext/otel/otel_plugin.cc index 4b2f313f466..6ae99378296 100644 --- a/src/cpp/ext/otel/otel_plugin.cc +++ b/src/cpp/ext/otel/otel_plugin.cc @@ -637,12 +637,18 @@ void OpenTelemetryPluginImpl::AddCounter( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Add(value, NPCMetricsKeyValueIterable( - descriptor.label_keys, label_values, - descriptor.optional_label_keys, optional_values, - instrument_data.optional_labels_bits)); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Add(value); + } else { + absl::get>>( + instrument_data.instrument) + ->Add(value, NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits)); + } } void OpenTelemetryPluginImpl::AddCounter( @@ -661,12 +667,18 @@ void OpenTelemetryPluginImpl::AddCounter( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Add(value, NPCMetricsKeyValueIterable( - descriptor.label_keys, label_values, - descriptor.optional_label_keys, optional_values, - instrument_data.optional_labels_bits)); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Add(value); + } else { + absl::get>>( + instrument_data.instrument) + ->Add(value, NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits)); + } } void OpenTelemetryPluginImpl::RecordHistogram( @@ -685,14 +697,20 @@ void OpenTelemetryPluginImpl::RecordHistogram( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Record(value, - NPCMetricsKeyValueIterable(descriptor.label_keys, label_values, - descriptor.optional_label_keys, - optional_values, - instrument_data.optional_labels_bits), - opentelemetry::context::Context{}); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Record(value, opentelemetry::context::Context{}); + } else { + absl::get>>( + instrument_data.instrument) + ->Record(value, + NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits), + opentelemetry::context::Context{}); + } } void OpenTelemetryPluginImpl::RecordHistogram( @@ -711,14 +729,20 @@ void OpenTelemetryPluginImpl::RecordHistogram( grpc_core::GlobalInstrumentsRegistry::GetInstrumentDescriptor(handle); CHECK(descriptor.label_keys.size() == label_values.size()); CHECK(descriptor.optional_label_keys.size() == optional_values.size()); - absl::get>>( - instrument_data.instrument) - ->Record(value, - NPCMetricsKeyValueIterable(descriptor.label_keys, label_values, - descriptor.optional_label_keys, - optional_values, - instrument_data.optional_labels_bits), - opentelemetry::context::Context{}); + if (label_values.empty() && optional_values.empty()) { + absl::get>>( + instrument_data.instrument) + ->Record(value, opentelemetry::context::Context{}); + } else { + absl::get>>( + instrument_data.instrument) + ->Record(value, + NPCMetricsKeyValueIterable( + descriptor.label_keys, label_values, + descriptor.optional_label_keys, optional_values, + instrument_data.optional_labels_bits), + opentelemetry::context::Context{}); + } } void OpenTelemetryPluginImpl::AddCallback( @@ -881,20 +905,27 @@ void OpenTelemetryPluginImpl::CallbackGaugeState::Observe( for (const auto& pair : cache) { CHECK(pair.first.size() <= (descriptor.label_keys.size() + descriptor.optional_label_keys.size())); - auto& instrument_data = ot_plugin->instruments_data_.at(id); - opentelemetry::nostd::get>>(result) - ->Observe(pair.second, - NPCMetricsKeyValueIterable( - descriptor.label_keys, - absl::FixedArray( - pair.first.begin(), - pair.first.begin() + descriptor.label_keys.size()), - descriptor.optional_label_keys, - absl::FixedArray( - pair.first.begin() + descriptor.label_keys.size(), - pair.first.end()), - instrument_data.optional_labels_bits)); + if (descriptor.label_keys.empty() && + descriptor.optional_label_keys.empty()) { + opentelemetry::nostd::get>>(result) + ->Observe(pair.second); + } else { + auto& instrument_data = ot_plugin->instruments_data_.at(id); + opentelemetry::nostd::get>>(result) + ->Observe(pair.second, + NPCMetricsKeyValueIterable( + descriptor.label_keys, + absl::FixedArray( + pair.first.begin(), + pair.first.begin() + descriptor.label_keys.size()), + descriptor.optional_label_keys, + absl::FixedArray( + pair.first.begin() + descriptor.label_keys.size(), + pair.first.end()), + instrument_data.optional_labels_bits)); + } } }