Skip to content

Commit 83cddd9

Browse files
authored
declarative config 0.3+ support (#1452)
This brings declarative config support up to 0.3 plus some of the unreleased 0.4 features: * porting code from Nevay/otel-sdk-configuration * support 0.4 metric reader config * allow empty keys since open-telemetry/opentelemetry-specification#4269 empty keys are allows, and NULL is no longer equivalent to unset * update config example to remove empty objects * remove moved component providers from composer.json * add ComponentProviderRegistry::componentMap for instrumentation configuration
1 parent 4b575e6 commit 83cddd9

File tree

105 files changed

+1697
-757
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+1697
-757
lines changed

composer.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,13 @@
155155
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\HttpConfigProvider",
156156
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\PeerConfigProvider",
157157

158-
"OpenTelemetry\\Example\\ExampleConfigProvider"
158+
"OpenTelemetry\\Example\\ExampleConfigProvider",
159+
160+
"OpenTelemetry\\Tests\\Integration\\Config\\ComponentProvider\\Metrics\\AggregationResolverExplicitBucketHistogram",
161+
"OpenTelemetry\\Tests\\Integration\\Config\\ComponentProvider\\Metrics\\MetricExporterPrometheus",
162+
"OpenTelemetry\\Tests\\Integration\\Config\\ComponentProvider\\Metrics\\MetricReaderPull",
163+
"OpenTelemetry\\Tests\\Integration\\Config\\ComponentProvider\\Propagator\\TextMapPropagatorXray",
164+
"OpenTelemetry\\Tests\\Integration\\Config\\ComponentProvider\\Propagator\\TextMapPropagatorOtTrace"
159165
],
160166
"OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\HookManagerInterface": [
161167
"OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\ExtensionHookManager"
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
file_format: '0.3'
22

3+
propagator:
4+
composite: []
5+
36
tracer_provider:
47
processors:
58
- simple:
69
exporter:
7-
console: {}
10+
console:
11+
sampler:
12+
always_on:
813

914
instrumentation:
15+
general:
1016
php:
1117
example_instrumentation:
1218
span_name: ${EXAMPLE_INSTRUMENTATION_SPAN_NAME:-example span}

examples/load_config.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ tracer_provider:
1818
sampler:
1919
parent_based:
2020
root:
21-
always_on: {}
21+
always_on:
2222
processors:
2323
- simple:
2424
exporter:
25-
console: {}
25+
console:
2626
- batch:
2727
exporter:
2828
otlp: *otlp-exporter
2929
meter_provider:
3030
readers:
3131
- periodic:
3232
exporter:
33-
console: {}
33+
console:
3434
- periodic:
3535
exporter:
3636
otlp:
@@ -40,7 +40,7 @@ logger_provider:
4040
processors:
4141
- simple:
4242
exporter:
43-
console: {}
43+
console:
4444
- batch:
4545
exporter:
4646
otlp: *otlp-exporter

examples/src/ExampleConfigProvider.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use OpenTelemetry\Config\SDK\Configuration\Context;
1111
use OpenTelemetry\Config\SDK\Configuration\Validation;
1212
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
13+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
1314

1415
/**
1516
* @implements ComponentProvider<InstrumentationConfiguration>
@@ -34,16 +35,16 @@ public function createPlugin(array $properties, Context $context): Instrumentati
3435
/**
3536
* @psalm-suppress UndefinedInterfaceMethod,PossiblyNullReference
3637
*/
37-
public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition
38+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
3839
{
39-
$root = new ArrayNodeDefinition('example_instrumentation');
40-
$root
40+
$node = $builder->arrayNode('example_instrumentation');
41+
$node
4142
->children()
4243
->scalarNode('span_name')->isRequired()->validate()->always(Validation::ensureString())->end()->end()
4344
->end()
4445
->canBeDisabled()
4546
;
4647

47-
return $root;
48+
return $node;
4849
}
4950
}

phpstan.neon.dist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ parameters:
3838
message: "#Call to an undefined method Symfony\\\\Component\\\\Config\\\\Definition\\\\Builder\\\\NodeParentInterface::.*#"
3939
paths:
4040
- src/Config/SDK
41+
- tests/Integration/Config
4142
-
4243
message: "#Cannot call method .* on null#"
4344
paths:

psalm.xml.dist

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,48 @@
3737
<directory name="./examples"/>
3838
</errorLevel>
3939
</ArgumentTypeCoercion>
40+
<InvalidArgument>
41+
<errorLevel type="suppress">
42+
<directory name="src/Config/SDK/Configuration/Internal"/>
43+
</errorLevel>
44+
</InvalidArgument>
4045
<UndefinedInterfaceMethod>
4146
<errorLevel type="suppress">
4247
<directory name="src/Config/SDK/ComponentProvider"/>
48+
<directory name="tests/Integration/Config/ComponentProvider"/>
4349
</errorLevel>
4450
</UndefinedInterfaceMethod>
51+
<PossiblyInvalidArgument>
52+
<errorLevel type="suppress">
53+
<directory name="src/Config/SDK/Configuration"/>
54+
</errorLevel>
55+
</PossiblyInvalidArgument>
4556
<PossiblyNullReference>
4657
<errorLevel type="suppress">
4758
<directory name="src/Config/SDK/ComponentProvider"/>
59+
<directory name="tests/Integration/Config/ComponentProvider"/>
4860
</errorLevel>
4961
</PossiblyNullReference>
5062
<MoreSpecificImplementedParamType>
5163
<errorLevel type="suppress">
5264
<directory name="src/Config/SDK/ComponentProvider"/>
65+
<directory name="tests/Integration/Config/ComponentProvider"/>
5366
</errorLevel>
5467
</MoreSpecificImplementedParamType>
5568
<InvalidDocblock>
5669
<errorLevel type="suppress">
5770
<directory name="src/Config/SDK/ComponentProvider"/>
5871
</errorLevel>
5972
</InvalidDocblock>
73+
<NonInvariantDocblockPropertyType>
74+
<errorLevel type="suppress">
75+
<directory name="src/Config/SDK/Configuration/Internal"/>
76+
</errorLevel>
77+
</NonInvariantDocblockPropertyType>
78+
<NonInvariantPropertyType>
79+
<errorLevel type="suppress">
80+
<directory name="src/Config/SDK/Configuration/Internal"/>
81+
</errorLevel>
82+
</NonInvariantPropertyType>
6083
</issueHandlers>
6184
</psalm>

