Skip to content

Commit 566ecb7

Browse files
authored
Allow span suppression strategy configuration using file-based and env-based config (#1920)
* Allow span suppression strategy configuration using file-based and env-based config * Mark distribution config as experimental
1 parent c021e79 commit 566ecb7

16 files changed

Lines changed: 355 additions & 4 deletions

composer.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@
147147
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanExporterZipkin",
148148
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanProcessorBatch",
149149
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanProcessorSimple",
150+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanSuppressionStrategySemConv",
151+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanSuppressionStrategySpanKind",
150152

151153
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Metrics\\AggregationResolverDefault",
152154
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Metrics\\MetricExporterConsole",
@@ -172,6 +174,8 @@
172174
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\HttpConfigProvider",
173175
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\PeerConfigProvider",
174176

177+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Distribution\\DistributionConfigurationSdk",
178+
175179
"OpenTelemetry\\Example\\ExampleConfigProvider",
176180

177181
"OpenTelemetry\\Tests\\Integration\\Config\\ComponentProvider\\Detector\\Container",
@@ -188,6 +192,11 @@
188192
"OpenTelemetry\\API\\Instrumentation\\Configuration\\General\\ConfigEnv\\EnvComponentLoaderHttpConfig",
189193
"OpenTelemetry\\API\\Instrumentation\\Configuration\\General\\ConfigEnv\\EnvComponentLoaderPeerConfig",
190194

195+
"OpenTelemetry\\SDK\\ConfigEnv\\Trace\\SpanSuppressionStrategySemConv",
196+
"OpenTelemetry\\SDK\\ConfigEnv\\Trace\\SpanSuppressionStrategySpanKind",
197+
198+
"OpenTelemetry\\SDK\\ConfigEnv\\Distribution\\DistributionConfigurationSdk",
199+
191200
"OpenTelemetry\\Example\\ExampleConfigLoader"
192201
],
193202
"OpenTelemetry\\API\\Instrumentation\\AutoInstrumentation\\HookManagerInterface": [
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Config\SDK\ComponentProvider\Distribution;
6+
7+
use OpenTelemetry\API\Configuration\Config\ComponentPlugin;
8+
use OpenTelemetry\API\Configuration\Config\ComponentProvider;
9+
use OpenTelemetry\API\Configuration\Config\ComponentProviderRegistry;
10+
use OpenTelemetry\API\Configuration\Context;
11+
use OpenTelemetry\SDK\Common\Distribution\DistributionConfiguration;
12+
use OpenTelemetry\SDK\Common\Distribution\SdkDistribution;
13+
use OpenTelemetry\SDK\Trace\SpanSuppression\NoopSuppressionStrategy\NoopSuppressionStrategy;
14+
use OpenTelemetry\SDK\Trace\SpanSuppression\SpanSuppressionStrategy;
15+
use Override;
16+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
17+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
18+
19+
/**
20+
* @implements ComponentProvider<DistributionConfiguration>
21+
*/
22+
final class DistributionConfigurationSdk implements ComponentProvider
23+
{
24+
/**
25+
* @param array{
26+
* "span_suppression_strategy/development": ?ComponentPlugin<SpanSuppressionStrategy>,
27+
* } $properties
28+
* @param Context $context
29+
* @return DistributionConfiguration
30+
*/
31+
#[Override]
32+
public function createPlugin(array $properties, Context $context): DistributionConfiguration
33+
{
34+
return new SdkDistribution(
35+
spanSuppressionStrategy: $properties['span_suppression_strategy/development']?->create($context) ?? new NoopSuppressionStrategy(),
36+
);
37+
}
38+
39+
#[Override]
40+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
41+
{
42+
$node = $builder->arrayNode('opentelemetry_php/development');
43+
$node
44+
->children()
45+
->append($registry->component('span_suppression_strategy/development', SpanSuppressionStrategy::class))
46+
->end()
47+
;
48+
49+
return $node;
50+
}
51+
}

src/Config/SDK/ComponentProvider/OpenTelemetrySdk.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
use OpenTelemetry\Context\Propagation\ResponsePropagatorInterface;
1919
use OpenTelemetry\Context\Propagation\TextMapPropagatorInterface;
2020
use OpenTelemetry\SDK\Common\Attribute\Attributes;
21+
use OpenTelemetry\SDK\Common\Distribution\DistributionConfiguration;
22+
use OpenTelemetry\SDK\Common\Distribution\DistributionRegistry;
23+
use OpenTelemetry\SDK\Common\Distribution\SdkDistribution;
2124
use OpenTelemetry\SDK\Common\Instrumentation\InstrumentationScopeFactory;
2225
use OpenTelemetry\SDK\Common\InstrumentationScope\Configurator;
2326
use OpenTelemetry\SDK\Logs\EventLoggerProvider;
@@ -169,6 +172,7 @@ final class OpenTelemetrySdk implements ComponentProvider
169172
* }>
170173
* },
171174
* },
175+
* distribution: list<ComponentPlugin<DistributionConfiguration>>,
172176
* } $properties
173177
*/
174178
#[\Override]
@@ -194,6 +198,13 @@ public function createPlugin(array $properties, Context $context): SdkBuilder
194198
return $sdkBuilder;
195199
}
196200

