Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 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
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 @@ -29,8 +29,7 @@ public static function load()
function (SpanData $span, array $args) {
$span->name = $span->resource = 'Controller.invokeAction';
$span->type = Type::WEB_SERVLET;
$span->service = CakePHPIntegration::$appName;
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;
Integration::setComponentMetadata($span, CakePHPIntegration::NAME, CakePHPIntegration::$appName);

$request = $args[0];
if (!$request instanceof CakeRequest) {
Expand Down Expand Up @@ -83,8 +82,7 @@ function (SpanData $span, array $args) {
$file = $this->viewPath . '/' . $this->view . $this->ext;
$span->resource = $file;
$span->meta = ['cakephp.view' => $file];
$span->service = CakePHPIntegration::$appName;
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;
Integration::setComponentMetadata($span, CakePHPIntegration::NAME, CakePHPIntegration::$appName);
});

\DDTrace\hook_method(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ public static function load()
function (SpanData $span) {
$span->name = $span->resource = 'Controller.invokeAction';
$span->type = Type::WEB_SERVLET;
$span->service = CakePHPIntegration::$appName;
$span->meta[Tag::COMPONENT] = CakePHPIntegration::NAME;
Integration::setComponentMetadata($span, CakePHPIntegration::NAME, CakePHPIntegration::$appName);

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

$absoluteFilePath = $renderHook->data['viewFileName'] ?? '';
$fileExtension = pathinfo($absoluteFilePath, PATHINFO_EXTENSION);
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
19 changes: 9 additions & 10 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 @@ -59,8 +61,7 @@ public static function init(): int
$stackedHttpKernelTracer = static function (SpanData $span) {
$span->name = 'drupal.httpkernel.handle';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
$span->meta[Tag::COMPONENT] = self::NAME;
Integration::setComponentMetadata($span, 'drupal');
};
// See Drupal\Core\DependencyInjection\Compiler\StackedKernelPass
// If a middleware is tagged with 'responder' => true, then the underlying middleware and the HTTP kernel
Expand All @@ -77,8 +78,7 @@ public static function init(): int
'prehook' => static function (SpanData $span) {
$span->name = 'drupal.kernel.boot';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
$span->meta[Tag::COMPONENT] = self::NAME;
Integration::setComponentMetadata($span, 'drupal');
}
]
);
Expand Down Expand Up @@ -123,8 +123,7 @@ static function (HookData $fnHookData) use ($hook, $module, $functionName) {
$span = $fnHookData->span();
$span->name = 'drupal.hook.' . $hook;
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('drupal');
$span->meta[Tag::COMPONENT] = self::NAME;
Integration::setComponentMetadata($span, 'drupal');

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

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

// @var \Drupal\views\Entity\View $storage
$storage = $this->storage;
Expand Down Expand Up @@ -239,6 +236,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 +394,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
37 changes: 32 additions & 5 deletions src/DDTrace/Integrations/Integration.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,10 @@ public static function handleInternalSpanServiceName(SpanData $span, string $fal
$flatServiceNames =
!$skipFlattening && \dd_trace_env_config('DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED');

$rootSpan = null;
if ($flatServiceNames) {
$rootSpan = \DDTrace\root_span();
if ($rootSpan) {
$service = $rootSpan->service;
} else {
$service = \ddtrace_config_app_name($fallbackName);
}
$service = $rootSpan ? $rootSpan->service : \ddtrace_config_app_name($fallbackName);
} else {
$service = $fallbackName;
}
Expand All @@ -97,6 +94,36 @@ public static function handleInternalSpanServiceName(SpanData $span, string $fal
$service = $mapping[$service];
}
$span->service = $service;
unset($span->meta['_dd.svc_src']);
if ($flatServiceNames) {
if ($rootSpan && isset($rootSpan->meta['_dd.svc_src'])) {
$span->meta['_dd.svc_src'] = $rootSpan->meta['_dd.svc_src'];
}
} else {
$span->meta['_dd.svc_src'] = $fallbackName;
}
}

public static function tagFrameworkServiceSource(SpanData $span, $integrationName)
{
if (\dd_trace_env_config('DD_SERVICE')) {
unset($span->meta['_dd.svc_src']);
} else {
$span->meta['_dd.svc_src'] = $integrationName;
}
}

/**
* Set the standard framework-integration metadata on a span.
* When DD_SERVICE is configured the user's value is left untouched.
*/
public static function setComponentMetadata(SpanData $span, $component, $service = null)
{
if (!\dd_trace_env_config('DD_SERVICE')) {
$span->service = $service ?? $component;
$span->meta['_dd.svc_src'] = $component;
}
$span->meta[Tag::COMPONENT] = $component;
}

public static function handleOrphan(SpanData $span)
Expand Down
27 changes: 15 additions & 12 deletions src/DDTrace/Integrations/Laminas/LaminasIntegration.php
Original file line number Diff line number Diff line change
Expand Up @@ -157,8 +157,7 @@ static function (SpanData $span) use ($className, $methodName) {
$span->name = 'laminas.mvcEventListener';
$span->resource = $className . '@' . $methodName;
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
Integration::setComponentMetadata($span, 'laminas');
}
);
}
Expand All @@ -174,12 +173,12 @@ static function (SpanData $span) {
$span->name = 'laminas.application.init';
$span->resource = 'laminas.application.init';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
Integration::setComponentMetadata($span, '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 @@ -192,8 +191,7 @@ static function (SpanData $span) {
$span->name = 'laminas.application.bootstrap';
$span->resource = 'laminas.application.bootstrap';
$span->type = Type::WEB_SERVLET;
$span->service = \ddtrace_config_app_name('laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
Integration::setComponentMetadata($span, 'laminas');
}
);

Expand All @@ -211,8 +209,7 @@ static function (SpanData $span) {
}

$span->name = "laminas.event.$eventName";
$span->service = \ddtrace_config_app_name('laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
Integration::setComponentMetadata($span, 'laminas');
}
]
);
Expand All @@ -225,8 +222,7 @@ static function (SpanData $span) {
$service = \ddtrace_config_app_name('laminas');
$span->name = 'laminas.application.run';
$span->type = Type::WEB_SERVLET;
$span->service = $service;
$span->meta[Tag::COMPONENT] = 'laminas';
Integration::setComponentMetadata($span, 'laminas', $service);
}
]
);
Expand Down Expand Up @@ -391,6 +387,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 +410,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 +431,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 +443,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 +455,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 +476,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 +498,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 +525,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 @@ -532,8 +536,7 @@ static function (SpanData $span, $args) {
'forward',
static function (SpanData $span, $args) {
$span->name = 'laminas.controller.forward';
$span->service = \ddtrace_config_app_name('laminas');
$span->meta[Tag::COMPONENT] = 'laminas';
Integration::setComponentMetadata($span, 'laminas');

$controllerName = $args[0];
if (isset($args[1]) && isset($args[1]['action'])) {
Expand Down
Loading
Loading