src/Config/SDK/ComponentProvider/Instrumentation/General/HttpConfigProvider.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use OpenTelemetry\Config\SDK\Configuration\ComponentProviderRegistry;
1111
use OpenTelemetry\Config\SDK\Configuration\Context;
1212
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
13+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
1314

1415
/**
1516
* @implements ComponentProvider<GeneralInstrumentationConfiguration>
@@ -21,22 +22,22 @@ public function createPlugin(array $properties, Context $context): GeneralInstru
2122
return new HttpConfig($properties);
2223
}
2324

24-
public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition
25+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
2526
{
26-
$node = new ArrayNodeDefinition('http');
27+
$node = $builder->arrayNode('http');
2728
$node
2829
->children()
29-
->append($this->capturedHeaders('client'))
30-
->append($this->capturedHeaders('server'))
30+
->append($this->capturedHeaders('client', $builder))
31+
->append($this->capturedHeaders('server', $builder))
3132
->end()
3233
;
3334

3435
return $node;
3536
}
3637

37-
private function capturedHeaders(string $name): ArrayNodeDefinition
38+
private function capturedHeaders(string $name, NodeBuilder $builder): ArrayNodeDefinition
3839
{
39-
$node = new ArrayNodeDefinition($name);
40+
$node = $builder->arrayNode($name);
4041
$node
4142
->children()
4243
->arrayNode('request_captured_headers')

src/Config/SDK/ComponentProvider/Instrumentation/General/PeerConfigProvider.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use OpenTelemetry\Config\SDK\Configuration\ComponentProviderRegistry;
1111
use OpenTelemetry\Config\SDK\Configuration\Context;
1212
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
13+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
1314

1415
/**
1516
* @implements ComponentProvider<GeneralInstrumentationConfiguration>
@@ -21,9 +22,9 @@ public function createPlugin(array $properties, Context $context): GeneralInstru
2122
return new PeerConfig($properties);
2223
}
2324

24-
public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition
25+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
2526
{
26-
$node = new ArrayNodeDefinition('peer');
27+
$node = $builder->arrayNode('peer');
2728
$node
2829
->children()
2930
->arrayNode('service_mapping')

src/Config/SDK/ComponentProvider/InstrumentationConfigurationRegistry.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use OpenTelemetry\Config\SDK\Configuration\ComponentProviderRegistry;
1313
use OpenTelemetry\Config\SDK\Configuration\Context;
1414
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
15+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
1516

1617
/**
1718
* @internal
@@ -24,7 +25,7 @@ class InstrumentationConfigurationRegistry implements ComponentProvider
2425
* @param array{
2526
* instrumentation: array{
2627
* php: list<ComponentPlugin<InstrumentationConfiguration>>,
27-
* general: list<ComponentPlugin<InstrumentationConfiguration>>
28+
* general: list<ComponentPlugin<GeneralInstrumentationConfiguration>>
2829
* }
2930
* } $properties
3031
*/
@@ -43,18 +44,16 @@ public function createPlugin(array $properties, Context $context): Configuration
4344
return $configurationRegistry;
4445
}
4546

46-
public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition
47+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
4748
{
48-
$root = new ArrayNodeDefinition('open_telemetry');
49+
$root = $builder->arrayNode('open_telemetry');
4950
$root
5051
->ignoreExtraKeys()
5152
->children()
5253
->arrayNode('instrumentation')
5354
->ignoreExtraKeys()
54-
->children()
55-
->append($registry->componentList('php', InstrumentationConfiguration::class))
56-
->append($registry->componentList('general', GeneralInstrumentationConfiguration::class))
57-
->end()
55+
->append($registry->componentMap('php', InstrumentationConfiguration::class))
56+
->append($registry->componentMap('general', GeneralInstrumentationConfiguration::class))
5857
->end()
5958
->end()
6059
;

src/Config/SDK/ComponentProvider/Logs/LogRecordExporterConsole.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use OpenTelemetry\SDK\Logs\LogRecordExporterInterface;
1212
use OpenTelemetry\SDK\Registry;
1313
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
14+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
1415

1516
/**
1617
* @implements ComponentProvider<LogRecordExporterInterface>
@@ -28,8 +29,8 @@ public function createPlugin(array $properties, Context $context): LogRecordExpo
2829
));
2930
}
3031

31-
public function getConfig(ComponentProviderRegistry $registry): ArrayNodeDefinition
32+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
3233
{
33-
return new ArrayNodeDefinition('console');
34+
return $builder->arrayNode('console');
3435
}
3536
}

0 commit comments

Comments
 (0)