201+
$distributionProperties = new DistributionRegistry();
202+
foreach ($properties['distribution'] as $distributionConfiguration) {
203+
$distributionProperties->add($distributionConfiguration->create($context));
204+
}
205+
206+
$distributionConfiguration = $distributionProperties->getDistributionConfiguration(SdkDistribution::class) ?? new SdkDistribution();
207+
197208
//priorities: 1. attributes 2. attributes_list, 3. detected (after applying include/exclude)
198209
$schemaUrl = $properties['resource']['schema_url'];
199210
/** @var ResourceDetectorInterface[] $detectors */
@@ -277,6 +288,7 @@ public function createPlugin(array $properties, Context $context): SdkBuilder
277288
linkCountLimit: $properties['tracer_provider']['limits']['link_count_limit'],
278289
),
279290
configurator: $configurator,
291+
spanSuppressionStrategy: $distributionConfiguration->spanSuppressionStrategy,
280292
);
281293

282294
// </editor-fold>
@@ -419,6 +431,7 @@ public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $buil
419431
->append($this->getMeterProviderConfig($registry, $builder))
420432
->append($this->getLoggerProviderConfig($registry, $builder))
421433
->append($this->getExperimentalResponsePropagatorConfig($registry, $builder))
434+
->append($registry->componentMap('distribution', DistributionConfiguration::class)->defaultValue([]))
422435
->end();
423436

424437
return $node;
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Config\SDK\ComponentProvider\Trace;
6+
7+
use Nevay\SPI\ServiceLoader;
8+
use OpenTelemetry\API\Configuration\Config\ComponentProvider;
9+
use OpenTelemetry\API\Configuration\Config\ComponentProviderRegistry;
10+
use OpenTelemetry\API\Configuration\Context;
11+
use OpenTelemetry\API\Trace\SpanSuppression\SemanticConventionResolver;
12+
use OpenTelemetry\SDK\Trace\SpanSuppression\SemanticConventionSuppressionStrategy\SemanticConventionSuppressionStrategy;
13+
use OpenTelemetry\SDK\Trace\SpanSuppression\SpanSuppressionStrategy;
14+
use Override;
15+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
16+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
17+
18+
/**
19+
* @implements ComponentProvider<SpanSuppressionStrategy>
20+
*/
21+
final class SpanSuppressionStrategySemConv implements ComponentProvider
22+
{
23+
/**
24+
* @param array{} $properties
25+
*/
26+
#[Override]
27+
public function createPlugin(array $properties, Context $context): SpanSuppressionStrategy
28+
{
29+
return new SemanticConventionSuppressionStrategy(ServiceLoader::load(SemanticConventionResolver::class));
30+
}
31+
32+
#[Override]
33+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
34+
{
35+
return $builder->arrayNode('semconv');
36+
}
37+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\Config\SDK\ComponentProvider\Trace;
6+
7+
use OpenTelemetry\API\Configuration\Config\ComponentProvider;
8+
use OpenTelemetry\API\Configuration\Config\ComponentProviderRegistry;
9+
use OpenTelemetry\API\Configuration\Context;
10+
use OpenTelemetry\SDK\Trace\SpanSuppression\SpanKindSuppressionStrategy\SpanKindSuppressionStrategy;
11+
use OpenTelemetry\SDK\Trace\SpanSuppression\SpanSuppressionStrategy;
12+
use Override;
13+
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
14+
use Symfony\Component\Config\Definition\Builder\NodeBuilder;
15+
16+
/**
17+
* @implements ComponentProvider<SpanSuppressionStrategy>
18+
*/
19+
final class SpanSuppressionStrategySpanKind implements ComponentProvider
20+
{
21+
/**
22+
* @param array{} $properties
23+
*/
24+
#[Override]
25+
public function createPlugin(array $properties, Context $context): SpanSuppressionStrategy
26+
{
27+
return new SpanKindSuppressionStrategy();
28+
}
29+
30+
#[Override]
31+
public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition
32+
{
33+
return $builder->arrayNode('spankind');
34+
}
35+
}

src/Config/SDK/composer.json

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"php": "^8.1",
2121
"open-telemetry/api": "^1.8",
2222
"open-telemetry/context": "^1.4",
23-
"open-telemetry/sdk": "^1.8",
23+
"open-telemetry/sdk": "^1.14",
2424
"symfony/config": "^5.4 || ^6.4 || ^7.0 || ^8.0",
2525
"tbachert/spi": "^1.0.5"
2626
},
@@ -59,6 +59,8 @@
5959
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanExporterZipkin",
6060
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanProcessorBatch",
6161
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanProcessorSimple",
62+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanSuppressionStrategySemConv",
63+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Trace\\SpanSuppressionStrategySpanKind",
6264

