diff --git a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java index 6967415e8d..c61aab869c 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java +++ b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java @@ -26,11 +26,24 @@ public class ExecutorInstrumentationUtils { * @return true iff given task object should be wrapped */ public static boolean shouldAttachStateToTask(final Object task, final Executor executor) { + if (task == null) { + return false; + } + final TraceScope scope = activeScope(); - return (scope != null + final Class enclosingClass = task.getClass().getEnclosingClass(); + + return scope != null && scope.isAsyncPropagating() - && task != null - && !ExecutorInstrumentationUtils.isExecutorDisabledForThisTask(executor, task)); + && !ExecutorInstrumentationUtils.isExecutorDisabledForThisTask(executor, task) + + // Don't instrument the executor's own runnables. These runnables may never return until + // netty shuts down. Any created continuations will be open until that time preventing + // traces from being reported + && (enclosingClass == null + || !enclosingClass + .getName() + .equals("io.netty.util.concurrent.SingleThreadEventExecutor")); } /** @@ -47,20 +60,13 @@ public class ExecutorInstrumentationUtils { final State state = contextStore.putIfAbsent(task, State.FACTORY); - // Don't instrument the executor's own runnables. These runnables may never return until - // netty shuts down. Any created continuations will be open until that time preventing traces - // from being reported - if (!task.getClass() - .getName() - .startsWith("io.netty.util.concurrent.SingleThreadEventExecutor$")) { - - final TraceScope.Continuation continuation = scope.capture(); - if (state.setContinuation(continuation)) { - log.debug("created continuation {} from scope {}, state: {}", continuation, scope, state); - } else { - continuation.close(false); - } + final TraceScope.Continuation continuation = scope.capture(); + if (state.setContinuation(continuation)) { + log.debug("created continuation {} from scope {}, state: {}", continuation, scope, state); + } else { + continuation.close(false); } + return state; }