Skip to content

Commit

Permalink
Peer Service Precursors for DBM (#2664)
Browse files Browse the repository at this point in the history
* feat: Add dddb, ddh, and ddprs

* Update tests/Integration/DatabaseMonitoringTest.php

Co-authored-by: Bob Weinand <bob.weinand@datadoghq.com>

---------

Co-authored-by: Bob Weinand <bob.weinand@datadoghq.com>
  • Loading branch information
PROFeNoM and bwoebi committed May 17, 2024
1 parent 1aaebd8 commit 48190be
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 6 deletions.
37 changes: 32 additions & 5 deletions src/DDTrace/Integrations/DatabaseIntegrationHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,18 @@ public static function injectDatabaseIntegrationData(HookData $hook, $backend, $
}

$span = $hook->span();
$databaseService = $span->meta['peer.service'] ?? $span->service;

$query = self::propagateViaSqlComments($hook->args[$argNum], $databaseService, $propagationMode);
$targetHost = $span->meta[Tag::TARGET_HOST] ?? '';
$dbName = $span->meta[Tag::DB_NAME] ?? $span->meta[Tag::DB_INSTANCE] ?? '';
$peerService = $span->meta['peer.service'] ?? '';

$query = self::propagateViaSqlComments(
$hook->args[$argNum],
$span->service,
$propagationMode,
$targetHost,
$dbName,
$peerService
);
$hook->args[$argNum] = $query;
$hook->overrideArguments($hook->args);
if ($propagationMode == \DDTrace\DBM_PROPAGATION_FULL) {
Expand All @@ -55,13 +64,23 @@ public static function injectDatabaseIntegrationData(HookData $hook, $backend, $
}
}

public static function propagateViaSqlComments($query, $databaseService, $mode = \DDTrace\DBM_PROPAGATION_FULL)
{
public static function propagateViaSqlComments(
$query,
$databaseService,
$mode = \DDTrace\DBM_PROPAGATION_FULL,
$targetHost = '',
$dbName = '',
$peerService = ''
) {
$rootSpan = \DDTrace\root_span();

// Note: the order of the tags is relevant, they must be passed ordered alphabetically
$tags = [];

if ($dbName != "") {
$tags["dddb"] = $dbName;
}

if ($databaseService != "") {
$tags["dddbs"] = $databaseService;
}
Expand All @@ -74,6 +93,14 @@ public static function propagateViaSqlComments($query, $databaseService, $mode =
$tags["dde"] = $env;
}

if ($targetHost != "") {
$tags["ddh"] = $targetHost; // peer hostname
}

if ($peerService != "") {
$tags["ddprs"] = $peerService;
}

$service = $rootSpan->service ?? "";
if ($service == "") {
$service = ddtrace_config_app_name();
Expand Down
39 changes: 38 additions & 1 deletion tests/Integration/DatabaseMonitoringTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ public function testInjectionPeerService()
$hook->span()->service = "testdb";
$hook->span()->name = "instrumented";
$hook->span()->meta["peer.service"] = 'dbinstance';
$hook->span()->meta["db.name"] = 'myDatabase';
$hook->span()->meta["out.host"] = '127.0.0.1';
DatabaseIntegrationHelper::injectDatabaseIntegrationData($hook, 'mysql', 1);
});
self::putEnv("DD_TRACE_DEBUG_PRNG_SEED=42");
Expand All @@ -199,7 +201,7 @@ public function testInjectionPeerService()
}

// phpcs:disable Generic.Files.LineLength.TooLong
$this->assertRegularExpression('/^\/\*dddbs=\'dbinstance\',ddps=\'mapped-service\',traceparent=\'00-[0-9a-f]{16}c151df7d6ee5e2d6-a3978fb9b92502a8-01\'\*\/ SELECT 1$/', $commentedQuery);
$this->assertRegularExpression('/^\/\*dddb=\'myDatabase\',dddbs=\'testdb\',ddh=\'127.0.0.1\',ddprs=\'dbinstance\',ddps=\'mapped-service\',traceparent=\'00-[0-9a-f]{16}c151df7d6ee5e2d6-a3978fb9b92502a8-01\'\*\/ SELECT 1$/', $commentedQuery);
// phpcs:enable Generic.Files.LineLength.TooLong
$this->assertFlameGraph($traces, [
SpanAssertion::exists("phpunit")->withChildren([
Expand All @@ -212,6 +214,41 @@ public function testInjectionPeerService()
]);
}

public function testOrdering()
{
try {
$hook = \DDTrace\install_hook(self::class . "::instrumented", function (HookData $hook) {
$hook->span()->service = "testdb";
$hook->span()->name = "instrumented";
$hook->span()->meta["peer.service"] = 'dbinstance';
$hook->span()->meta["db.instance"] = 'myDatabase';
$hook->span()->meta["out.host"] = 'mysql';
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=phpunit:mapped-service");
self::putEnv("DD_ENV=prod");
self::putEnv("DD_VERSION=v6");
$traces = $this->isolateTracer(function () use (&$commentedQuery) {
\DDTrace\start_trace_span();
$commentedQuery = $this->instrumented(0, "SELECT 1");
\DDTrace\close_span();
});
} finally {
\DDTrace\remove_hook($hook);
}

$dbmComment = preg_replace('/^.*\/\*(.*)\*\/.*$/', '$1', $commentedQuery);
$dbmCommentParts = explode(',', $dbmComment);
$keys = array_map(function ($part) {
return explode('=', $part)[0];
}, $dbmCommentParts);
$sortedKeys = $keys;
sort($sortedKeys);
$this->assertSame($sortedKeys, $keys);
}

public function testEnvPropagation()
{
self::putEnv("DD_ENV=envtest");
Expand Down

0 comments on commit 48190be

Please sign in to comment.