From 1a14a9b5288f54700e5a9431df0149b3d06b55fc Mon Sep 17 00:00:00 2001 From: Rishitha Kalicheti Date: Mon, 25 May 2026 22:17:29 -0400 Subject: [PATCH] adding file config - resource detectors Signed-off-by: Rishitha Kalicheti --- .../sdk/configuration/configuration_parser.h | 8 ++ ...ontainer_resource_detector_configuration.h | 29 +++++++ .../extension_resource_detector_builder.h | 36 +++++++++ ...xtension_resource_detector_configuration.h | 34 +++++++++ .../sdk/configuration/registry.h | 10 +++ .../configuration/resource_configuration.h | 4 +- .../resource_detection_configuration.h | 30 ++++++++ .../resource_detector_configuration.h | 33 ++++++++ .../resource_detector_configuration_visitor.h | 29 +++++++ .../sdk/configuration/sdk_builder.h | 6 ++ sdk/src/configuration/configuration_parser.cc | 62 +++++++++++++++ sdk/src/configuration/registry.cc | 21 ++++++ sdk/src/configuration/sdk_builder.cc | 75 +++++++++++++++++++ 13 files changed, 376 insertions(+), 1 deletion(-) create mode 100644 sdk/include/opentelemetry/sdk/configuration/container_resource_detector_configuration.h create mode 100644 sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_builder.h create mode 100644 sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_configuration.h create mode 100644 sdk/include/opentelemetry/sdk/configuration/resource_detection_configuration.h create mode 100644 sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration.h create mode 100644 sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h diff --git a/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h b/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h index 91b6bff5eb..0a917409d3 100644 --- a/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h +++ b/sdk/include/opentelemetry/sdk/configuration/configuration_parser.h @@ -81,6 +81,8 @@ #include "opentelemetry/sdk/configuration/pull_metric_reader_configuration.h" #include "opentelemetry/sdk/configuration/push_metric_exporter_configuration.h" #include "opentelemetry/sdk/configuration/resource_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detection_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration.h" #include "opentelemetry/sdk/configuration/sampler_configuration.h" #include "opentelemetry/sdk/configuration/severity_number.h" #include "opentelemetry/sdk/configuration/simple_log_record_processor_configuration.h" @@ -438,6 +440,12 @@ class ConfigurationParser std::unique_ptr ParseResourceConfiguration( const std::unique_ptr &node) const; + std::unique_ptr ParseResourceDetectionConfiguration( + const std::unique_ptr &node) const; + + std::unique_ptr ParseResourceDetectorConfiguration( + const std::unique_ptr &node) const; + std::unique_ptr ParseDistributionConfiguration( const std::unique_ptr &node) const; diff --git a/sdk/include/opentelemetry/sdk/configuration/container_resource_detector_configuration.h b/sdk/include/opentelemetry/sdk/configuration/container_resource_detector_configuration.h new file mode 100644 index 0000000000..f816246579 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/configuration/container_resource_detector_configuration.h @@ -0,0 +1,29 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/sdk/configuration/resource_detector_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h" +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace configuration +{ + +// YAML-SCHEMA: schema/resource.yaml +// YAML-NODE: ExperimentalContainerResourceDetector +class ContainerResourceDetectorConfiguration : public ResourceDetectorConfiguration +{ +public: + void Accept(ResourceDetectorConfigurationVisitor *visitor) const override + { + visitor->VisitContainer(this); + } +}; + +} // namespace configuration +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_builder.h b/sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_builder.h new file mode 100644 index 0000000000..4dd879c53b --- /dev/null +++ b/sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_builder.h @@ -0,0 +1,36 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include + +#include "opentelemetry/sdk/configuration/extension_resource_detector_configuration.h" +#include "opentelemetry/sdk/resource/resource_detector.h" +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace configuration +{ + +class ExtensionResourceDetectorBuilder +{ +public: + ExtensionResourceDetectorBuilder() = default; + ExtensionResourceDetectorBuilder(ExtensionResourceDetectorBuilder &&) = default; + ExtensionResourceDetectorBuilder(const ExtensionResourceDetectorBuilder &) = default; + ExtensionResourceDetectorBuilder &operator=(ExtensionResourceDetectorBuilder &&) = default; + ExtensionResourceDetectorBuilder &operator=(const ExtensionResourceDetectorBuilder &other) = + default; + virtual ~ExtensionResourceDetectorBuilder() = default; + + virtual std::unique_ptr Build( + const opentelemetry::sdk::configuration::ExtensionResourceDetectorConfiguration *model) + const = 0; +}; + +} // namespace configuration +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_configuration.h b/sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_configuration.h new file mode 100644 index 0000000000..8258a1e8d4 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/configuration/extension_resource_detector_configuration.h @@ -0,0 +1,34 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include + +#include "opentelemetry/sdk/configuration/document_node.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h" +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace configuration +{ + +class ExtensionResourceDetectorConfiguration : public ResourceDetectorConfiguration +{ +public: + void Accept(ResourceDetectorConfigurationVisitor *visitor) const override + { + visitor->VisitExtension(this); + } + + std::string name; + std::unique_ptr node; +}; + +} // namespace configuration +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/configuration/registry.h b/sdk/include/opentelemetry/sdk/configuration/registry.h index 955c218b0d..82639f73cc 100644 --- a/sdk/include/opentelemetry/sdk/configuration/registry.h +++ b/sdk/include/opentelemetry/sdk/configuration/registry.h @@ -11,6 +11,7 @@ #include "opentelemetry/sdk/configuration/console_span_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_log_record_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_log_record_processor_builder.h" +#include "opentelemetry/sdk/configuration/extension_resource_detector_builder.h" #include "opentelemetry/sdk/configuration/extension_pull_metric_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_push_metric_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_sampler_builder.h" @@ -235,6 +236,13 @@ class Registry const std::string &name, std::unique_ptr &&builder); + const ExtensionResourceDetectorBuilder *GetExtensionResourceDetectorBuilder( + const std::string &name) const; + + void SetExtensionResourceDetectorBuilder( + const std::string &name, + std::unique_ptr &&builder); + private: std::unique_ptr otlp_http_span_builder_; std::unique_ptr otlp_grpc_span_builder_; @@ -264,6 +272,8 @@ class Registry log_record_exporter_builders_; std::map> log_record_processor_builders_; + std::map> + resource_detector_builders_; }; } // namespace configuration diff --git a/sdk/include/opentelemetry/sdk/configuration/resource_configuration.h b/sdk/include/opentelemetry/sdk/configuration/resource_configuration.h index 6d29b10e34..338cbd26d8 100644 --- a/sdk/include/opentelemetry/sdk/configuration/resource_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/resource_configuration.h @@ -8,6 +8,7 @@ #include "opentelemetry/sdk/configuration/attributes_configuration.h" #include "opentelemetry/sdk/configuration/include_exclude_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detection_configuration.h" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -16,13 +17,14 @@ namespace sdk namespace configuration { -// YAML-SCHEMA: schema/resource.json +// YAML-SCHEMA: schema/resource.yaml // YAML-NODE: Resource class ResourceConfiguration { public: std::unique_ptr attributes; std::unique_ptr detectors; + std::unique_ptr detection; std::string schema_url; std::string attributes_list; }; diff --git a/sdk/include/opentelemetry/sdk/configuration/resource_detection_configuration.h b/sdk/include/opentelemetry/sdk/configuration/resource_detection_configuration.h new file mode 100644 index 0000000000..8a77869fc1 --- /dev/null +++ b/sdk/include/opentelemetry/sdk/configuration/resource_detection_configuration.h @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include + +#include "opentelemetry/sdk/configuration/include_exclude_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration.h" +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace configuration +{ + +// YAML-SCHEMA: schema/resource.yaml +// YAML-NODE: ExperimentalResourceDetection +class ResourceDetectionConfiguration +{ +public: + std::unique_ptr attributes; + std::vector> detectors; +}; + +} // namespace configuration +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration.h b/sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration.h new file mode 100644 index 0000000000..6721dc8a8f --- /dev/null +++ b/sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration.h @@ -0,0 +1,33 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace configuration +{ + +class ResourceDetectorConfigurationVisitor; + +// YAML-SCHEMA: schema/resource.yaml +// YAML-NODE: ExperimentalResourceDetector +class ResourceDetectorConfiguration +{ +public: + ResourceDetectorConfiguration() = default; + ResourceDetectorConfiguration(ResourceDetectorConfiguration &&) = default; + ResourceDetectorConfiguration(const ResourceDetectorConfiguration &) = default; + ResourceDetectorConfiguration &operator=(ResourceDetectorConfiguration &&) = default; + ResourceDetectorConfiguration &operator=(const ResourceDetectorConfiguration &other) = default; + virtual ~ResourceDetectorConfiguration() = default; + + virtual void Accept(ResourceDetectorConfigurationVisitor *visitor) const = 0; +}; + +} // namespace configuration +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h b/sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h new file mode 100644 index 0000000000..427b20259d --- /dev/null +++ b/sdk/include/opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h @@ -0,0 +1,29 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include "opentelemetry/version.h" + +OPENTELEMETRY_BEGIN_NAMESPACE +namespace sdk +{ +namespace configuration +{ + +class ContainerResourceDetectorConfiguration; +class ExtensionResourceDetectorConfiguration; + +class ResourceDetectorConfigurationVisitor +{ +public: + ResourceDetectorConfigurationVisitor() = default; + virtual ~ResourceDetectorConfigurationVisitor() = default; + + virtual void VisitContainer(const ContainerResourceDetectorConfiguration *model) = 0; + virtual void VisitExtension(const ExtensionResourceDetectorConfiguration *model) = 0; +}; + +} // namespace configuration +} // namespace sdk +OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/include/opentelemetry/sdk/configuration/sdk_builder.h b/sdk/include/opentelemetry/sdk/configuration/sdk_builder.h index 6897c54c9f..7c936fd520 100644 --- a/sdk/include/opentelemetry/sdk/configuration/sdk_builder.h +++ b/sdk/include/opentelemetry/sdk/configuration/sdk_builder.h @@ -22,6 +22,7 @@ #include "opentelemetry/sdk/configuration/extension_push_metric_exporter_configuration.h" #include "opentelemetry/sdk/configuration/extension_span_exporter_configuration.h" #include "opentelemetry/sdk/configuration/extension_span_processor_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detection_configuration.h" #include "opentelemetry/sdk/configuration/integer_array_attribute_value_configuration.h" #include "opentelemetry/sdk/configuration/integer_attribute_value_configuration.h" #include "opentelemetry/sdk/configuration/logger_configurator_configuration.h" @@ -274,6 +275,11 @@ class SdkBuilder const std::unique_ptr &opt_model) const; + void ApplyResourceDetection( + opentelemetry::sdk::resource::Resource &resource, + const std::unique_ptr + &detection) const; + void SetLogLevel(opentelemetry::sdk::common::internal_log::LogLevel &sdk_log_level, opentelemetry::sdk::configuration::SeverityNumber model_log_level) const; diff --git a/sdk/src/configuration/configuration_parser.cc b/sdk/src/configuration/configuration_parser.cc index 7b3a6b93fe..3c0288ea01 100644 --- a/sdk/src/configuration/configuration_parser.cc +++ b/sdk/src/configuration/configuration_parser.cc @@ -100,6 +100,10 @@ #include "opentelemetry/sdk/configuration/pull_metric_reader_configuration.h" #include "opentelemetry/sdk/configuration/push_metric_exporter_configuration.h" #include "opentelemetry/sdk/configuration/resource_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detection_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration.h" +#include "opentelemetry/sdk/configuration/container_resource_detector_configuration.h" +#include "opentelemetry/sdk/configuration/extension_resource_detector_configuration.h" #include "opentelemetry/sdk/configuration/sampler_configuration.h" #include "opentelemetry/sdk/configuration/severity_number.h" #include "opentelemetry/sdk/configuration/simple_log_record_processor_configuration.h" @@ -2519,9 +2523,67 @@ std::unique_ptr ConfigurationParser::ParseResourceConfigu model->detectors = ParseIncludeExcludeConfiguration(child); } + child = node->GetChildNode("detection/development"); + if (child) + { + model->detection = ParseResourceDetectionConfiguration(child); + } + return model; } +std::unique_ptr +ConfigurationParser::ParseResourceDetectionConfiguration( + const std::unique_ptr &node) const +{ + auto model = std::make_unique(); + std::unique_ptr child; + + child = node->GetChildNode("attributes"); + if (child) + { + model->attributes = ParseIncludeExcludeConfiguration(child); + } + + child = node->GetChildNode("detectors"); + if (child) + { + for (auto it = child->begin(); it != child->end(); ++it) + { + std::unique_ptr detector_node(*it); + auto detector = ParseResourceDetectorConfiguration(detector_node); + model->detectors.push_back(std::move(detector)); + } + } + + return model; +} + +std::unique_ptr +ConfigurationParser::ParseResourceDetectorConfiguration( + const std::unique_ptr &node) const +{ + for (auto it = node->begin_properties(); it != node->end_properties(); ++it) + { + std::string name = it.Name(); + + if (name == "container") + { + return std::make_unique(); + } + else + { + auto extension = std::make_unique(); + extension->name = name; + extension->node = it.Value(); + return extension; + } + } + + std::string message("Illegal resource detector, 0 entries"); + throw InvalidSchemaException(node->Location(), message); +} + std::unique_ptr ConfigurationParser::ParseDistributionConfiguration( const std::unique_ptr &node) const { diff --git a/sdk/src/configuration/registry.cc b/sdk/src/configuration/registry.cc index 88807ac8a6..740059c8a5 100644 --- a/sdk/src/configuration/registry.cc +++ b/sdk/src/configuration/registry.cc @@ -9,6 +9,7 @@ #include "opentelemetry/baggage/propagation/baggage_propagator.h" #include "opentelemetry/sdk/configuration/extension_log_record_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_log_record_processor_builder.h" +#include "opentelemetry/sdk/configuration/extension_resource_detector_builder.h" #include "opentelemetry/sdk/configuration/extension_pull_metric_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_push_metric_exporter_builder.h" #include "opentelemetry/sdk/configuration/extension_sampler_builder.h" @@ -242,6 +243,26 @@ void Registry::SetExtensionLogRecordProcessorBuilder( log_record_processor_builders_.insert({name, std::move(builder)}); } +const ExtensionResourceDetectorBuilder *Registry::GetExtensionResourceDetectorBuilder( + const std::string &name) const +{ + ExtensionResourceDetectorBuilder *builder = nullptr; + auto search = resource_detector_builders_.find(name); + if (search != resource_detector_builders_.end()) + { + builder = search->second.get(); + } + return builder; +} + +void Registry::SetExtensionResourceDetectorBuilder( + const std::string &name, + std::unique_ptr &&builder) +{ + resource_detector_builders_.erase(name); + resource_detector_builders_.insert({name, std::move(builder)}); +} + } // namespace configuration } // namespace sdk OPENTELEMETRY_END_NAMESPACE diff --git a/sdk/src/configuration/sdk_builder.cc b/sdk/src/configuration/sdk_builder.cc index b0986ed090..f1e7bf49e0 100644 --- a/sdk/src/configuration/sdk_builder.cc +++ b/sdk/src/configuration/sdk_builder.cc @@ -106,6 +106,12 @@ #include "opentelemetry/sdk/configuration/push_metric_exporter_configuration_visitor.h" #include "opentelemetry/sdk/configuration/registry.h" #include "opentelemetry/sdk/configuration/resource_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detection_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration.h" +#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h" +#include "opentelemetry/sdk/configuration/container_resource_detector_configuration.h" +#include "opentelemetry/sdk/configuration/extension_resource_detector_builder.h" +#include "opentelemetry/sdk/configuration/extension_resource_detector_configuration.h" #include "opentelemetry/sdk/configuration/sampler_configuration.h" #include "opentelemetry/sdk/configuration/sampler_configuration_visitor.h" #include "opentelemetry/sdk/configuration/sdk_builder.h" @@ -158,6 +164,7 @@ #include "opentelemetry/sdk/metrics/view/view_registry.h" #include "opentelemetry/sdk/metrics/view/view_registry_factory.h" #include "opentelemetry/sdk/resource/resource.h" +#include "opentelemetry/sdk/resource/resource_detector.h" #include "opentelemetry/sdk/trace/batch_span_processor_factory.h" #include "opentelemetry/sdk/trace/batch_span_processor_options.h" #include "opentelemetry/sdk/trace/exporter.h" @@ -1929,6 +1936,69 @@ void SdkBuilder::SetResourceAttribute( model->Accept(&setter); } +class ResourceDetectorCreator + : public opentelemetry::sdk::configuration::ResourceDetectorConfigurationVisitor +{ +public: + ResourceDetectorCreator(std::shared_ptr registry) : registry_(std::move(registry)) {} + + void VisitContainer(const ContainerResourceDetectorConfiguration * /* model */) override + { + OTEL_INTERNAL_LOG_DEBUG("CreateResourceDetector() container"); + // Container detector is in resource_detectors library, available when linked. + // Uses OTELResourceDetector as a fallback placeholder. + detected_resource_ = opentelemetry::sdk::resource::OTELResourceDetector().Detect(); + OTEL_INTERNAL_LOG_WARN( + "Container resource detector not available, " + "link with opentelemetry_resource_detectors for full support"); + } + + void VisitExtension(const ExtensionResourceDetectorConfiguration *model) override + { + std::string name = model->name; + OTEL_INTERNAL_LOG_DEBUG("CreateResourceDetector() extension: " << name); + + const ExtensionResourceDetectorBuilder *ext_builder = + registry_->GetExtensionResourceDetectorBuilder(name); + + if (ext_builder != nullptr) + { + auto detector = ext_builder->Build(model); + if (detector) + { + detected_resource_ = detector->Detect(); + return; + } + } + + OTEL_INTERNAL_LOG_WARN("CreateResourceDetector() no builder for extension: " << name); + } + + opentelemetry::sdk::resource::Resource GetDetectedResource() + { + return std::move(detected_resource_); + } + +private: + std::shared_ptr registry_; + opentelemetry::sdk::resource::Resource detected_resource_ = + opentelemetry::sdk::resource::Resource::GetEmpty(); +}; + +void SdkBuilder::ApplyResourceDetection( + opentelemetry::sdk::resource::Resource &resource, + const std::unique_ptr + &detection) const +{ + for (const auto &detector_config : detection->detectors) + { + ResourceDetectorCreator creator(registry_); + detector_config->Accept(&creator); + auto detected = creator.GetDetectedResource(); + resource = resource.Merge(detected); + } +} + void SdkBuilder::SetResource( opentelemetry::sdk::resource::Resource &resource, const std::unique_ptr &opt_model) @@ -1977,6 +2047,11 @@ void SdkBuilder::SetResource( OTEL_INTERNAL_LOG_WARN("resource detectors not supported, ignoring"); } + if (opt_model->detection != nullptr) + { + ApplyResourceDetection(resource, opt_model->detection); + } + auto sdk_resource = opentelemetry::sdk::resource::Resource::Create(sdk_attributes, opt_model->schema_url); resource = resource.Merge(sdk_resource);