Skip to content

Commit b9f26e6

Browse files
committed
Disable pool.waiting by default, other tweaks
- Use dd.trace.experimental.jdbc.pool.waiting.enabled=true to enable. - Change instrumentation name from jdbc-datasource to jdbc. - Record exceptions. - Use default instrumentation name (jdbc). - Set resource name to {dbcp2,hikari}.waiting
1 parent 92e2d9e commit b9f26e6

File tree

10 files changed

+83
-11
lines changed

10 files changed

+83
-11
lines changed

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/Dbcp2LinkedBlockingDequeInstrumentation.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.google.auto.service.AutoService;
88
import datadog.trace.agent.tooling.Instrumenter;
99
import datadog.trace.agent.tooling.InstrumenterModule;
10+
import datadog.trace.api.InstrumenterConfig;
1011
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
1112
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1213
import net.bytebuddy.asm.Advice;
@@ -16,7 +17,12 @@ public final class Dbcp2LinkedBlockingDequeInstrumentation extends InstrumenterM
1617
implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice {
1718

1819
public Dbcp2LinkedBlockingDequeInstrumentation() {
19-
super("jdbc-datasource");
20+
super("jdbc");
21+
}
22+
23+
@Override
24+
protected boolean defaultEnabled() {
25+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
2026
}
2127

2228
@Override
@@ -40,15 +46,21 @@ public static class PollFirstAdvice {
4046
@Advice.OnMethodEnter(suppress = Throwable.class)
4147
public static AgentSpan onEnter() {
4248
if (CallDepthThreadLocalMap.getCallDepth(Dbcp2LinkedBlockingDequeInstrumentation.class) > 0) {
43-
return startSpan("dbcp2", POOL_WAITING);
49+
AgentSpan span = startSpan(POOL_WAITING);
50+
span.setResourceName("dbcp2.waiting");
51+
return span;
4452
} else {
4553
return null;
4654
}
4755
}
4856

4957
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
50-
public static void onExit(@Advice.Enter final AgentSpan span) {
58+
public static void onExit(
59+
@Advice.Enter final AgentSpan span, @Advice.Thrown final Throwable throwable) {
5160
if (span != null) {
61+
if (throwable != null) {
62+
span.addThrowable(throwable);
63+
}
5264
span.finish();
5365
}
5466
}

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/Dbcp2ManagedConnectionInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.api.InstrumenterConfig;
89
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
910
import net.bytebuddy.asm.Advice;
1011

@@ -13,7 +14,12 @@ public final class Dbcp2ManagedConnectionInstrumentation extends InstrumenterMod
1314
implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice {
1415

1516
public Dbcp2ManagedConnectionInstrumentation() {
16-
super("jdbc-datasource");
17+
super("jdbc");
18+
}
19+
20+
@Override
21+
protected boolean defaultEnabled() {
22+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
1723
}
1824

1925
@Override

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/Dbcp2PerUserPoolDataSourceInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.api.InstrumenterConfig;
89
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
910
import net.bytebuddy.asm.Advice;
1011

@@ -13,7 +14,12 @@ public final class Dbcp2PerUserPoolDataSourceInstrumentation extends Instrumente
1314
implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice {
1415

1516
public Dbcp2PerUserPoolDataSourceInstrumentation() {
16-
super("jdbc-datasource");
17+
super("jdbc");
18+
}
19+
20+
@Override
21+
protected boolean defaultEnabled() {
22+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
1723
}
1824

1925
@Override

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/Dbcp2PoolingDataSourceInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.api.InstrumenterConfig;
89
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
910
import net.bytebuddy.asm.Advice;
1011

@@ -13,7 +14,12 @@ public final class Dbcp2PoolingDataSourceInstrumentation extends InstrumenterMod
1314
implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice {
1415

1516
public Dbcp2PoolingDataSourceInstrumentation() {
16-
super("jdbc-datasource");
17+
super("jdbc");
18+
}
19+
20+
@Override
21+
protected boolean defaultEnabled() {
22+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
1723
}
1824

1925
@Override

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/Dbcp2PoolingDriverInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.api.InstrumenterConfig;
89
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
910
import net.bytebuddy.asm.Advice;
1011

@@ -13,7 +14,12 @@ public final class Dbcp2PoolingDriverInstrumentation extends InstrumenterModule.
1314
implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice {
1415

1516
public Dbcp2PoolingDriverInstrumentation() {
16-
super("jdbc-datasource");
17+
super("jdbc");
18+
}
19+
20+
@Override
21+
protected boolean defaultEnabled() {
22+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
1723
}
1824

1925
@Override

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/Dbcp2SharedPoolDataSourceInstrumentation.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.google.auto.service.AutoService;
66
import datadog.trace.agent.tooling.Instrumenter;
77
import datadog.trace.agent.tooling.InstrumenterModule;
8+
import datadog.trace.api.InstrumenterConfig;
89
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
910
import net.bytebuddy.asm.Advice;
1011

@@ -13,7 +14,12 @@ public final class Dbcp2SharedPoolDataSourceInstrumentation extends Instrumenter
1314
implements Instrumenter.ForKnownTypes, Instrumenter.HasMethodAdvice {
1415

1516
public Dbcp2SharedPoolDataSourceInstrumentation() {
16-
super("jdbc-datasource");
17+
super("jdbc");
18+
}
19+
20+
@Override
21+
protected boolean defaultEnabled() {
22+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
1723
}
1824

1925
@Override

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/HikariConcurrentBagInstrumentation.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.zaxxer.hikari.util.ConcurrentBag;
1212
import datadog.trace.agent.tooling.Instrumenter;
1313
import datadog.trace.agent.tooling.InstrumenterModule;
14+
import datadog.trace.api.InstrumenterConfig;
1415
import datadog.trace.bootstrap.InstrumentationContext;
1516
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1617
import java.lang.reflect.Field;
@@ -27,7 +28,12 @@ public final class HikariConcurrentBagInstrumentation extends InstrumenterModule
2728
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
2829

2930
public HikariConcurrentBagInstrumentation() {
30-
super("jdbc-datasource");
31+
super("jdbc");
32+
}
33+
34+
@Override
35+
protected boolean defaultEnabled() {
36+
return InstrumenterConfig.get().isJdbcPoolWaitingEnabled();
3137
}
3238

3339
@Override
@@ -106,13 +112,17 @@ public static void stopSpan(
106112
@Advice.Thrown final Throwable throwable) {
107113
if (HikariBlockedTracker.wasBlocked()) {
108114
final AgentSpan span =
109-
startSpan("hikari", POOL_WAITING, TimeUnit.MILLISECONDS.toMicros(startTimeMillis));
115+
startSpan(POOL_WAITING, TimeUnit.MILLISECONDS.toMicros(startTimeMillis));
116+
span.setResourceName("hikari.waiting");
117+
if (throwable != null) {
118+
span.addThrowable(throwable);
119+
}
110120
final String poolName =
111121
InstrumentationContext.get(ConcurrentBag.class, String.class).get(thiz);
112122
if (poolName != null) {
113123
span.setTag(DB_POOL_NAME, poolName);
114124
}
115-
// XXX should we do anything with the throwable?
125+
116126
span.finish();
117127
}
118128
HikariBlockedTracker.clearBlocked();

dd-java-agent/instrumentation/jdbc/src/test/groovy/SaturatedPoolBlockingTest.groovy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,20 @@ import java.sql.SQLTimeoutException
1616
import java.sql.SQLTransientConnectionException
1717
import java.time.Duration
1818

19+
import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_POOL_WAITING_ENABLED
20+
1921
/**
2022
* Ideas taken from Hikari's com.zaxxer.hikari.pool.TestSaturatedPool830.
2123
*/
2224
class SaturatedPoolBlockingTest extends AgentTestRunner {
2325
public static final int CONNECTION_TIMEOUT = 1000
2426

27+
@Override
28+
void configurePreAgent() {
29+
super.configurePreAgent()
30+
injectSysConfig(JDBC_POOL_WAITING_ENABLED, "true")
31+
}
32+
2533
def "saturated pool test"(Closure<DataSource> createDataSource, Long exhaustPoolForMillis, int expectedWaitingSpans, boolean expectedTimeout) {
2634
setup:
2735
TEST_WRITER.setFilter((trace) -> trace.get(0).getOperationName() == "test.when")

dd-trace-api/src/main/java/datadog/trace/api/config/TraceInstrumentationConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ public final class TraceInstrumentationConfig {
7272

7373
public static final String JDBC_CONNECTION_CLASS_NAME = "trace.jdbc.connection.class.name";
7474

75+
public static final String JDBC_POOL_WAITING_ENABLED =
76+
"trace.experimental.jdbc.pool.waiting.enabled";
77+
7578
public static final String AKKA_FORK_JOIN_TASK_NAME = "trace.akka.fork.join.task.name";
7679
public static final String AKKA_FORK_JOIN_EXECUTOR_TASK_NAME =
7780
"trace.akka.fork.join.executor.task.name";

internal-api/src/main/java/datadog/trace/api/InstrumenterConfig.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import static datadog.trace.api.config.TraceInstrumentationConfig.INTEGRATIONS_ENABLED;
4646
import static datadog.trace.api.config.TraceInstrumentationConfig.JAX_RS_ADDITIONAL_ANNOTATIONS;
4747
import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_CONNECTION_CLASS_NAME;
48+
import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_POOL_WAITING_ENABLED;
4849
import static datadog.trace.api.config.TraceInstrumentationConfig.JDBC_PREPARED_STATEMENT_CLASS_NAME;
4950
import static datadog.trace.api.config.TraceInstrumentationConfig.MEASURE_METHODS;
5051
import static datadog.trace.api.config.TraceInstrumentationConfig.RESOLVER_CACHE_CONFIG;
@@ -128,6 +129,7 @@ public class InstrumenterConfig {
128129

129130
private final String jdbcPreparedStatementClassName;
130131
private final String jdbcConnectionClassName;
132+
private final boolean jdbcPoolWaitingEnabled;
131133

132134
private final String httpURLConnectionClassName;
133135
private final String axisTransportClassName;
@@ -235,6 +237,7 @@ private InstrumenterConfig() {
235237
jdbcPreparedStatementClassName =
236238
configProvider.getString(JDBC_PREPARED_STATEMENT_CLASS_NAME, "");
237239
jdbcConnectionClassName = configProvider.getString(JDBC_CONNECTION_CLASS_NAME, "");
240+
jdbcPoolWaitingEnabled = configProvider.getBoolean(JDBC_POOL_WAITING_ENABLED, false);
238241

239242
httpURLConnectionClassName = configProvider.getString(HTTP_URL_CONNECTION_CLASS_NAME, "");
240243
axisTransportClassName = configProvider.getString(AXIS_TRANSPORT_CLASS_NAME, "");
@@ -411,6 +414,10 @@ public String getJdbcConnectionClassName() {
411414
return jdbcConnectionClassName;
412415
}
413416

417+
public boolean isJdbcPoolWaitingEnabled() {
418+
return jdbcPoolWaitingEnabled;
419+
}
420+
414421
public String getHttpURLConnectionClassName() {
415422
return httpURLConnectionClassName;
416423
}
@@ -620,6 +627,8 @@ public String toString() {
620627
+ ", jdbcConnectionClassName='"
621628
+ jdbcConnectionClassName
622629
+ '\''
630+
+ ", jdbcPoolWaitingEnabled="
631+
+ jdbcPoolWaitingEnabled
623632
+ ", httpURLConnectionClassName='"
624633
+ httpURLConnectionClassName
625634
+ '\''

0 commit comments

Comments
 (0)