6365
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Metrics\\AggregationResolverDefault",
6466
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Metrics\\MetricExporterConsole",
@@ -82,7 +84,9 @@
8284
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Detector\\Service",
8385

8486
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\HttpConfigProvider",
85-
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\PeerConfigProvider"
87+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Instrumentation\\General\\PeerConfigProvider",
88+
89+
"OpenTelemetry\\Config\\SDK\\ComponentProvider\\Distribution\\DistributionConfigurationSdk"
8690
],
8791
"OpenTelemetry\\Config\\SDK\\Configuration\\Environment\\EnvSourceProvider": [
8892
"OpenTelemetry\\Config\\SDK\\Configuration\\Environment\\Adapter\\SymfonyDotenvProvider",

src/SDK/Common/Configuration/Variables.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,5 @@ interface Variables
143143
public const OTEL_PHP_EXPERIMENTAL_AUTO_ROOT_SPAN = 'OTEL_PHP_EXPERIMENTAL_AUTO_ROOT_SPAN';
144144
public const OTEL_CONFIG_FILE = 'OTEL_CONFIG_FILE';
145145
public const OTEL_EXPERIMENTAL_RESPONSE_PROPAGATORS = 'OTEL_EXPERIMENTAL_RESPONSE_PROPAGATORS';
146+
public const OTEL_EXPERIMENTAL_SPAN_SUPPRESSION_STRATEGY = 'OTEL_EXPERIMENTAL_SPAN_SUPPRESSION_STRATEGY';
146147
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\SDK\Common\Distribution;
6+
7+
interface DistributionConfiguration
8+
{
9+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\SDK\Common\Distribution;
6+
7+
interface DistributionProperties
8+
{
9+
/**
10+
* @template C of DistributionConfiguration
11+
* @param class-string<C> $distribution
12+
* @return C|null
13+
*/
14+
public function getDistributionConfiguration(string $distribution): ?DistributionConfiguration;
15+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\SDK\Common\Distribution;
6+
7+
use Override;
8+
9+
final class DistributionRegistry implements DistributionProperties
10+
{
11+
private array $distributionConfigurations = [];
12+
13+
public function add(DistributionConfiguration $distributionConfiguration): self
14+
{
15+
$this->distributionConfigurations[$distributionConfiguration::class] = $distributionConfiguration;
16+
17+
return $this;
18+
}
19+
20+
#[Override]
21+
public function getDistributionConfiguration(string $distribution): ?DistributionConfiguration
22+
{
23+
return $this->distributionConfigurations[$distribution] ?? null;
24+
}
25+
}

0 commit comments

Comments
 (0)