Skip to content

Commit c14bf11

Browse files
authored
[CONFIGURATION] Declarative resource detection types (#4148)
Add declarative configuration model for resource detection per file configuration spec: * ResourceDetectorConfiguration (abstract base + visitor) * ContainerResourceDetectorConfiguration * HostResourceDetectorConfiguration * ProcessResourceDetectorConfiguration * ServiceResourceDetectorConfiguration * ExtensionResourceDetectorConfiguration (for non-standard detector names, follows ExtensionSamplerConfiguration pattern) * ResourceDetectionConfiguration (wraps attributes IncludeExcludeConfiguration + vector of detector configs) ResourceConfiguration field renamed from "detectors" (old shape: include/exclude lists of detector names) to "detection" (new shape: typed detector list under detection/development YAML key). The parser dispatches on the single map key of each detector entry (container/host/process/service map to typed configs; any other name falls through to Extension*). Tests use the Accept(visitor) pattern so the suite compiles under -fno-rtti (Bazel nortti CI). The sdk_builder Resource path still emits the existing "resource detectors not supported" warning (#3548) since wiring detectors to actual ResourceDetector implementations is out of scope for this PR. Fixes #3916 Signed-off-by: thc1006 <84045975+thc1006@users.noreply.github.com>
1 parent e988943 commit c14bf11

14 files changed

Lines changed: 614 additions & 57 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ Increment the:
9090
* [CI] iwyu and clang-tidy: use install_thirdparty.sh for third-party
9191
[#4136](https://github.com/open-telemetry/opentelemetry-cpp/pull/4136)
9292

93+
* [CONFIGURATION] File configuration: declarative resource detection types
94+
[#4148](https://github.com/open-telemetry/opentelemetry-cpp/pull/4148)
95+
9396
* [SDK] Per-instrument creation time as delta first-interval start_ts
9497
[#4144](https://github.com/open-telemetry/opentelemetry-cpp/pull/4144)
9598

sdk/include/opentelemetry/sdk/configuration/configuration_parser.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "opentelemetry/sdk/configuration/console_log_record_exporter_configuration.h"
2828
#include "opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h"
2929
#include "opentelemetry/sdk/configuration/console_span_exporter_configuration.h"
30+
#include "opentelemetry/sdk/configuration/container_resource_detector_configuration.h"
3031
#include "opentelemetry/sdk/configuration/default_aggregation_configuration.h"
3132
#include "opentelemetry/sdk/configuration/default_histogram_aggregation.h"
3233
#include "opentelemetry/sdk/configuration/distribution_configuration.h"
@@ -42,10 +43,12 @@
4243
#include "opentelemetry/sdk/configuration/extension_metric_producer_configuration.h"
4344
#include "opentelemetry/sdk/configuration/extension_pull_metric_exporter_configuration.h"
4445
#include "opentelemetry/sdk/configuration/extension_push_metric_exporter_configuration.h"
46+
#include "opentelemetry/sdk/configuration/extension_resource_detector_configuration.h"
4547
#include "opentelemetry/sdk/configuration/extension_sampler_configuration.h"
4648
#include "opentelemetry/sdk/configuration/extension_span_exporter_configuration.h"
4749
#include "opentelemetry/sdk/configuration/extension_span_processor_configuration.h"
4850
#include "opentelemetry/sdk/configuration/headers_configuration.h"
51+
#include "opentelemetry/sdk/configuration/host_resource_detector_configuration.h"
4952
#include "opentelemetry/sdk/configuration/include_exclude_configuration.h"
5053
#include "opentelemetry/sdk/configuration/instrument_type.h"
5154
#include "opentelemetry/sdk/configuration/integer_array_attribute_value_configuration.h"
@@ -75,13 +78,17 @@
7578
#include "opentelemetry/sdk/configuration/otlp_http_span_exporter_configuration.h"
7679
#include "opentelemetry/sdk/configuration/parent_based_sampler_configuration.h"
7780
#include "opentelemetry/sdk/configuration/periodic_metric_reader_configuration.h"
81+
#include "opentelemetry/sdk/configuration/process_resource_detector_configuration.h"
7882
#include "opentelemetry/sdk/configuration/prometheus_pull_metric_exporter_configuration.h"
7983
#include "opentelemetry/sdk/configuration/propagator_configuration.h"
8084
#include "opentelemetry/sdk/configuration/pull_metric_exporter_configuration.h"
8185
#include "opentelemetry/sdk/configuration/pull_metric_reader_configuration.h"
8286
#include "opentelemetry/sdk/configuration/push_metric_exporter_configuration.h"
8387
#include "opentelemetry/sdk/configuration/resource_configuration.h"
88+
#include "opentelemetry/sdk/configuration/resource_detection_configuration.h"
89+
#include "opentelemetry/sdk/configuration/resource_detector_configuration.h"
8490
#include "opentelemetry/sdk/configuration/sampler_configuration.h"
91+
#include "opentelemetry/sdk/configuration/service_resource_detector_configuration.h"
8592
#include "opentelemetry/sdk/configuration/severity_number.h"
8693
#include "opentelemetry/sdk/configuration/simple_log_record_processor_configuration.h"
8794
#include "opentelemetry/sdk/configuration/simple_span_processor_configuration.h"
@@ -435,6 +442,28 @@ class ConfigurationParser
435442
std::unique_ptr<AttributesConfiguration> ParseAttributesConfiguration(
436443
const std::unique_ptr<DocumentNode> &node) const;
437444

445+
std::unique_ptr<ContainerResourceDetectorConfiguration>
446+
ParseContainerResourceDetectorConfiguration(const std::unique_ptr<DocumentNode> &node) const;
447+
448+
std::unique_ptr<HostResourceDetectorConfiguration> ParseHostResourceDetectorConfiguration(
449+
const std::unique_ptr<DocumentNode> &node) const;
450+
451+
std::unique_ptr<ProcessResourceDetectorConfiguration> ParseProcessResourceDetectorConfiguration(
452+
const std::unique_ptr<DocumentNode> &node) const;
453+
454+
std::unique_ptr<ServiceResourceDetectorConfiguration> ParseServiceResourceDetectorConfiguration(
455+
const std::unique_ptr<DocumentNode> &node) const;
456+
457+
std::unique_ptr<ExtensionResourceDetectorConfiguration>
458+
ParseResourceDetectorExtensionConfiguration(const std::string &name,
459+
std::unique_ptr<DocumentNode> node) const;
460+
461+
std::unique_ptr<ResourceDetectorConfiguration> ParseResourceDetectorConfiguration(
462+
const std::unique_ptr<DocumentNode> &node) const;
463+
464+
std::unique_ptr<ResourceDetectionConfiguration> ParseResourceDetectionConfiguration(
465+
const std::unique_ptr<DocumentNode> &node) const;
466+
438467
std::unique_ptr<ResourceConfiguration> ParseResourceConfiguration(
439468
const std::unique_ptr<DocumentNode> &node) const;
440469

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/sdk/configuration/resource_detector_configuration.h"
7+
#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h"
8+
#include "opentelemetry/version.h"
9+
10+
OPENTELEMETRY_BEGIN_NAMESPACE
11+
namespace sdk
12+
{
13+
namespace configuration
14+
{
15+
16+
// YAML-SCHEMA: schema/resource.json
17+
// YAML-NODE: container
18+
class ContainerResourceDetectorConfiguration : public ResourceDetectorConfiguration
19+
{
20+
public:
21+
void Accept(ResourceDetectorConfigurationVisitor *visitor) const override
22+
{
23+
visitor->VisitContainer(this);
24+
}
25+
};
26+
27+
} // namespace configuration
28+
} // namespace sdk
29+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <cstddef>
7+
#include <memory>
8+
#include <string>
9+
10+
#include "opentelemetry/sdk/configuration/document_node.h"
11+
#include "opentelemetry/sdk/configuration/resource_detector_configuration.h"
12+
#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h"
13+
#include "opentelemetry/version.h"
14+
15+
OPENTELEMETRY_BEGIN_NAMESPACE
16+
namespace sdk
17+
{
18+
namespace configuration
19+
{
20+
21+
class ExtensionResourceDetectorConfiguration : public ResourceDetectorConfiguration
22+
{
23+
public:
24+
void Accept(ResourceDetectorConfigurationVisitor *visitor) const override
25+
{
26+
visitor->VisitExtension(this);
27+
}
28+
29+
std::string name;
30+
std::unique_ptr<DocumentNode> node;
31+
std::size_t depth{0};
32+
};
33+
34+
} // namespace configuration
35+
} // namespace sdk
36+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/sdk/configuration/resource_detector_configuration.h"
7+
#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h"
8+
#include "opentelemetry/version.h"
9+
10+
OPENTELEMETRY_BEGIN_NAMESPACE
11+
namespace sdk
12+
{
13+
namespace configuration
14+
{
15+
16+
// YAML-SCHEMA: schema/resource.json
17+
// YAML-NODE: host
18+
class HostResourceDetectorConfiguration : public ResourceDetectorConfiguration
19+
{
20+
public:
21+
void Accept(ResourceDetectorConfigurationVisitor *visitor) const override
22+
{
23+
visitor->VisitHost(this);
24+
}
25+
};
26+
27+
} // namespace configuration
28+
} // namespace sdk
29+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/sdk/configuration/resource_detector_configuration.h"
7+
#include "opentelemetry/sdk/configuration/resource_detector_configuration_visitor.h"
8+
#include "opentelemetry/version.h"
9+
10+
OPENTELEMETRY_BEGIN_NAMESPACE
11+
namespace sdk
12+
{
13+
namespace configuration
14+
{
15+
16+
// YAML-SCHEMA: schema/resource.json
17+
// YAML-NODE: process
18+
class ProcessResourceDetectorConfiguration : public ResourceDetectorConfiguration
19+
{
20+
public:
21+
void Accept(ResourceDetectorConfigurationVisitor *visitor) const override
22+
{
23+
visitor->VisitProcess(this);
24+
}
25+
};
26+
27+
} // namespace configuration
28+
} // namespace sdk
29+
OPENTELEMETRY_END_NAMESPACE

sdk/include/opentelemetry/sdk/configuration/resource_configuration.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <string>
88

99
#include "opentelemetry/sdk/configuration/attributes_configuration.h"
10-
#include "opentelemetry/sdk/configuration/include_exclude_configuration.h"
10+
#include "opentelemetry/sdk/configuration/resource_detection_configuration.h"
1111
#include "opentelemetry/version.h"
1212

1313
OPENTELEMETRY_BEGIN_NAMESPACE
@@ -22,7 +22,7 @@ class ResourceConfiguration
2222
{
2323
public:
2424
std::unique_ptr<AttributesConfiguration> attributes;
25-
std::unique_ptr<IncludeExcludeConfiguration> detectors;
25+
std::unique_ptr<ResourceDetectionConfiguration> detection;
2626
std::string schema_url;
2727
std::string attributes_list;
2828
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include <memory>
7+
#include <vector>
8+
9+
#include "opentelemetry/sdk/configuration/include_exclude_configuration.h"
10+
#include "opentelemetry/sdk/configuration/resource_detector_configuration.h"
11+
#include "opentelemetry/version.h"
12+
13+
OPENTELEMETRY_BEGIN_NAMESPACE
14+
namespace sdk
15+
{
16+
namespace configuration
17+
{
18+
19+
// YAML-SCHEMA: schema/resource.json
20+
// YAML-NODE: ExperimentalResourceDetection
21+
class ResourceDetectionConfiguration
22+
{
23+
public:
24+
std::unique_ptr<IncludeExcludeConfiguration> attributes;
25+
std::vector<std::unique_ptr<ResourceDetectorConfiguration>> detectors;
26+
};
27+
28+
} // namespace configuration
29+
} // namespace sdk
30+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/version.h"
7+
8+
OPENTELEMETRY_BEGIN_NAMESPACE
9+
namespace sdk
10+
{
11+
namespace configuration
12+
{
13+
14+
class ResourceDetectorConfigurationVisitor;
15+
16+
// YAML-SCHEMA: schema/resource.json
17+
// YAML-NODE: ExperimentalResourceDetector
18+
class ResourceDetectorConfiguration
19+
{
20+
public:
21+
ResourceDetectorConfiguration() = default;
22+
ResourceDetectorConfiguration(ResourceDetectorConfiguration &&) = default;
23+
ResourceDetectorConfiguration(const ResourceDetectorConfiguration &) = default;
24+
ResourceDetectorConfiguration &operator=(ResourceDetectorConfiguration &&) = default;
25+
ResourceDetectorConfiguration &operator=(const ResourceDetectorConfiguration &other) = default;
26+
virtual ~ResourceDetectorConfiguration() = default;
27+
28+
virtual void Accept(ResourceDetectorConfigurationVisitor *visitor) const = 0;
29+
};
30+
31+
} // namespace configuration
32+
} // namespace sdk
33+
OPENTELEMETRY_END_NAMESPACE
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
#pragma once
5+
6+
#include "opentelemetry/version.h"
7+
8+
OPENTELEMETRY_BEGIN_NAMESPACE
9+
namespace sdk
10+
{
11+
namespace configuration
12+
{
13+
14+
class ContainerResourceDetectorConfiguration;
15+
class HostResourceDetectorConfiguration;
16+
class ProcessResourceDetectorConfiguration;
17+
class ServiceResourceDetectorConfiguration;
18+
class ExtensionResourceDetectorConfiguration;
19+
20+
class ResourceDetectorConfigurationVisitor
21+
{
22+
public:
23+
ResourceDetectorConfigurationVisitor() = default;
24+
ResourceDetectorConfigurationVisitor(ResourceDetectorConfigurationVisitor &&) = default;
25+
ResourceDetectorConfigurationVisitor(const ResourceDetectorConfigurationVisitor &) = default;
26+
ResourceDetectorConfigurationVisitor &operator=(ResourceDetectorConfigurationVisitor &&) =
27+
default;
28+
ResourceDetectorConfigurationVisitor &operator=(
29+
const ResourceDetectorConfigurationVisitor &other) = default;
30+
virtual ~ResourceDetectorConfigurationVisitor() = default;
31+
32+
virtual void VisitContainer(const ContainerResourceDetectorConfiguration *model) = 0;
33+
virtual void VisitHost(const HostResourceDetectorConfiguration *model) = 0;
34+
virtual void VisitProcess(const ProcessResourceDetectorConfiguration *model) = 0;
35+
virtual void VisitService(const ServiceResourceDetectorConfiguration *model) = 0;
36+
virtual void VisitExtension(const ExtensionResourceDetectorConfiguration *model) = 0;
37+
};
38+
39+
} // namespace configuration
40+
} // namespace sdk
41+
OPENTELEMETRY_END_NAMESPACE

0 commit comments

Comments
 (0)