Skip to content

Commit f52825e

Browse files
committed
fix(virtual-thread): Prevent duplicate instrumentation conflict between VirtualThread and Runnable
1 parent e16815c commit f52825e

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

dd-java-agent/instrumentation/java/java-lang/java-lang-21.0/src/main/java/datadog/trace/instrumentation/java/lang/jdk21/VirtualThreadInstrumentation.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,25 @@
66
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState.activateAndContinueContinuation;
77
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState.captureContinuation;
88
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState.closeScope;
9+
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE;
910
import static datadog.trace.bootstrap.instrumentation.java.lang.VirtualThreadHelper.AGENT_SCOPE_CLASS_NAME;
1011
import static datadog.trace.bootstrap.instrumentation.java.lang.VirtualThreadHelper.VIRTUAL_THREAD_CLASS_NAME;
12+
import static java.util.Collections.singletonList;
13+
import static java.util.Collections.singletonMap;
1114
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
1215
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1316

1417
import com.google.auto.service.AutoService;
1518
import datadog.environment.JavaVirtualMachine;
19+
import datadog.trace.agent.tooling.ExcludeFilterProvider;
1620
import datadog.trace.agent.tooling.Instrumenter;
1721
import datadog.trace.agent.tooling.InstrumenterModule;
1822
import datadog.trace.bootstrap.ContextStore;
1923
import datadog.trace.bootstrap.InstrumentationContext;
2024
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
2125
import datadog.trace.bootstrap.instrumentation.java.concurrent.ConcurrentState;
26+
import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter;
27+
import java.util.Collection;
2228
import java.util.HashMap;
2329
import java.util.Map;
2430
import net.bytebuddy.asm.Advice;
@@ -63,7 +69,10 @@
6369
@SuppressWarnings("unused")
6470
@AutoService(InstrumenterModule.class)
6571
public final class VirtualThreadInstrumentation extends InstrumenterModule.ContextTracking
66-
implements Instrumenter.ForBootstrap, Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
72+
implements Instrumenter.ForBootstrap,
73+
Instrumenter.ForSingleType,
74+
Instrumenter.HasMethodAdvice,
75+
ExcludeFilterProvider {
6776

6877
public VirtualThreadInstrumentation() {
6978
super("java-lang", "java-lang-21", "virtual-thread");
@@ -79,6 +88,12 @@ public boolean isEnabled() {
7988
return JavaVirtualMachine.isJavaVersionAtLeast(21) && super.isEnabled();
8089
}
8190

91+
@Override
92+
public Map<ExcludeFilter.ExcludeType, ? extends Collection<String>> excludedClasses() {
93+
// VirtualThread context is activated on mount/unmount, not on Runnable.run().
94+
return singletonMap(RUNNABLE, singletonList(VIRTUAL_THREAD_CLASS_NAME));
95+
}
96+
8297
@Override
8398
public Map<String, String> contextStore() {
8499
Map<String, String> contextStore = new HashMap<>();

0 commit comments

Comments
 (0)