diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ExcludeFilter.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ExcludeFilter.java index df6aa9f8a81..cc021a8f27c 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ExcludeFilter.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ExcludeFilter.java @@ -99,6 +99,8 @@ private static EnumSet exclude(Class clazz) { SKIP_TYPE_PREFIXES .get(ExcludeType.EXECUTOR) .add("io.netty.util.concurrent.SingleThreadEventExecutor."); + // OkHttp's TaskRunner Runnable is a long-lived worker loop, not a single submitted task. + SKIP_TYPE_PREFIXES.get(ExcludeType.RUNNABLE).add("okhttp3.internal.concurrent.TaskRunner$"); // Don't wrap Runnables belonging to NioEventLoop(s) as they want to propagate CloseException // outside of the event loop on close() and wrapping them in FutureTask interferes with that SKIP_TYPE_PREFIXES.get(ExcludeType.RUNNABLE).add("com.aerospike.client.async.NioEventLoop"); diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/ExcludeFilterTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/ExcludeFilterTest.groovy index 168b0923498..f88f5c4b7c7 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/ExcludeFilterTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/ExcludeFilterTest.groovy @@ -46,6 +46,12 @@ class ExcludeFilterTest extends DDSpecification { type << ExcludeFilter.ExcludeType.values() } + def "exclude OkHttp TaskRunner worker from Runnable propagation"() { + expect: + ExcludeFilter.exclude(RUNNABLE, 'okhttp3.internal.concurrent.TaskRunner$runnable$1') + !ExcludeFilter.exclude(EXECUTOR, 'okhttp3.internal.concurrent.TaskRunner$runnable$1') + } + static class One {} static class Another {}