Skip to content

Commit 26c11f4

Browse files
mccullsmtoffl01
authored andcommitted
Be consistent when deciding when to do async propagation (#8555)
i.e. we should have a non-null, valid span and the async propagation flag should be set (also remove some unused variables in the executor advice)
1 parent 0a8bc73 commit 26c11f4

File tree

5 files changed

+13
-24
lines changed

5 files changed

+13
-24
lines changed

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/AdviceUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public static <T> void cancelTask(ContextStore<T, State> contextStore, final T t
5252

5353
public static <T> void capture(ContextStore<T, State> contextStore, T task) {
5454
AgentSpan span = activeSpan();
55-
if (span != null && isAsyncPropagationEnabled()) {
55+
if (span != null && span.isValid() && isAsyncPropagationEnabled()) {
5656
State state = contextStore.get(task);
5757
if (null == state) {
5858
state = State.FACTORY.create();

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
package datadog.trace.bootstrap.instrumentation.java.concurrent;
22

3-
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
43
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled;
54
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType;
65

76
import datadog.trace.bootstrap.ContextStore;
87
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
9-
import java.util.concurrent.Executor;
108
import org.slf4j.Logger;
119
import org.slf4j.LoggerFactory;
1210

@@ -19,17 +17,17 @@ public final class ExecutorInstrumentationUtils {
1917
* Checks if given task should get state attached.
2018
*
2119
* @param task task object
22-
* @param executor executor this task was scheduled on
20+
* @param span active span
2321
* @return true iff given task object should be wrapped
2422
*/
25-
public static boolean shouldAttachStateToTask(final Object task, final Executor executor) {
23+
public static boolean shouldAttachStateToTask(final Object task, final AgentSpan span) {
2624
if (task == null) {
2725
return false;
2826
}
2927
if (ExcludeFilter.exclude(ExcludeType.EXECUTOR, task)) {
3028
return false;
3129
}
32-
return activeSpan() != null && isAsyncPropagationEnabled();
30+
return span != null && span.isValid() && isAsyncPropagationEnabled();
3331
}
3432

3533
/**
@@ -57,12 +55,10 @@ public static <T> State setupState(
5755
/**
5856
* Clean up after job submission method has exited.
5957
*
60-
* @param executor the current executor
6158
* @param state task instrumentation state
6259
* @param throwable throwable that may have been thrown
6360
*/
64-
public static void cleanUpOnMethodExit(
65-
final Executor executor, final State state, final Throwable throwable) {
61+
public static void cleanUpOnMethodExit(final State state, final Throwable throwable) {
6662
if (null != state && null != throwable) {
6763
/*
6864
Note: this may potentially close somebody else's continuation if we didn't set it

dd-java-agent/instrumentation/guava-10/src/main/java/datadog/trace/instrumentation/guava10/ListenableFutureInstrumentation.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,14 +54,13 @@ public void methodAdvice(MethodTransformer transformer) {
5454
public static class AddListenerAdvice {
5555
@Advice.OnMethodEnter(suppress = Throwable.class)
5656
public static State addListenerEnter(
57-
@Advice.Argument(value = 0, readOnly = false) Runnable task,
58-
@Advice.Argument(1) final Executor executor) {
57+
@Advice.Argument(value = 0, readOnly = false) Runnable task) {
5958
final AgentSpan span = activeSpan();
6059
if (null != span) {
6160
final Runnable newTask = RunnableWrapper.wrapIfNeeded(task);
6261
// It is important to check potentially wrapped task if we can instrument task in this
6362
// executor. Some executors do not support wrapped tasks.
64-
if (ExecutorInstrumentationUtils.shouldAttachStateToTask(newTask, executor)) {
63+
if (ExecutorInstrumentationUtils.shouldAttachStateToTask(newTask, span)) {
6564
task = newTask;
6665
final ContextStore<Runnable, State> contextStore =
6766
InstrumentationContext.get(Runnable.class, State.class);
@@ -73,10 +72,8 @@ public static State addListenerEnter(
7372

7473
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
7574
public static void addListenerExit(
76-
@Advice.Argument(1) final Executor executor,
77-
@Advice.Enter final State state,
78-
@Advice.Thrown final Throwable throwable) {
79-
ExecutorInstrumentationUtils.cleanUpOnMethodExit(executor, state, throwable);
75+
@Advice.Enter final State state, @Advice.Thrown final Throwable throwable) {
76+
ExecutorInstrumentationUtils.cleanUpOnMethodExit(state, throwable);
8077
}
8178

8279
private static void muzzleCheck(final AbstractFuture<?> future) {

dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/executor/JavaExecutorInstrumentation.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import datadog.trace.bootstrap.instrumentation.java.concurrent.State;
1616
import java.util.Collections;
1717
import java.util.Map;
18-
import java.util.concurrent.Executor;
1918
import java.util.concurrent.RunnableFuture;
2019
import net.bytebuddy.asm.Advice;
2120

@@ -38,7 +37,6 @@ public static class SetExecuteRunnableStateAdvice {
3837

3938
@Advice.OnMethodEnter(suppress = Throwable.class)
4039
public static State enterJobSubmit(
41-
@Advice.This final Executor executor,
4240
@Advice.Argument(value = 0, readOnly = false) Runnable task) {
4341
if (task instanceof RunnableFuture) {
4442
return null;
@@ -51,7 +49,7 @@ public static State enterJobSubmit(
5149
final Runnable newTask = RunnableWrapper.wrapIfNeeded(task);
5250
// It is important to check potentially wrapped task if we can instrument task in this
5351
// executor. Some executors do not support wrapped tasks.
54-
if (ExecutorInstrumentationUtils.shouldAttachStateToTask(newTask, executor)) {
52+
if (ExecutorInstrumentationUtils.shouldAttachStateToTask(newTask, span)) {
5553
task = newTask;
5654
final ContextStore<Runnable, State> contextStore =
5755
InstrumentationContext.get(Runnable.class, State.class);
@@ -63,10 +61,8 @@ public static State enterJobSubmit(
6361

6462
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
6563
public static void exitJobSubmit(
66-
@Advice.This final Executor executor,
67-
@Advice.Enter final State state,
68-
@Advice.Thrown final Throwable throwable) {
69-
ExecutorInstrumentationUtils.cleanUpOnMethodExit(executor, state, throwable);
64+
@Advice.Enter final State state, @Advice.Thrown final Throwable throwable) {
65+
ExecutorInstrumentationUtils.cleanUpOnMethodExit(state, throwable);
7066
}
7167
}
7268
}

dd-java-agent/instrumentation/scala-promise/src/main/java/datadog/trace/instrumentation/scala/PromiseHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class PromiseHelper {
2929
*/
3030
public static AgentSpan getSpan() {
3131
final AgentSpan span = activeSpan();
32-
if (null != span && isAsyncPropagationEnabled()) {
32+
if (null != span && span.isValid() && isAsyncPropagationEnabled()) {
3333
return span;
3434
}
3535
return null;

0 commit comments

Comments
 (0)