From 00be6ee0394809e5ff78cfe6dfedebe10736cf5f Mon Sep 17 00:00:00 2001 From: Willie Abrams Date: Tue, 5 Mar 2024 09:42:44 -0600 Subject: [PATCH] support for OTEL_SERVICE_NAME OTEL_SERVICE_NAME overrides OTEL_RESOURCE_ATTRIBUTES when it is defined. --- sdk/src/resource/resource_detector.cc | 36 ++++++++++++++++++--------- sdk/test/resource/resource_test.cc | 24 ++++++++++++++++++ 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/sdk/src/resource/resource_detector.cc b/sdk/src/resource/resource_detector.cc index 82e47a71ad..6d74e5d3bb 100644 --- a/sdk/src/resource/resource_detector.cc +++ b/sdk/src/resource/resource_detector.cc @@ -15,28 +15,40 @@ namespace resource { const char *OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES"; +const char *OTEL_SERVICE_NAME = "OTEL_SERVICE_NAME"; Resource OTELResourceDetector::Detect() noexcept { - std::string attributes_str; - bool exists; + std::string attributes_str, service_name; - exists = opentelemetry::sdk::common::GetStringEnvironmentVariable(OTEL_RESOURCE_ATTRIBUTES, - attributes_str); - if (!exists) + bool attributes_exists = opentelemetry::sdk::common::GetStringEnvironmentVariable(OTEL_RESOURCE_ATTRIBUTES, attributes_str); + bool service_name_exists = opentelemetry::sdk::common::GetStringEnvironmentVariable(OTEL_SERVICE_NAME, service_name); + + if (!attributes_exists && !service_name_exists) { return Resource(); } + ResourceAttributes attributes; - std::istringstream iss(attributes_str); - std::string token; - while (std::getline(iss, token, ',')) + + if (attributes_exists) { - size_t pos = token.find('='); - std::string key = token.substr(0, pos); - std::string value = token.substr(pos + 1); - attributes[key] = value; + std::istringstream iss(attributes_str); + std::string token; + while (std::getline(iss, token, ',')) + { + size_t pos = token.find('='); + std::string key = token.substr(0, pos); + std::string value = token.substr(pos + 1); + attributes[key] = value; + } } + + if (service_name_exists) + { + attributes["service.name"] = service_name; + } + return Resource(attributes); } diff --git a/sdk/test/resource/resource_test.cc b/sdk/test/resource/resource_test.cc index 828a9ac355..e6b56cae43 100644 --- a/sdk/test/resource/resource_test.cc +++ b/sdk/test/resource/resource_test.cc @@ -220,6 +220,30 @@ TEST(ResourceTest, OtelResourceDetector) unsetenv("OTEL_RESOURCE_ATTRIBUTES"); } +TEST(ResourceTest, OtelResourceDetectorServiceNameOverride) +{ + std::map expected_attributes = {{"service.name", "new_name"}}; + + setenv("OTEL_RESOURCE_ATTRIBUTES", "service.name=old_name", 1); + setenv("OTEL_SERVICE_NAME", "new_name", 1); + + OTELResourceDetector detector; + auto resource = detector.Detect(); + auto received_attributes = resource.GetAttributes(); + for (auto &e : received_attributes) + { + EXPECT_TRUE(expected_attributes.find(e.first) != expected_attributes.end()); + if (expected_attributes.find(e.first) != expected_attributes.end()) + { + EXPECT_EQ(expected_attributes.find(e.first)->second, nostd::get(e.second)); + } + } + EXPECT_EQ(received_attributes.size(), expected_attributes.size()); + + unsetenv("OTEL_SERVICE_NAME"); + unsetenv("OTEL_RESOURCE_ATTRIBUTES"); +} + TEST(ResourceTest, OtelResourceDetectorEmptyEnv) { std::map expected_attributes = {};