From 8ff985afdbaf3fdf8ddf1f6d42396cf70130625a Mon Sep 17 00:00:00 2001 From: Laplie Anderson Date: Thu, 23 Jan 2020 12:04:56 -0500 Subject: [PATCH] Cleaner way to skip netty executor's tasks --- .../ExecutorInstrumentationUtils.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) 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; }