|
4 | 4 |
|
5 | 5 | namespace OpenTelemetry\Tests\Integration\Config; |
6 | 6 |
|
| 7 | +use OpenTelemetry\API\Configuration\Config\ComponentProvider; |
| 8 | +use OpenTelemetry\API\Configuration\Config\ComponentProviderRegistry; |
| 9 | +use OpenTelemetry\API\Configuration\Context; |
7 | 10 | use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator; |
| 11 | +use OpenTelemetry\Config\SDK\ComponentProvider\OpenTelemetrySdk; |
8 | 12 | use OpenTelemetry\Config\SDK\ComponentProvider\OutputStreamParser; |
9 | 13 | use OpenTelemetry\Config\SDK\Configuration; |
| 14 | +use OpenTelemetry\Config\SDK\Configuration\ConfigurationFactory; |
| 15 | +use OpenTelemetry\Config\SDK\Configuration\Environment\EnvSourceReader; |
10 | 16 | use OpenTelemetry\Context\Propagation\ResponsePropagatorInterface; |
11 | 17 | use OpenTelemetry\SDK\Resource\ResourceInfo; |
12 | 18 | use OpenTelemetry\SDK\Sdk; |
| 19 | +use OpenTelemetry\SDK\Trace\Sampler\AlwaysOnSampler; |
| 20 | +use OpenTelemetry\SDK\Trace\SamplerInterface; |
| 21 | +use OpenTelemetry\Tests\Integration\Config\ComponentProvider\Detector\ServiceName; |
13 | 22 | use org\bovigo\vfs\vfsStream; |
| 23 | +use Override; |
14 | 24 | use PHPUnit\Framework\Attributes\CoversNothing; |
15 | 25 | use PHPUnit\Framework\Attributes\DataProvider; |
| 26 | +use PHPUnit\Framework\Attributes\Depends; |
16 | 27 | use PHPUnit\Framework\Attributes\DoesNotPerformAssertions; |
17 | 28 | use PHPUnit\Framework\TestCase; |
| 29 | +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; |
| 30 | +use Symfony\Component\Config\Definition\Builder\NodeBuilder; |
| 31 | +use Symfony\Component\Yaml\Yaml; |
18 | 32 |
|
19 | 33 | #[CoversNothing] |
20 | 34 | final class ConfigurationTest extends TestCase |
@@ -198,6 +212,109 @@ public function test_duplicate_response_propagators(): void |
198 | 212 | $this->assertInstanceOf(ResponsePropagatorInterface::class, $responsePropagators[0]); |
199 | 213 | } |
200 | 214 |
|
| 215 | + public function test_resource_attributes_take_precedence_over_default_attributes(): void |
| 216 | + { |
| 217 | + $factory = new ConfigurationFactory( |
| 218 | + [], |
| 219 | + new OpenTelemetrySdk(), |
| 220 | + new EnvSourceReader([]), |
| 221 | + ); |
| 222 | + |
| 223 | + $sdk = $factory->process([Yaml::parse(/** @lang yaml */<<<'YAML' |
| 224 | + file_format: "0.4" |
| 225 | + resource: |
| 226 | + attributes: |
| 227 | + - { name: service.name, value: test-service } |
| 228 | + YAML)]); |
| 229 | + $resource = $this->getResource($sdk->create(new Context())->build()); |
| 230 | + |
| 231 | + $this->assertSame('test-service', $resource->getAttributes()->get('service.name')); |
| 232 | + } |
| 233 | + |
| 234 | + public function test_resource_detectors_take_precedence_over_default_attributes(): void |
| 235 | + { |
| 236 | + $factory = new ConfigurationFactory( |
| 237 | + [new ServiceName('test-service')], |
| 238 | + new OpenTelemetrySdk(), |
| 239 | + new EnvSourceReader([]), |
| 240 | + ); |
| 241 | + |
| 242 | + $sdk = $factory->process([Yaml::parse(/** @lang yaml */<<<'YAML' |
| 243 | + file_format: "0.4" |
| 244 | + resource: |
| 245 | + detection/development: |
| 246 | + detectors: |
| 247 | + - service_name: |
| 248 | + YAML)]); |
| 249 | + $resource = $this->getResource($sdk->create(new Context())->build()); |
| 250 | + |
| 251 | + $this->assertSame('test-service', $resource->getAttributes()->get('service.name')); |
| 252 | + } |
| 253 | + |
| 254 | + #[Depends('test_resource_attributes_take_precedence_over_default_attributes')] |
| 255 | + #[Depends('test_resource_detectors_take_precedence_over_default_attributes')] |
| 256 | + public function test_resource_attributes_take_precedence_over_resource_detectors(): void |
| 257 | + { |
| 258 | + $factory = new ConfigurationFactory( |
| 259 | + [new ServiceName('should-be-overridden')], |
| 260 | + new OpenTelemetrySdk(), |
| 261 | + new EnvSourceReader([]), |
| 262 | + ); |
| 263 | + |
| 264 | + $sdk = $factory->process([Yaml::parse(/** @lang yaml */<<<'YAML' |
| 265 | + file_format: "0.4" |
| 266 | + resource: |
| 267 | + attributes: |
| 268 | + - { name: service.name, value: test-service } |
| 269 | + detection/development: |
| 270 | + detectors: |
| 271 | + - service_name: |
| 272 | + YAML)]); |
| 273 | + $resource = $this->getResource($sdk->create(new Context())->build()); |
| 274 | + |
| 275 | + $this->assertSame('test-service', $resource->getAttributes()->get('service.name')); |
| 276 | + } |
| 277 | + |
| 278 | + public function test_samplers_have_access_to_resource_info_extension(): void |
| 279 | + { |
| 280 | + $samplerProvider = new /** @implements ComponentProvider<SamplerInterface> */ class() implements ComponentProvider { |
| 281 | + public ?string $serviceName = null; |
| 282 | + |
| 283 | + #[Override] |
| 284 | + public function createPlugin(array $properties, Context $context): SamplerInterface |
| 285 | + { |
| 286 | + $this->serviceName = $context->getExtension(ResourceInfo::class)?->getAttributes()->get('service.name'); |
| 287 | + |
| 288 | + return new AlwaysOnSampler(); |
| 289 | + } |
| 290 | + |
| 291 | + #[Override] |
| 292 | + public function getConfig(ComponentProviderRegistry $registry, NodeBuilder $builder): ArrayNodeDefinition |
| 293 | + { |
| 294 | + return $builder->arrayNode('remote_sampler'); |
| 295 | + } |
| 296 | + }; |
| 297 | + |
| 298 | + $factory = new ConfigurationFactory( |
| 299 | + [$samplerProvider], |
| 300 | + new OpenTelemetrySdk(), |
| 301 | + new EnvSourceReader([]), |
| 302 | + ); |
| 303 | + |
| 304 | + $sdk = $factory->process([Yaml::parse(/** @lang yaml */<<<'YAML' |
| 305 | + file_format: "0.4" |
| 306 | + resource: |
| 307 | + attributes: |
| 308 | + - { name: service.name, value: test-service } |
| 309 | + tracer_provider: |
| 310 | + sampler: |
| 311 | + remote_sampler: |
| 312 | + YAML)]); |
| 313 | + $sdk->create(new Context()); |
| 314 | + |
| 315 | + $this->assertSame('test-service', $samplerProvider->serviceName); |
| 316 | + } |
| 317 | + |
201 | 318 | private function getResource(Sdk $sdk): ResourceInfo |
202 | 319 | { |
203 | 320 | $tracer = $sdk->getTracerProvider()->getTracer('test'); |
|
0 commit comments