Skip to content

Commit

Permalink
Fix dddbs service mapping (#2413)
Browse files Browse the repository at this point in the history
* fix: dddbs service mapping

* Refactor service mapping to a more general location

* tests: Fix DBM Tests

* test: Add `DD_DBM_PROPAGATION_MODE=[none|service]` scenario
  • Loading branch information
PROFeNoM authored Dec 19, 2023
1 parent f8f6d29 commit c79b253
Show file tree
Hide file tree
Showing 2 changed files with 129 additions and 3 deletions.
12 changes: 9 additions & 3 deletions src/Integrations/Integrations/Integration.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,13 +167,19 @@ public static function handleInternalSpanServiceName(SpanData $span, $fallbackNa
if ($flatServiceNames) {
$rootSpan = \DDTrace\root_span();
if ($rootSpan) {
$span->service = $rootSpan->service;
$service = $rootSpan->service;
} else {
$span->service = \ddtrace_config_app_name($fallbackName);
$service = \ddtrace_config_app_name($fallbackName);
}
} else {
$span->service = $fallbackName;
$service = $fallbackName;
}

$mapping = \dd_trace_env_config('DD_SERVICE_MAPPING');
if (isset($mapping[$service])) {
$service = $mapping[$service];
}
$span->service = $service;
}
}

Expand Down
120 changes: 120 additions & 0 deletions tests/Integration/DatabaseMonitoringTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use DDTrace\HookData;
use DDTrace\Integrations\DatabaseIntegrationHelper;
use DDTrace\Integrations\Integration;
use DDTrace\Tests\Common\IntegrationTestCase;
use DDTrace\Tests\Common\SpanAssertion;

Expand Down Expand Up @@ -57,6 +58,125 @@ public function testInjection()
]);
}

public function testInjectionServiceMappingOnce()
{
try {
$hook = \DDTrace\install_hook(self::class . "::instrumented", function (HookData $hook) {
$span = $hook->span();
Integration::handleInternalSpanServiceName($span, "pdo");
$span->name = "instrumented";
DatabaseIntegrationHelper::injectDatabaseIntegrationData($hook, 'mysql', 1);
});
self::putEnv("DD_TRACE_DEBUG_PRNG_SEED=42");
self::putEnv("DD_DBM_PROPAGATION_MODE=full");
self::putEnv("DD_SERVICE_MAPPING=pdo:mapped-service");
$traces = $this->isolateTracer(function () use (&$commentedQuery) {
\DDTrace\start_trace_span();
$commentedQuery = $this->instrumented(0, "SELECT 1");
\DDTrace\close_span();
});
} finally {
\DDTrace\remove_hook($hook);
}

$this->assertRegularExpression('/^\/\*dddbs=\'mapped-service\',ddps=\'phpunit\',traceparent=\'00-[0-9a-f]{16}c151df7d6ee5e2d6-a3978fb9b92502a8-01\'\*\/ SELECT 1$/', $commentedQuery);
$this->assertFlameGraph($traces, [
SpanAssertion::exists("phpunit")->withChildren([
SpanAssertion::exists('instrumented')->withExactTags([
"_dd.dbm_trace_injected" => "true",
"_dd.base_service" => "mapped-service",
])
])
]);
}

public function testInjectionServiceMappingTwice()
{
try {
$hook = \DDTrace\install_hook(self::class . "::instrumented", function (HookData $hook) {
$span = $hook->span();
Integration::handleInternalSpanServiceName($span, "pdo");
$span->name = "instrumented";
DatabaseIntegrationHelper::injectDatabaseIntegrationData($hook, 'mysql', 1);
});
self::putEnv("DD_TRACE_DEBUG_PRNG_SEED=42");
self::putEnv("DD_DBM_PROPAGATION_MODE=full");
self::putEnv("DD_SERVICE_MAPPING=pdo:mapped-service");
// Note that here, we don't start a new trace, hence the service mapping should apply to both dddbs & ddps
$traces = $this->isolateTracer(function () use (&$commentedQuery) {
$commentedQuery = $this->instrumented(0, "SELECT 1");
});
} finally {
\DDTrace\remove_hook($hook);
}

$this->assertRegularExpression('/^\/\*dddbs=\'mapped-service\',ddps=\'mapped-service\',traceparent=\'00-[0-9a-f]{16}c151df7d6ee5e2d6-c151df7d6ee5e2d6-01\'\*\/ SELECT 1$/', $commentedQuery);
$this->assertFlameGraph($traces, [
SpanAssertion::exists('instrumented')->withExactTags([
"_dd.dbm_trace_injected" => "true",
"_dd.base_service" => "mapped-service",
])
]);
}

public function testInjectionServiceMappingService()
{
try {
$hook = \DDTrace\install_hook(self::class . "::instrumented", function (HookData $hook) {
$span = $hook->span();
Integration::handleInternalSpanServiceName($span, "pdo");
$span->name = "instrumented";
DatabaseIntegrationHelper::injectDatabaseIntegrationData($hook, 'mysql', 1);
});
self::putEnv("DD_TRACE_DEBUG_PRNG_SEED=42");
self::putEnv("DD_DBM_PROPAGATION_MODE=service");
self::putEnv("DD_SERVICE_MAPPING=pdo:mapped-service");
// Note that here, we don't start a new trace, hence the service mapping should apply to both dddbs & ddps
$traces = $this->isolateTracer(function () use (&$commentedQuery) {
$commentedQuery = $this->instrumented(0, "SELECT 1");
});
} finally {
\DDTrace\remove_hook($hook);
}

$this->assertRegularExpression('/^\/\*dddbs=\'mapped-service\',ddps=\'mapped-service\'\*\/ SELECT 1$/', $commentedQuery);
$this->assertFlameGraph($traces, [
SpanAssertion::exists('instrumented')->withExactTags([
"_dd.dbm_trace_injected" => "true",
"_dd.base_service" => "mapped-service",
])
]);
}

public function testInjectionServiceMappingNone()
{
try {
$hook = \DDTrace\install_hook(self::class . "::instrumented", function (HookData $hook) {
$span = $hook->span();
Integration::handleInternalSpanServiceName($span, "pdo");
$span->name = "instrumented";
DatabaseIntegrationHelper::injectDatabaseIntegrationData($hook, 'mysql', 1);
});
self::putEnv("DD_TRACE_DEBUG_PRNG_SEED=42");
self::putEnv("DD_DBM_PROPAGATION_MODE=none");
self::putEnv("DD_SERVICE_MAPPING=pdo:mapped-service");
// Note that here, we don't start a new trace, hence the service mapping should apply to both dddbs & ddps
$traces = $this->isolateTracer(function () use (&$commentedQuery) {
$commentedQuery = $this->instrumented(0, "SELECT 1");
});
} finally {
\DDTrace\remove_hook($hook);
}

$this->assertSame('SELECT 1', $commentedQuery);
$this->assertFlameGraph($traces, [
SpanAssertion::exists('instrumented')->withExactTags([
"_dd.dbm_trace_injected" => "true",
"_dd.base_service" => "mapped-service",
])
]);
}

public function testInjectionPeerService()
{
try {
Expand Down

0 comments on commit c79b253

Please sign in to comment.