From f9edb450746b40773046611cbe55dfdc1e193171 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Thu, 21 May 2026 12:46:37 +0200 Subject: [PATCH 1/5] feat(dbm): add dynamic_service propagation mode --- index.d.ts | 2 +- index.d.v5.ts | 2 +- packages/dd-trace/src/plugins/database.js | 7 +-- .../test/plugins/database-dbm-hash.spec.js | 48 +++++++++++++++++++ 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/index.d.ts b/index.d.ts index ebda67d996..a05960058b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -845,7 +845,7 @@ declare namespace tracer { * @env DD_DBM_PROPAGATION_MODE * Programmatic configuration takes precedence over the environment variables listed above. */ - dbmPropagationMode?: 'disabled' | 'service' | 'full' + dbmPropagationMode?: 'disabled' | 'service' | 'full' | 'dynamic_service' /** * Whether to enable Data Streams Monitoring. diff --git a/index.d.v5.ts b/index.d.v5.ts index b122c66ae7..c5218588f7 100644 --- a/index.d.v5.ts +++ b/index.d.v5.ts @@ -912,7 +912,7 @@ declare namespace tracer { * @env DD_DBM_PROPAGATION_MODE * Programmatic configuration takes precedence over the environment variables listed above. */ - dbmPropagationMode?: 'disabled' | 'service' | 'full' + dbmPropagationMode?: 'disabled' | 'service' | 'full' | 'dynamic_service' /** * Whether to enable Data Streams Monitoring. diff --git a/packages/dd-trace/src/plugins/database.js b/packages/dd-trace/src/plugins/database.js index 3ee4555d10..986bf197d6 100644 --- a/packages/dd-trace/src/plugins/database.js +++ b/packages/dd-trace/src/plugins/database.js @@ -97,8 +97,9 @@ class DatabasePlugin extends StoragePlugin { let dbmComment = servicePropagation - // Add propagation hash if both process tags and SQL base hash injection are enabled - if (propagationHash.isEnabled() && this.config['dbm.injectSqlBaseHash']) { + // Add propagation hash if process tags are enabled and either SQL base hash injection is enabled + // or dynamic_service mode implicitly enables it + if (propagationHash.isEnabled() && (this.config['dbm.injectSqlBaseHash'] || mode === 'dynamic_service')) { const hashBase64 = propagationHash.getHashBase64() if (hashBase64) { dbmComment += `,ddsh='${hashBase64}'` @@ -107,7 +108,7 @@ class DatabasePlugin extends StoragePlugin { } } - if (disableFullMode || mode === 'service') { + if (disableFullMode || mode === 'service' || mode === 'dynamic_service') { return dbmComment } else if (mode === 'full') { span.setTag('_dd.dbm_trace_injected', 'true') diff --git a/packages/dd-trace/test/plugins/database-dbm-hash.spec.js b/packages/dd-trace/test/plugins/database-dbm-hash.spec.js index 4036217e5c..57f8a29956 100644 --- a/packages/dd-trace/test/plugins/database-dbm-hash.spec.js +++ b/packages/dd-trace/test/plugins/database-dbm-hash.spec.js @@ -164,6 +164,54 @@ describe('DatabasePlugin DBM Hash', () => { }) }) + describe('dynamic_service mode', () => { + beforeEach(() => { + plugin.config.dbmPropagationMode = 'dynamic_service' + }) + + it('should inject hash even when dbm.injectSqlBaseHash is false', () => { + plugin.config['dbm.injectSqlBaseHash'] = false + + const comment = plugin.createDbmComment(span, 'test-service') + + assert.ok(comment, 'Comment should be created') + assert.ok(comment.includes("ddsh='AQIDBAUG'"), + 'dynamic_service should inject hash regardless of injectSqlBaseHash') + }) + + it('should not inject traceparent', () => { + const comment = plugin.createDbmComment(span, 'test-service') + + assert.ok(comment, 'Comment should be created') + assert.ok(!comment.includes('traceparent='), 'dynamic_service should not inject traceparent') + }) + + it('should behave identically to service + injectSqlBaseHash=true', () => { + plugin.config['dbm.injectSqlBaseHash'] = false + + const dynamicComment = plugin.createDbmComment(span, 'test-service') + + // Reset span tags and compare with service + injectSqlBaseHash=true + span._tags = {} + plugin.config.dbmPropagationMode = 'service' + plugin.config['dbm.injectSqlBaseHash'] = true + + const serviceComment = plugin.createDbmComment(span, 'test-service') + + assert.strictEqual(dynamicComment, serviceComment, + 'dynamic_service should produce identical output to service + injectSqlBaseHash=true') + }) + + it('should not inject hash when propagation hash is disabled', () => { + propagationHash.isEnabled = () => false + + const comment = plugin.createDbmComment(span, 'test-service') + + assert.ok(comment, 'Comment should still be created') + assert.ok(!comment.includes('ddsh='), 'Should not inject hash when propagation hash is disabled') + }) + }) + describe('control matrix for process tags and SQL base hash', () => { it('should inject hash when both propagateProcessTags and injectSqlBaseHash are enabled', () => { // DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=true + DD_DBM_INJECT_SQL_BASEHASH=true From 53b18e0c81a1d1600f256848a329a3facc93827d Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Tue, 26 May 2026 12:09:26 +0200 Subject: [PATCH 2/5] Add doc --- index.d.ts | 9 +++++++++ index.d.v5.ts | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/index.d.ts b/index.d.ts index e89dc1d87d..1f95c68dab 100644 --- a/index.d.ts +++ b/index.d.ts @@ -842,6 +842,15 @@ declare namespace tracer { /** * Enables DBM to APM link using tag injection. + * + * - `disabled`: No SQL comment is injected (default). + * - `service`: Injects a SQL comment with service-level tags (database name, service, environment, + * host, tracer service, tracer version). Enables DBM–APM correlation without full trace linking. + * - `full`: Same as `service`, plus a W3C `traceparent` for full distributed trace correlation. + * - `dynamic_service`: Same as `service`, but also automatically injects the propagation hash + * (`ddsh`) when process tags are enabled (`DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=true`). + * This is a convenience shorthand for `service` + `DD_DBM_INJECT_SQL_BASEHASH=true`. + * * @default 'disabled' * @env DD_DBM_PROPAGATION_MODE * Programmatic configuration takes precedence over the environment variables listed above. diff --git a/index.d.v5.ts b/index.d.v5.ts index c5218588f7..9d50093fbd 100644 --- a/index.d.v5.ts +++ b/index.d.v5.ts @@ -908,6 +908,15 @@ declare namespace tracer { /** * Enables DBM to APM link using tag injection. + * + * - `disabled`: No SQL comment is injected (default). + * - `service`: Injects a SQL comment with service-level tags (database name, service, environment, + * host, tracer service, tracer version). Enables DBM–APM correlation without full trace linking. + * - `full`: Same as `service`, plus a W3C `traceparent` for full distributed trace correlation. + * - `dynamic_service`: Same as `service`, but also automatically injects the propagation hash + * (`ddsh`) when process tags are enabled (`DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=true`). + * This is a convenience shorthand for `service` + `DD_DBM_INJECT_SQL_BASEHASH=true`. + * * @default 'disabled' * @env DD_DBM_PROPAGATION_MODE * Programmatic configuration takes precedence over the environment variables listed above. From 9ae7c53ea1addf8406ac0929109ab52f21933575 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Tue, 26 May 2026 12:14:56 +0200 Subject: [PATCH 3/5] add allowed section --- packages/dd-trace/src/config/supported-configurations.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/dd-trace/src/config/supported-configurations.json b/packages/dd-trace/src/config/supported-configurations.json index 772223c808..44acf75de3 100644 --- a/packages/dd-trace/src/config/supported-configurations.json +++ b/packages/dd-trace/src/config/supported-configurations.json @@ -640,7 +640,8 @@ "configurationNames": [ "dbmPropagationMode" ], - "default": "disabled" + "default": "disabled", + "allowed": "disabled|service|full|dynamic_service" } ], "DD_DOGSTATSD_HOST": [ From f3fcfe7c4fdbea2821f5e0f202866d828ae00e0a Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Tue, 26 May 2026 12:16:59 +0200 Subject: [PATCH 4/5] Update packages/dd-trace/src/config/supported-configurations.json Co-authored-by: Ruben Bridgewater --- packages/dd-trace/src/config/supported-configurations.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/dd-trace/src/config/supported-configurations.json b/packages/dd-trace/src/config/supported-configurations.json index 44acf75de3..e9485b13fe 100644 --- a/packages/dd-trace/src/config/supported-configurations.json +++ b/packages/dd-trace/src/config/supported-configurations.json @@ -641,7 +641,8 @@ "dbmPropagationMode" ], "default": "disabled", - "allowed": "disabled|service|full|dynamic_service" + "allowed": "disabled|service|full|dynamic_service", + "transform": "toLowerCase" } ], "DD_DOGSTATSD_HOST": [ From 4dfb204a0b389df3808810a6326c3c4461dfb4b6 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Tue, 26 May 2026 12:20:11 +0200 Subject: [PATCH 5/5] rerun generate config --- packages/dd-trace/src/config/generated-config-types.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dd-trace/src/config/generated-config-types.d.ts b/packages/dd-trace/src/config/generated-config-types.d.ts index 172393ba7a..1457c62d2d 100644 --- a/packages/dd-trace/src/config/generated-config-types.d.ts +++ b/packages/dd-trace/src/config/generated-config-types.d.ts @@ -65,7 +65,7 @@ export interface GeneratedConfig { dbm: { injectSqlBaseHash: boolean; }; - dbmPropagationMode: string; + dbmPropagationMode: "disabled" | "service" | "full" | "dynamic_service"; DD_ACTION_EXECUTION_ID: string | undefined; DD_AGENTLESS_LOG_SUBMISSION_ENABLED: boolean; DD_AGENTLESS_LOG_SUBMISSION_URL: string | undefined;