[OTel] Remove global fallback for meter provider (#34190)

Based on updates at https://github.com/grpc/proposal/pull/380

<!--

If you know who should review your pull request, please assign it to
that
person, otherwise the pull request would get assigned randomly.

If your pull request is for a specific language, please add the
appropriate
lang label.

-->
This commit is contained in:
Yash Tibrewal 2023-08-31 13:20:24 -07:00 committed by GitHub
parent 81db191c2b
commit f5e02f6c62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 33 deletions

View File

@ -26,7 +26,6 @@
#include "opentelemetry/metrics/meter.h"
#include "opentelemetry/metrics/meter_provider.h"
#include "opentelemetry/metrics/provider.h"
#include "opentelemetry/nostd/shared_ptr.h"
#include "opentelemetry/nostd/unique_ptr.h"
@ -118,13 +117,12 @@ OpenTelemetryPluginBuilder& OpenTelemetryPluginBuilder::DisableMetrics(
void OpenTelemetryPluginBuilder::BuildAndRegisterGlobal() {
opentelemetry::nostd::shared_ptr<opentelemetry::metrics::MeterProvider>
meter_provider = meter_provider_;
if (meter_provider == nullptr) {
meter_provider = opentelemetry::metrics::Provider::GetMeterProvider();
}
auto meter = meter_provider->GetMeter("grpc");
delete g_otel_plugin_state_;
g_otel_plugin_state_ = new struct OTelPluginState;
g_otel_plugin_state_->meter_provider = std::move(meter_provider);
if (meter_provider == nullptr) {
return;
}
auto meter = meter_provider->GetMeter("grpc");
if (metrics_.contains(OTelClientAttemptStartedInstrumentName())) {
g_otel_plugin_state_->client.attempt.started = meter->CreateUInt64Counter(
std::string(OTelClientAttemptStartedInstrumentName()));
@ -166,6 +164,7 @@ void OpenTelemetryPluginBuilder::BuildAndRegisterGlobal() {
meter->CreateUInt64Histogram(std::string(
OTelServerCallRcvdTotalCompressedMessageSizeInstrumentName()));
}
g_otel_plugin_state_->meter_provider = std::move(meter_provider);
grpc_core::ServerCallTracerFactory::RegisterGlobal(
new grpc::internal::OpenTelemetryServerCallTracerFactory);
grpc_core::CoreConfiguration::RegisterBuilder(

View File

@ -64,23 +64,18 @@ class OTelPluginEnd2EndTest : public ::testing::Test {
protected:
using ::testing::Test::SetUp;
void SetUp(const absl::flat_hash_set<absl::string_view>& metric_names,
bool global_meter_provider = false) {
bool test_no_meter_provider = false) {
// We are resetting the MeterProvider and OpenTelemetry plugin at the start
// of each test to avoid test results from one test carrying over to another
// test. (Some measurements can get arbitrarily delayed.)
auto meter_provider =
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();
reader_.reset(new grpc::testing::MockMetricReader);
meter_provider->AddMetricReader(reader_);
grpc_core::CoreConfiguration::Reset();
grpc::internal::OpenTelemetryPluginBuilder ot_builder;
ot_builder.EnableMetrics(metric_names);
if (global_meter_provider) {
opentelemetry::metrics::Provider::SetMeterProvider(
opentelemetry::nostd::shared_ptr<
opentelemetry::metrics::MeterProvider>(
std::move(meter_provider)));
} else {
if (!test_no_meter_provider) {
auto meter_provider =
std::make_shared<opentelemetry::sdk::metrics::MeterProvider>();
reader_.reset(new grpc::testing::MockMetricReader);
meter_provider->AddMetricReader(reader_);
ot_builder.SetMeterProvider(std::move(meter_provider));
}
ot_builder.BuildAndRegisterGlobal();
@ -395,23 +390,11 @@ TEST_F(OTelPluginEnd2EndTest, ServerCallRcvdTotalCompressedMessageSize) {
EXPECT_EQ(*status_value, "OK");
}
// Make sure that things work with the global meter provider as well
TEST_F(OTelPluginEnd2EndTest, UseGlobalMeterProvider) {
SetUp({grpc::internal::OTelClientAttemptStartedInstrumentName()});
// Make sure that no meter provider results in normal operations.
TEST_F(OTelPluginEnd2EndTest, NoMeterProviderRegistered) {
SetUp({grpc::internal::OTelClientAttemptStartedInstrumentName()},
/*test_no_meter_provider=*/true);
SendRPC();
const char* kMetricName = "grpc.client.attempt.started";
auto data = ReadCurrentMetricsData(
[&](const absl::flat_hash_map<
std::string,
std::vector<opentelemetry::sdk::metrics::PointDataAttributes>>&
data) { return !data.contains(kMetricName); });
ASSERT_EQ(data[kMetricName].size(), 1);
auto point_data = absl::get_if<opentelemetry::sdk::metrics::SumPointData>(
&data[kMetricName][0].point_data);
ASSERT_NE(point_data, nullptr);
auto client_started_value = absl::get_if<int64_t>(&point_data->value_);
ASSERT_NE(client_started_value, nullptr);
ASSERT_EQ(*client_started_value, 1);
}
} // namespace