Skip to content

Commit 89b6892

Browse files
rework ServiceInfoFactory priorities (#1644)
* rework ServiceInfoFactory priorities - default/all: load detectors from registry last - env-provided detectors: load in same order as default/all, then from registry in requested order * split service.instance.id into own detector to avoid always generating service.instance.id (which is useless for fpm/apache), split it into its own detector, ServiceInstance, and don't use it by default. If it is enabled, ensure it runs before registry-provided detectors. * Update src/SDK/Resource/ResourceInfoFactory.php Co-authored-by: Chris Lightfoot-Wild <[email protected]> * override --------- Co-authored-by: Chris Lightfoot-Wild <[email protected]>
1 parent 105c6e8 commit 89b6892

File tree

4 files changed

+69
-40
lines changed

4 files changed

+69
-40
lines changed

Common/Configuration/KnownValues.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ interface KnownValues
197197
public const VALUE_DETECTORS_SDK = 'sdk';
198198
public const VALUE_DETECTORS_SDK_PROVIDED = 'sdk_provided';
199199
public const VALUE_DETECTORS_SERVICE = 'service';
200+
public const VALUE_DETECTORS_SERVICE_INSTANCE = 'service_instance';
200201
public const VALUE_DETECTORS_COMPOSER = 'composer';
201202
public const OTEL_PHP_DETECTORS = [
202203
self::VALUE_ALL,

Resource/Detectors/Service.php

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use OpenTelemetry\SDK\Resource\ResourceDetectorInterface;
1111
use OpenTelemetry\SDK\Resource\ResourceInfo;
1212
use OpenTelemetry\SemConv\ResourceAttributes;
13-
use Ramsey\Uuid\Uuid;
1413

1514
/**
1615
* @see https://github.com/open-telemetry/semantic-conventions/tree/main/docs/resource#service-experimental
@@ -20,18 +19,13 @@ final class Service implements ResourceDetectorInterface
2019
#[\Override]
2120
public function getResource(): ResourceInfo
2221
{
23-
static $serviceInstanceId;
24-
$serviceInstanceId ??= Uuid::uuid4()->toString();
2522
$serviceName = Configuration::has(Variables::OTEL_SERVICE_NAME)
2623
? Configuration::getString(Variables::OTEL_SERVICE_NAME)
2724
: null;
2825

2926
$attributes = [
30-
ResourceAttributes::SERVICE_INSTANCE_ID => $serviceInstanceId,
27+
ResourceAttributes::SERVICE_NAME => $serviceName,
3128
];
32-
if ($serviceName !== null) {
33-
$attributes[ResourceAttributes::SERVICE_NAME] = $serviceName;
34-
}
3529

3630
return ResourceInfo::create(Attributes::create($attributes), ResourceAttributes::SCHEMA_URL);
3731
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace OpenTelemetry\SDK\Resource\Detectors;
6+
7+
use OpenTelemetry\SDK\Common\Attribute\Attributes;
8+
use OpenTelemetry\SDK\Resource\ResourceDetectorInterface;
9+
use OpenTelemetry\SDK\Resource\ResourceInfo;
10+
use OpenTelemetry\SemConv\ResourceAttributes;
11+
use Ramsey\Uuid\Uuid;
12+
13+
/**
14+
* @see https://github.com/open-telemetry/semantic-conventions/tree/main/docs/resource#service-experimental
15+
*
16+
* Spec deviation: Service Instance ID is not generated by the Service detector, as UUID is not useful in shared-nothing
17+
* PHP setups (FPM, Apache), and cannot be replaced by a more useful value due to Service being the last detector.
18+
*/
19+
final class ServiceInstance implements ResourceDetectorInterface
20+
{
21+
#[\Override]
22+
public function getResource(): ResourceInfo
23+
{
24+
static $serviceInstanceId;
25+
$serviceInstanceId ??= Uuid::uuid4()->toString();
26+
27+
$attributes = [
28+
ResourceAttributes::SERVICE_INSTANCE_ID => $serviceInstanceId,
29+
];
30+
31+
return ResourceInfo::create(Attributes::create($attributes), ResourceAttributes::SCHEMA_URL);
32+
}
33+
}

Resource/ResourceInfoFactory.php

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -29,50 +29,51 @@ public static function defaultResource(): ResourceInfo
2929
return (new Detectors\Composite([
3030
new Detectors\Host(),
3131
new Detectors\Process(),
32-
...Registry::resourceDetectors(),
3332
new Detectors\Environment(),
3433
new Detectors\Sdk(),
3534
new Detectors\Service(),
35+
...Registry::resourceDetectors(),
3636
]))->getResource();
3737
}
3838

39+
/**
40+
* Process env-provided detectors:
41+
* - host, process, environment, composer first if requested
42+
* - sdk, service always
43+
* - any other detectors registered in the registry if requested
44+
*/
3945
$resourceDetectors = [];
40-
41-
foreach ($detectors as $detector) {
42-
switch ($detector) {
43-
case Values::VALUE_DETECTORS_ENVIRONMENT:
44-
$resourceDetectors[] = new Detectors\Environment();
45-
46-
break;
47-
case Values::VALUE_DETECTORS_HOST:
48-
$resourceDetectors[] = new Detectors\Host();
49-
50-
break;
51-
case Values::VALUE_DETECTORS_PROCESS:
52-
$resourceDetectors[] = new Detectors\Process();
53-
54-
break;
55-
56-
case Values::VALUE_DETECTORS_COMPOSER:
57-
$resourceDetectors[] = new Detectors\Composer();
58-
59-
break;
60-
case Values::VALUE_DETECTORS_SDK_PROVIDED: //deprecated
61-
case Values::VALUE_DETECTORS_OS: //deprecated
62-
case Values::VALUE_DETECTORS_PROCESS_RUNTIME: //deprecated
63-
case Values::VALUE_NONE:
64-
65-
break;
66-
default:
67-
try {
68-
$resourceDetectors[] = Registry::resourceDetector($detector);
69-
} catch (RuntimeException $e) {
70-
self::logWarning($e->getMessage());
71-
}
46+
foreach ([
47+
Values::VALUE_DETECTORS_HOST => Detectors\Host::class,
48+
Values::VALUE_DETECTORS_PROCESS => Detectors\Process::class,
49+
Values::VALUE_DETECTORS_ENVIRONMENT => Detectors\Environment::class,
50+
Values::VALUE_DETECTORS_COMPOSER => Detectors\Composer::class,
51+
Values::VALUE_DETECTORS_SERVICE_INSTANCE => Detectors\ServiceInstance::class,
52+
] as $detector => $class) {
53+
if (in_array($detector, $detectors)) {
54+
$resourceDetectors[] = new $class();
55+
$detectors = array_diff($detectors, [$detector]);
7256
}
7357
}
7458
$resourceDetectors [] = new Detectors\Sdk();
7559
$resourceDetectors [] = new Detectors\Service();
60+
// Don't try to load mandatory + deprecated detectors
61+
$detectors = array_diff($detectors, [
62+
Values::VALUE_DETECTORS_SDK,
63+
Values::VALUE_DETECTORS_SERVICE,
64+
Values::VALUE_DETECTORS_SDK_PROVIDED, //deprecated
65+
Values::VALUE_DETECTORS_OS, //deprecated
66+
Values::VALUE_DETECTORS_PROCESS_RUNTIME, //deprecated
67+
Values::VALUE_NONE,
68+
]);
69+
70+
foreach ($detectors as $detector) {
71+
try {
72+
$resourceDetectors[] = Registry::resourceDetector($detector);
73+
} catch (RuntimeException $e) {
74+
self::logWarning($e->getMessage());
75+
}
76+
}
7677

7778
return (new Detectors\Composite($resourceDetectors))->getResource();
7879
}

0 commit comments

Comments
 (0)