Skip to content

Commit 51f903a

Browse files
committed
Ensure helpers are injected on a classloader that has instrumented code.
1 parent 294320a commit 51f903a

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

dd-java-agent-ittests/src/test/java/com/datadoghq/agent/instrumentation/annotation/TraceAnnotationsTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ public class TraceAnnotationsTest {
2121

2222
@Before
2323
public void beforeTest() throws Exception {
24+
Class.forName("com.datadoghq.agent.InstrumentationRulesManager")
25+
.getMethod("registerClassLoad")
26+
.invoke(null);
2427
try {
2528
GlobalTracer.register(tracer);
2629
} catch (final Exception e) {

dd-java-agent/src/main/java/com/datadoghq/agent/TracingAgent.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@
2525

2626
import dd.trace.Instrumenter;
2727
import java.lang.instrument.Instrumentation;
28+
import java.lang.reflect.Method;
29+
import java.util.Collections;
2830
import java.util.ServiceLoader;
31+
import java.util.Set;
32+
import java.util.WeakHashMap;
2933
import lombok.extern.slf4j.Slf4j;
3034
import net.bytebuddy.agent.builder.AgentBuilder;
3135
import net.bytebuddy.description.type.TypeDescription;
@@ -103,6 +107,9 @@ public static void addByteBuddy(final Instrumentation inst) {
103107
@Slf4j
104108
static class Listener implements AgentBuilder.Listener {
105109

110+
private final Set<ClassLoader> initializedClassloaders =
111+
Collections.newSetFromMap(new WeakHashMap<ClassLoader, Boolean>());
112+
106113
@Override
107114
public void onError(
108115
final String typeName,
@@ -121,6 +128,26 @@ public void onTransformation(
121128
final boolean loaded,
122129
final DynamicType dynamicType) {
123130
log.debug("Transformed {}", typeDescription);
131+
132+
if (classLoader == null) {
133+
return;
134+
}
135+
synchronized (classLoader) {
136+
if (initializedClassloaders.contains(classLoader)) {
137+
return;
138+
}
139+
initializedClassloaders.add(classLoader);
140+
141+
try {
142+
final Class<?> rulesManager =
143+
Class.forName("com.datadoghq.agent.InstrumentationRulesManager", true, classLoader);
144+
final Method registerClassLoad =
145+
rulesManager.getDeclaredMethod("registerClassLoad", Object.class);
146+
registerClassLoad.invoke(null, classLoader);
147+
} catch (final Throwable e) {
148+
log.info("ClassLoad Registration for target " + classLoader, e);
149+
}
150+
}
124151
}
125152

126153
@Override

0 commit comments

Comments
 (0)