From 3b8fab5d78e95f7fb8c7e82e7db988d1d33282e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Tue, 27 Jan 2026 14:48:17 +0100 Subject: [PATCH 1/2] write base hash to current span when injected in DBM comment --- .../jdbc/DBMCompatibleConnectionInstrumentation.java | 11 +++++++++++ .../trace/bootstrap/instrumentation/api/Tags.java | 1 + 2 files changed, 12 insertions(+) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java index 4d0de9e3b27..2e0de16df90 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java @@ -14,9 +14,12 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.api.BaseHash; +import datadog.trace.api.Config; import datadog.trace.bootstrap.CallDepthThreadLocalMap; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.api.Tags; import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; import java.sql.Connection; @@ -132,9 +135,17 @@ public static String onEnter( boolean append = DECORATE.DBM_ALWAYS_APPEND_SQL_COMMENT || "sqlserver".equals(dbInfo.getType()); + String originalSql = sql; sql = SQLCommenter.inject( sql, dbService, dbInfo.getType(), dbInfo.getHost(), dbInfo.getDb(), null, append); + if (sql != originalSql // intentional reference comparison to check if injection happened + && Config.get().isDbmInjectSqlBaseHash() + && Config.get().isExperimentalPropagateProcessTagsEnabled()) { + // if the base hash was injected in the comment, we need to write it to the span as well, + // so that the query and the span can be re-matched in the backed + activeSpan().setTag(Tags.BASE_HASH, BaseHash.getBaseHashStr()); + } return inputSql; } diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/Tags.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/Tags.java index 20629daf051..086688f4bf9 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/Tags.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/Tags.java @@ -48,6 +48,7 @@ public class Tags { public static final String DB_SCHEMA = "db.schema"; public static final String MESSAGE_BUS_DESTINATION = "message_bus.destination"; public static final String DB_POOL_NAME = "db.pool.name"; + public static final String BASE_HASH = "_dd.propagated_hash"; public static final String TEST_SESSION_NAME = "test_session.name"; public static final String TEST_MODULE = "test.module"; From b01fb29af09d722cb35cb2c51e89c7d047f262c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vandon?= Date: Tue, 27 Jan 2026 15:06:38 +0100 Subject: [PATCH 2/2] check activespan for null --- .../jdbc/DBMCompatibleConnectionInstrumentation.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java index 2e0de16df90..9245d36b663 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/DBMCompatibleConnectionInstrumentation.java @@ -19,6 +19,7 @@ import datadog.trace.bootstrap.CallDepthThreadLocalMap; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.Tags; import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; @@ -124,13 +125,13 @@ public static String onEnter( return null; } final String inputSql = sql; + final AgentSpan activeSpan = activeSpan(); final DBInfo dbInfo = JDBCDecorator.parseDBInfo( connection, InstrumentationContext.get(Connection.class, DBInfo.class)); String dbService = DECORATE.getDbService(dbInfo); if (dbService != null) { - dbService = - traceConfig(activeSpan()).getServiceMapping().getOrDefault(dbService, dbService); + dbService = traceConfig(activeSpan).getServiceMapping().getOrDefault(dbService, dbService); } boolean append = @@ -140,11 +141,12 @@ public static String onEnter( SQLCommenter.inject( sql, dbService, dbInfo.getType(), dbInfo.getHost(), dbInfo.getDb(), null, append); if (sql != originalSql // intentional reference comparison to check if injection happened + && activeSpan != null && Config.get().isDbmInjectSqlBaseHash() && Config.get().isExperimentalPropagateProcessTagsEnabled()) { // if the base hash was injected in the comment, we need to write it to the span as well, // so that the query and the span can be re-matched in the backed - activeSpan().setTag(Tags.BASE_HASH, BaseHash.getBaseHashStr()); + activeSpan.setTag(Tags.BASE_HASH, BaseHash.getBaseHashStr()); } return inputSql; }