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..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 @@ -14,9 +14,13 @@ 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.AgentSpan; +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; @@ -121,20 +125,29 @@ 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 = 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 + && 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()); + } 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";