Skip to content
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6db7968
feat(process-tags): per-RFC Service Override Source Attribution (_dd.…
Leiyks Jun 3, 2026
e32d32e
fix(tests): ignore _dd.svc_src in SpanChecker tag assertions
Leiyks Jun 3, 2026
4337785
Revert "fix(tests): ignore _dd.svc_src in SpanChecker tag assertions"
Leiyks Jun 3, 2026
0034621
test(integrations): assert _dd.svc_src in every per-integration tag b…
Leiyks Jun 3, 2026
c3141de
test(integrations): correct _dd.svc_src expectations per integration
Leiyks Jun 8, 2026
d70be28
fix(integrations): use explicit class refs instead of self::NAME in c…
Leiyks Jun 9, 2026
2e14e97
test(ratchet): add _dd.svc_src expectations to ratchet spans
Leiyks Jun 9, 2026
63a19a4
fix(svc_src): drop void return type + add missing test expectations
Leiyks Jun 9, 2026
5f5faec
test(svc_src): more test expectation fixes from CI iteration 2
Leiyks Jun 9, 2026
f349613
test(svc_src): Laravel V8_x framework spans use lowercase 'laravel'
Leiyks Jun 9, 2026
2ed91d7
test(svc_src): drop stray svc_src in Symfony V3_4 misc + Frankenphp
Leiyks Jun 9, 2026
9c8a45d
test(svc_src): fix DB/cache integration testNoFakeServices + split-by…
Leiyks Jun 9, 2026
da4b499
test(svc_src): fix PHPRedis V5 / Laravel V5_8 / CakePHP CLI V2_8
Leiyks Jun 10, 2026
fede3c2
test(svc_src): fix Laravel V5_7 Eloquent + PHPRedis V5 testNoFakeServ…
Leiyks Jun 10, 2026
5f2cba3
test(elasticsearch): add _dd.svc_src to V1 testConstructor
Leiyks Jun 10, 2026
3eb74bc
Merge branch 'master' into leiyks/svc-override-source-attribution
Leiyks Jun 10, 2026
a1f5157
refactor(svc_src): address PR feedback
Leiyks Jun 10, 2026
a370649
fix(svc_src): manual override overwrites pre-existing svc_src
Leiyks Jun 10, 2026
049f749
test(svc_src): cover remaining CI failures after RFC revert
Leiyks Jun 12, 2026
2a697d3
Merge branch 'master' into leiyks/svc-override-source-attribution
Leiyks Jun 12, 2026
9c040f1
fix(svc_src): emit integration-driven svc_src in Symfony / ZendFramework
Leiyks Jun 12, 2026
50b73bb
test(svc_src): drop spurious symfony svc_src on DD_SERVICE-set web tests
Leiyks Jun 12, 2026
9364c35
test(svc_src): restore _dd.svc_src='symfony' on no-DD_SERVICE tests
Leiyks Jun 12, 2026
7ea40df
Merge branch 'master' into leiyks/svc-override-source-attribution
Leiyks Jun 15, 2026
6ff6d61
fix(svc_src): is_identical guard on attribute path + transfer to infe…
Leiyks Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/DDTrace/Integrations/AMQP/AMQPIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@ public static function setGenericTags(
$span->meta[Tag::SPAN_KIND] = $spanKind;
$span->type = 'queue';
$span->service = 'amqp';
$span->meta['_dd.svc_src'] = AMQPIntegration::NAME;
$span->meta[Tag::COMPONENT] = self::NAME;

$span->meta[Tag::MQ_SYSTEM] = self::SYSTEM;
Expand Down
1 change: 1 addition & 0 deletions src/DDTrace/Integrations/CakePHP/CakePHPIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public static function init(): int
self::$appName = \ddtrace_config_app_name(CakePHPIntegration::NAME);
self::addTraceAnalyticsIfEnabled($rootSpan);
$rootSpan->service = self::$appName;
Integration::tagFrameworkServiceSource($rootSpan, CakePHPIntegration::NAME);
if ('cli' === PHP_SAPI) {
$rootSpan->name = 'cakephp.console';
$rootSpan->resource = !empty($_SERVER['argv'][1])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ function (SpanData $span, array $args) {
$span->name = $span->resource = 'Controller.invokeAction';
$span->type = Type::WEB_SERVLET;
$span->service = CakePHPIntegration::$appName;
Integration::tagFrameworkServiceSource($span, CakePHPIntegration::NAME);
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;

$request = $args[0];
Expand Down Expand Up @@ -84,6 +85,7 @@ function (SpanData $span, array $args) {
$span->resource = $file;
$span->meta = ['cakephp.view' => $file];
$span->service = CakePHPIntegration::$appName;
Integration::tagFrameworkServiceSource($span, CakePHPIntegration::NAME);
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ function (SpanData $span) {
$span->name = $span->resource = 'Controller.invokeAction';
$span->type = Type::WEB_SERVLET;
$span->service = CakePHPIntegration::$appName;
Integration::tagFrameworkServiceSource($span, CakePHPIntegration::NAME);
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;

/** @var \Cake\Controller\Controller $this */
Expand Down Expand Up @@ -91,6 +92,7 @@ static function (HookData $hook) use ($renderHook) {
$span->name = 'cakephp.view';
$span->type = Type::WEB_SERVLET;
$span->service = CakePHPIntegration::$appName;
Integration::tagFrameworkServiceSource($span, CakePHPIntegration::NAME);
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;

$absoluteFilePath = $renderHook->data['viewFileName'] ?? '';
Expand Down
1 change: 1 addition & 0 deletions src/DDTrace/Integrations/Curl/CurlIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ public static function set_curl_attributes($span, $info) {

if (\dd_trace_env_config("DD_TRACE_HTTP_CLIENT_SPLIT_BY_DOMAIN")) {
$span->service = Urls::hostnameForTag($sanitizedUrl);
$span->meta['_dd.svc_src'] = 'opt.http_client_split_by_domain';
}

$span->resource = $normalizedPath;
Expand Down
9 changes: 9 additions & 0 deletions src/DDTrace/Integrations/Drupal/DrupalIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,14 @@ public static function init(): int
$rootSpan = \DDTrace\root_span();
$rootSpan->name = 'drupal.request';
$rootSpan->service = $service;
Integration::tagFrameworkServiceSource($rootSpan, 'drupal');
$rootSpan->meta[Tag::SPAN_KIND] = 'server';
$rootSpan->meta[Tag::COMPONENT] = self::NAME;

$span->name = 'drupal.kernel.handle';
$span->type = Type::WEB_SERVLET;
$span->service = $service;
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->meta[Tag::SPAN_KIND] = 'server';
$span->meta[Tag::COMPONENT] = self::NAME;
}
Expand All @@ -60,6 +62,7 @@ public static function init(): int
$span->name = 'drupal.httpkernel.handle';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->meta[Tag::COMPONENT] = self::NAME;
};
// See Drupal\Core\DependencyInjection\Compiler\StackedKernelPass
Expand All @@ -78,6 +81,7 @@ public static function init(): int
$span->name = 'drupal.kernel.boot';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->meta[Tag::COMPONENT] = self::NAME;
}
]
Expand Down Expand Up @@ -124,6 +128,7 @@ static function (HookData $fnHookData) use ($hook, $module, $functionName) {
$span->name = 'drupal.hook.' . $hook;
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->meta[Tag::COMPONENT] = self::NAME;

$span->meta['drupal.hook'] = $hook;
Expand Down Expand Up @@ -165,6 +170,7 @@ static function (HookData $fnHookData) use ($hook, $module, $functionName) {
$span->name = 'drupal.hook.' . $hook;
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->meta[Tag::COMPONENT] = self::NAME;
$span->resource = $functionName;

Expand Down Expand Up @@ -197,6 +203,7 @@ function (HookData $hook) {
$span->name = 'drupal.view.execute';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->meta[Tag::COMPONENT] = DrupalIntegration::NAME;

// @var \Drupal\views\Entity\View $storage
Expand Down Expand Up @@ -239,6 +246,7 @@ static function ($registry, $scope, $args) {
'prehook' => function (SpanData $span, $args) {
$span->name = 'drupal.theme.render';
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->type = Type::WEB_SERVLET;
$span->meta[Tag::COMPONENT] = DrupalIntegration::NAME;

Expand Down Expand Up @@ -396,6 +404,7 @@ static function ($mainContViewSubscriber, $scope, $args) {
static function (SpanData $span) {
$span->name = 'symfony.response.send';
$span->service = \ddtrace_config_app_name('drupal');
Integration::tagFrameworkServiceSource($span, 'drupal');
$span->type = Type::WEB_SERVLET;
$span->meta[Tag::COMPONENT] = self::NAME;
}
Expand Down
2 changes: 2 additions & 0 deletions src/DDTrace/Integrations/Guzzle/GuzzleIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ public static function addRequestInfo(SpanData $span, $request)

if (\dd_trace_env_config("DD_TRACE_HTTP_CLIENT_SPLIT_BY_DOMAIN")) {
$span->service = Urls::hostnameForTag($url);
$span->meta['_dd.svc_src'] = 'opt.http_client_split_by_domain';
}
$span->meta[Tag::HTTP_METHOD] = $request->getMethod();

Expand All @@ -158,6 +159,7 @@ public static function addRequestInfo(SpanData $span, $request)
}
if (\dd_trace_env_config("DD_TRACE_HTTP_CLIENT_SPLIT_BY_DOMAIN")) {
$span->service = Urls::hostnameForTag($url);
$span->meta['_dd.svc_src'] = 'opt.http_client_split_by_domain';
}
$span->meta[Tag::HTTP_METHOD] = $request->getMethod();

Expand Down
17 changes: 17 additions & 0 deletions src/DDTrace/Integrations/Integration.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,15 @@ public static function handleInternalSpanServiceName(SpanData $span, string $fal
$rootSpan = \DDTrace\root_span();
if ($rootSpan) {
$service = $rootSpan->service;
if (isset($rootSpan->meta['_dd.svc_src'])) {
$span->meta['_dd.svc_src'] = $rootSpan->meta['_dd.svc_src'];
}
} else {
$service = \ddtrace_config_app_name($fallbackName);
}
} else {
$service = $fallbackName;
$span->meta['_dd.svc_src'] = $fallbackName;
}

$mapping = \dd_trace_env_config('DD_SERVICE_MAPPING');
Expand All @@ -99,6 +103,19 @@ public static function handleInternalSpanServiceName(SpanData $span, string $fal
$span->service = $service;
}

/**
* Tag _dd.svc_src with the integration name when the framework fallback drove
* the service value (i.e. user did not configure DD_SERVICE). When DD_SERVICE
* is configured, the service value is the user's default — leave _dd.svc_src
* cleared per RFC "Service Override Source Attribution".
*/
public static function tagFrameworkServiceSource(SpanData $span, $integrationName)
{
if (!\dd_trace_env_config('DD_SERVICE')) {
$span->meta['_dd.svc_src'] = $integrationName;
}
}

public static function handleOrphan(SpanData $span)
{
if (
Expand Down
15 changes: 15 additions & 0 deletions src/DDTrace/Integrations/Laminas/LaminasIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ static function (SpanData $span) use ($className, $methodName) {
$span->resource = $className . '@' . $methodName;
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
Comment thread
Leiyks marked this conversation as resolved.
Outdated
}
);
Expand All @@ -175,11 +176,13 @@ static function (SpanData $span) {
$span->resource = 'laminas.application.init';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->meta[Tag::COMPONENT] = 'laminas';

$rootSpan = root_span();
$rootSpan->name = 'laminas.request';
$rootSpan->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($rootSpan, 'laminas');
$rootSpan->meta[Tag::SPAN_KIND] = 'server';
$rootSpan->meta[Tag::COMPONENT] = self::NAME;
}
Expand All @@ -193,6 +196,7 @@ static function (SpanData $span) {
$span->resource = 'laminas.application.bootstrap';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
}
);
Expand All @@ -212,6 +216,7 @@ static function (SpanData $span) {

$span->name = "laminas.event.$eventName";
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
}
]
Expand All @@ -226,6 +231,7 @@ static function (SpanData $span) {
$span->name = 'laminas.application.run';
$span->type = Type::WEB_SERVLET;
$span->service = $service;
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
}
]
Expand Down Expand Up @@ -391,6 +397,7 @@ static function ($This, $score, $args) {
static function (SpanData $span, $args) {
$span->name = 'laminas.application.completeRequest';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->type = Type::WEB_SERVLET;
$span->meta[Tag::COMPONENT] = 'laminas';

Expand All @@ -413,6 +420,7 @@ static function (SpanData $span, $args) {
'prehook' => static function (SpanData $span, $args) {
$span->name = 'laminas.templating.render';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->type = Type::WEB_SERVLET;
$span->meta[Tag::COMPONENT] = 'laminas';

Expand All @@ -433,6 +441,7 @@ static function (SpanData $span, $args) {
static function (SpanData $span) {
$span->name = 'laminas.view.render';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->type = Type::WEB_SERVLET;
$span->meta[Tag::COMPONENT] = 'laminas';
}
Expand All @@ -444,6 +453,7 @@ static function (SpanData $span) {
function (SpanData $span) {
$span->name = 'laminas.view.model.serialize';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->resource = \get_class($this);
$span->meta[Tag::COMPONENT] = 'laminas';
}
Expand All @@ -455,6 +465,7 @@ function (SpanData $span) {
function (SpanData $span, $args) {
$span->name = 'laminas.view.http.renderer';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->type = Type::WEB_SERVLET;
$span->resource = \get_class($this) . '@render';
$span->meta[Tag::COMPONENT] = 'laminas';
Expand All @@ -475,6 +486,7 @@ function (SpanData $span, $args) {
function (SpanData $span, $args) {
$span->name = 'laminas.view.console.renderer';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->type = Type::WEB_SERVLET;
$span->resource = \get_class($this) . '@render';
$span->meta[Tag::COMPONENT] = 'laminas';
Expand All @@ -496,6 +508,7 @@ function (SpanData $span, $args) {
static function (SpanData $span, $args, $retval) {
$span->name = 'laminas.mvcEvent.setError';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->type = Type::WEB_SERVLET;
$span->meta[Tag::COMPONENT] = 'laminas';

Expand All @@ -522,6 +535,7 @@ static function (SpanData $span, $args, $retval) {
static function (SpanData $span, $args) {
$span->name = 'laminas.controller.pluginManager.get';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->resource = $args[0];
$span->meta[Tag::COMPONENT] = 'laminas';
}
Expand All @@ -533,6 +547,7 @@ static function (SpanData $span, $args) {
static function (SpanData $span, $args) {
$span->name = 'laminas.controller.forward';
$span->service = \ddtrace_config_app_name('laminas');
Integration::tagFrameworkServiceSource($span, 'laminas');
$span->meta[Tag::COMPONENT] = 'laminas';

$controllerName = $args[0];
Expand Down
10 changes: 10 additions & 0 deletions src/DDTrace/Integrations/Laravel/LaravelIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ static function (SpanData $span, $args, $response) {
$span->name = 'laravel.application.handle';
$span->type = Type::WEB_SERVLET;
$span->service = self::getServiceName();
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
$span->resource = 'Illuminate\Foundation\Application@handle';
$span->meta[Tag::COMPONENT] = self::NAME;

Expand All @@ -74,6 +75,7 @@ static function (SpanData $span, $args, $response) {
$rootSpan->meta[Tag::HTTP_STATUS_CODE] = $response->getStatusCode();
}
$rootSpan->service = self::getServiceName();
Integration::tagFrameworkServiceSource($rootSpan, LaravelIntegration::NAME);
$rootSpan->meta[Tag::SPAN_KIND] = 'server';
$rootSpan->meta[Tag::COMPONENT] = self::NAME;
}
Expand Down Expand Up @@ -170,6 +172,7 @@ function (SpanData $span) {
$span->name = 'laravel.action';
$span->type = Type::WEB_SERVLET;
$span->service = LaravelIntegration::getServiceName();
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
$span->resource = $this->uri;
$span->meta[Tag::COMPONENT] = LaravelIntegration::NAME;
}
Expand Down Expand Up @@ -202,6 +205,7 @@ function ($This, $scope, $args) {
$span->name = 'laravel.event.handle';
$span->type = Type::WEB_SERVLET;
$span->service = self::getServiceName();
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
$span->resource = $args[0];
$span->meta[Tag::COMPONENT] = self::NAME;

Expand Down Expand Up @@ -241,6 +245,7 @@ function ($This, $scope, $args) {
$span->name = 'laravel.event.handle';
$span->type = Type::WEB_SERVLET;
$span->service = self::getServiceName();
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
$span->resource = is_object($args[0]) ? get_class($args[0]) : $args[0];
$span->meta[Tag::COMPONENT] = self::NAME;
},
Expand All @@ -252,6 +257,7 @@ function ($This, $scope, $args) {
$span->name = 'laravel.view.render';
$span->type = Type::WEB_SERVLET;
$span->service = LaravelIntegration::getServiceName();
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
$span->resource = $this->view;
$span->meta[Tag::COMPONENT] = LaravelIntegration::NAME;
});
Expand All @@ -270,6 +276,7 @@ static function (SpanData $span, $args) {
: LumenIntegration::NAME;
$span->type = Type::WEB_SERVLET;
$span->service = self::getServiceName();
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
if (isset($args[0]) && \is_string($args[0])) {
$span->resource = $args[0];
}
Expand All @@ -285,6 +292,7 @@ static function (SpanData $span) {
$span->name = 'laravel.provider.load';
$span->type = Type::WEB_SERVLET;
$span->service = $serviceName;
Integration::tagFrameworkServiceSource($span, LaravelIntegration::NAME);
$span->resource = 'Illuminate\Foundation\ProviderRepository::load';
$span->meta[Tag::COMPONENT] = self::NAME;

Expand All @@ -293,6 +301,7 @@ static function (SpanData $span) {
$rootSpan = \DDTrace\root_span();
$rootSpan->name = 'laravel.request';
$rootSpan->service = $serviceName;
Integration::tagFrameworkServiceSource($rootSpan, LaravelIntegration::NAME);
$rootSpan->meta[Tag::COMPONENT] = self::NAME;
}
);
Expand Down Expand Up @@ -600,6 +609,7 @@ static function () {

$rootSpan->name = 'laravel.request';
$rootSpan->service = self::getServiceName();
Integration::tagFrameworkServiceSource($rootSpan, LaravelIntegration::NAME);
$rootSpan->meta[Tag::COMPONENT] = self::NAME;
}
);
Expand Down
Loading
Loading