Skip to content

Commit 09dab12

Browse files
mccullsclaude
andcommitted
Deprecate AgentScope.Continuation and migrate call sites to ContextContinuation
AgentScope.Continuation was a bridging interface that extended both TraceScope.Continuation (public API) and ContextContinuation (modern context API). It is now @deprecated — internal call sites migrate to ContextContinuation directly. Key changes: - AgentScope.Continuation marked @deprecated - AgentTraceCollector.register/removeContinuation now accept ContextContinuation - AgentTracer.captureActiveSpan()/captureSpan() static methods return ContextContinuation (implementations still return AgentScope.Continuation for Tracer interface compat) - ScopeContinuation gains resume()/release() for the ContextContinuation contract - State, ConcurrentState, Wrapper, VirtualThreadState, AdviceUtils, TPEHelper all migrated from AgentScope.Continuation to ContextContinuation/ContextScope - ~85 instrumentation files updated: field types use ContextContinuation, activate()→resume(), cancel()→release(), scope types use ContextScope Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 0f9aaf6 commit 09dab12

98 files changed

Lines changed: 471 additions & 392 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
44
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled;
55

6+
import datadog.context.ContextContinuation;
7+
import datadog.context.ContextScope;
68
import datadog.trace.bootstrap.ContextStore;
7-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
89
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
910

1011
/** Helper utils for Runnable/Callable instrumentation */
@@ -18,16 +19,16 @@ public class AdviceUtils {
1819
* @param <T> task's type
1920
* @return scope if scope was started, or null
2021
*/
21-
public static <T> AgentScope startTaskScope(
22+
public static <T> ContextScope startTaskScope(
2223
final ContextStore<T, State> contextStore, final T task) {
2324
return startTaskScope(contextStore.get(task));
2425
}
2526

26-
public static AgentScope startTaskScope(State state) {
27+
public static ContextScope startTaskScope(State state) {
2728
if (state != null) {
28-
final AgentScope.Continuation continuation = state.getAndResetContinuation();
29+
final ContextContinuation continuation = state.getAndResetContinuation();
2930
if (continuation != null) {
30-
final AgentScope scope = continuation.activate();
31+
final ContextScope scope = continuation.resume();
3132
// important - stop timing after the scope has been activated so the time in the queue can
3233
// be attributed to the correct context without duplicating the propagated information
3334
state.stopTiming();
@@ -37,7 +38,7 @@ public static AgentScope startTaskScope(State state) {
3738
return null;
3839
}
3940

40-
public static void endTaskScope(final AgentScope scope) {
41+
public static void endTaskScope(final ContextScope scope) {
4142
if (null != scope) {
4243
scope.close();
4344
}

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

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

3-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
3+
import datadog.context.ContextContinuation;
44

55
public final class ComparableRunnable<T extends Runnable & Comparable<T>> extends Wrapper<T>
66
implements Comparable<ComparableRunnable<T>> {
77

8-
public ComparableRunnable(T delegate, AgentScope.Continuation continuation) {
8+
public ComparableRunnable(T delegate, ContextContinuation continuation) {
99
super(delegate, continuation);
1010
}
1111

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

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled;
55
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ContinuationClaim.CLAIMED;
66

7+
import datadog.context.ContextContinuation;
8+
import datadog.context.ContextScope;
79
import datadog.trace.bootstrap.ContextStore;
8-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
910
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1011
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
1112
import org.slf4j.Logger;
@@ -22,12 +23,12 @@ public final class ConcurrentState {
2223

2324
public static ContextStore.Factory<ConcurrentState> FACTORY = ConcurrentState::new;
2425

25-
private volatile AgentScope.Continuation continuation = null;
26+
private volatile ContextContinuation continuation = null;
2627

27-
private static final AtomicReferenceFieldUpdater<ConcurrentState, AgentScope.Continuation>
28+
private static final AtomicReferenceFieldUpdater<ConcurrentState, ContextContinuation>
2829
CONTINUATION =
2930
AtomicReferenceFieldUpdater.newUpdater(
30-
ConcurrentState.class, AgentScope.Continuation.class, "continuation");
31+
ConcurrentState.class, ContextContinuation.class, "continuation");
3132

3233
private ConcurrentState() {}
3334

@@ -44,7 +45,7 @@ public static <K> ConcurrentState captureContinuation(
4445
return state;
4546
}
4647

47-
public static <K> AgentScope activateAndContinueContinuation(
48+
public static <K> ContextScope activateAndContinueContinuation(
4849
ContextStore<K, ConcurrentState> contextStore, K key) {
4950
final ConcurrentState state = contextStore.get(key);
5051
if (state == null) {
@@ -54,7 +55,10 @@ public static <K> AgentScope activateAndContinueContinuation(
5455
}
5556

5657
public static <K> void closeScope(
57-
ContextStore<K, ConcurrentState> contextStore, K key, AgentScope scope, Throwable throwable) {
58+
ContextStore<K, ConcurrentState> contextStore,
59+
K key,
60+
ContextScope scope,
61+
Throwable throwable) {
5862
final ConcurrentState state = contextStore.get(key);
5963
if (scope != null) {
6064
scope.close();
@@ -88,27 +92,27 @@ private boolean captureAndSetContinuation(final AgentSpan span) {
8892
return false;
8993
}
9094

91-
private AgentScope activateAndContinueContinuation() {
92-
final AgentScope.Continuation continuation = CONTINUATION.get(this);
95+
private ContextScope activateAndContinueContinuation() {
96+
final ContextContinuation continuation = CONTINUATION.get(this);
9397
if (continuation != null && continuation != CLAIMED) {
94-
return continuation.activate();
98+
return continuation.resume();
9599
}
96100
return null;
97101
}
98102

99103
private void cancelContinuation() {
100-
final AgentScope.Continuation continuation = CONTINUATION.get(this);
104+
final ContextContinuation continuation = CONTINUATION.get(this);
101105
if (continuation != null && continuation != CLAIMED) {
102-
continuation.cancel();
106+
continuation.release();
103107
}
104108
}
105109

106110
private void cancelAndClearContinuation() {
107-
final AgentScope.Continuation continuation = CONTINUATION.get(this);
111+
final ContextContinuation continuation = CONTINUATION.get(this);
108112
if (continuation != null && continuation != CLAIMED) {
109113
// We should never be able to reuse this state
110114
CONTINUATION.compareAndSet(this, continuation, CLAIMED);
111-
continuation.cancel();
115+
continuation.release();
112116
}
113117
}
114118
}
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
package datadog.trace.bootstrap.instrumentation.java.concurrent;
22

3-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
4-
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
3+
import datadog.context.Context;
4+
import datadog.context.ContextContinuation;
5+
import datadog.context.ContextScope;
56

6-
final class ContinuationClaim implements AgentScope.Continuation {
7+
final class ContinuationClaim implements ContextContinuation {
78

89
public static final ContinuationClaim CLAIMED = new ContinuationClaim();
910

1011
@Override
11-
public AgentScope.Continuation hold() {
12+
public ContextContinuation hold() {
1213
throw new IllegalStateException();
1314
}
1415

1516
@Override
16-
public AgentScope activate() {
17+
public ContextScope resume() {
1718
throw new IllegalStateException();
1819
}
1920

2021
@Override
21-
public AgentSpan span() {
22+
public Context context() {
2223
throw new IllegalStateException();
2324
}
2425

2526
@Override
26-
public void cancel() {
27+
public void release() {
2728
throw new IllegalStateException();
2829
}
2930
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan;
44
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ContinuationClaim.CLAIMED;
55

6+
import datadog.context.ContextContinuation;
67
import datadog.trace.api.profiling.Timing;
78
import datadog.trace.bootstrap.ContextStore;
8-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
99
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
1010
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
1111

1212
public final class State {
1313

1414
public static ContextStore.Factory<State> FACTORY = State::new;
1515

16-
private static final AtomicReferenceFieldUpdater<State, AgentScope.Continuation> CONTINUATION =
16+
private static final AtomicReferenceFieldUpdater<State, ContextContinuation> CONTINUATION =
1717
AtomicReferenceFieldUpdater.newUpdater(
18-
State.class, AgentScope.Continuation.class, "continuation");
18+
State.class, ContextContinuation.class, "continuation");
1919

20-
private volatile AgentScope.Continuation continuation = null;
20+
private volatile ContextContinuation continuation = null;
2121

2222
private static final AtomicReferenceFieldUpdater<State, Timing> TIMING =
2323
AtomicReferenceFieldUpdater.newUpdater(State.class, Timing.class, "timing");
@@ -40,34 +40,34 @@ public boolean captureAndSetContinuation(final AgentSpan span) {
4040
return false;
4141
}
4242

43-
public boolean setOrCancelContinuation(final AgentScope.Continuation continuation) {
43+
public boolean setOrCancelContinuation(final ContextContinuation continuation) {
4444
if (CONTINUATION.compareAndSet(this, null, CLAIMED)) {
4545
// lazy write is guaranteed to be seen by getAndSet
4646
CONTINUATION.lazySet(this, continuation);
4747
return true;
4848
} else {
49-
continuation.cancel();
49+
continuation.release();
5050
return false;
5151
}
5252
}
5353

5454
public void closeContinuation() {
55-
AgentScope.Continuation continuation = getAndResetContinuation();
55+
ContextContinuation continuation = getAndResetContinuation();
5656
if (null != continuation) {
57-
continuation.cancel();
57+
continuation.release();
5858
}
5959
}
6060

6161
public AgentSpan getSpan() {
62-
AgentScope.Continuation continuation = CONTINUATION.get(this);
62+
ContextContinuation continuation = CONTINUATION.get(this);
6363
if (null != continuation) {
64-
return continuation.span();
64+
return AgentSpan.fromContext(continuation.context());
6565
}
6666
return null;
6767
}
6868

69-
public AgentScope.Continuation getAndResetContinuation() {
70-
AgentScope.Continuation continuation = CONTINUATION.get(this);
69+
public ContextContinuation getAndResetContinuation() {
70+
ContextContinuation continuation = CONTINUATION.get(this);
7171
if (null == continuation || CLAIMED == continuation) {
7272
return null;
7373
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE;
44
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.exclude;
55

6+
import datadog.context.ContextScope;
67
import datadog.trace.api.GenericClassValue;
78
import datadog.trace.api.InstrumenterConfig;
89
import datadog.trace.bootstrap.ContextStore;
9-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
1010
import java.util.Set;
1111
import java.util.concurrent.ThreadPoolExecutor;
1212

1313
/**
1414
* This class is a helper for the ThreadPoolExecutorInstrumentation. The instrumentation has two
1515
* modes, where the legacy mode uses wrapping of the Runnable and the new mode uses the State
1616
* context store field in the actual Runnable. The ThreadLocal below is needed to transport the
17-
* AgentScope between two methods when using the context store approach. More details can be found
17+
* ContextScope between two methods when using the context store approach. More details can be found
1818
* in the ThreadPoolExecutorInstrumentation.
1919
*/
2020
public final class TPEHelper {
@@ -24,7 +24,7 @@ public final class TPEHelper {
2424
// A ThreadPoolExecutor with one of these types will newer be propagated/wrapped
2525
private static final Set<String> excludedClasses;
2626
// A ThreadLocal to store the Scope between beforeExecute and afterExecute if wrapping is not used
27-
private static final ThreadLocal<AgentScope> threadLocalScope;
27+
private static final ThreadLocal<ContextScope> threadLocalScope;
2828

2929
private static final ClassValue<Boolean> WRAP =
3030
GenericClassValue.of(
@@ -78,37 +78,37 @@ public static void capture(ContextStore<Runnable, State> contextStore, Runnable
7878
}
7979
}
8080

81-
public static AgentScope startScope(ContextStore<Runnable, State> contextStore, Runnable task) {
81+
public static ContextScope startScope(ContextStore<Runnable, State> contextStore, Runnable task) {
8282
if (task == null || exclude(RUNNABLE, task)) {
8383
return null;
8484
}
8585
return AdviceUtils.startTaskScope(contextStore, task);
8686
}
8787

88-
public static void setThreadLocalScope(AgentScope scope, Runnable task) {
88+
public static void setThreadLocalScope(ContextScope scope, Runnable task) {
8989
if (scope == null || task == null || exclude(RUNNABLE, task)) {
9090
return;
9191
}
92-
AgentScope current = threadLocalScope.get();
92+
ContextScope current = threadLocalScope.get();
9393
if (current != null) {
9494
current.close();
9595
}
9696
threadLocalScope.set(scope);
9797
}
9898

99-
public static AgentScope getAndClearThreadLocalScope(Runnable task) {
99+
public static ContextScope getAndClearThreadLocalScope(Runnable task) {
100100
if (task == null || exclude(RUNNABLE, task)) {
101101
return null;
102102
}
103-
AgentScope scope = threadLocalScope.get();
103+
ContextScope scope = threadLocalScope.get();
104104
// Intentionally use `.set(null)` instead of `.remove()` for performance reasons.
105105
// For details see: https://github.com/DataDog/dd-trace-java/pull/9856#discussion_r2527729963
106106
// noinspection ThreadLocalSetWithNull
107107
threadLocalScope.set(null);
108108
return scope;
109109
}
110110

111-
public static void endScope(AgentScope scope, Runnable task) {
111+
public static void endScope(ContextScope scope, Runnable task) {
112112
if (task == null || exclude(RUNNABLE, task)) {
113113
return;
114114
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE;
66
import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.exclude;
77

8+
import datadog.context.ContextContinuation;
89
import datadog.context.ContextScope;
9-
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
1010
import java.util.concurrent.RunnableFuture;
1111

1212
public class Wrapper<T extends Runnable> implements Runnable, AutoCloseable {
@@ -19,7 +19,7 @@ public static <T extends Runnable> Runnable wrap(T task) {
1919
|| exclude(RUNNABLE, task)) {
2020
return task;
2121
}
22-
AgentScope.Continuation continuation = captureActiveSpan();
22+
ContextContinuation continuation = captureActiveSpan();
2323
if (continuation != noopContinuation()) {
2424
if (task instanceof Comparable) {
2525
return new ComparableRunnable(task, continuation);
@@ -35,9 +35,9 @@ public static Runnable unwrap(Runnable task) {
3535
}
3636

3737
protected final T delegate;
38-
private final AgentScope.Continuation continuation;
38+
private final ContextContinuation continuation;
3939

40-
public Wrapper(T delegate, AgentScope.Continuation continuation) {
40+
public Wrapper(T delegate, ContextContinuation continuation) {
4141
this.delegate = delegate;
4242
this.continuation = continuation;
4343
}
@@ -51,16 +51,16 @@ public void run() {
5151

5252
public void cancel() {
5353
if (null != continuation) {
54-
continuation.cancel();
54+
continuation.release();
5555
}
5656
}
5757

5858
public T unwrap() {
5959
return delegate;
6060
}
6161

62-
private AgentScope activate() {
63-
return null == continuation ? null : continuation.activate();
62+
private ContextScope activate() {
63+
return null == continuation ? null : continuation.resume();
6464
}
6565

6666
@Override

0 commit comments

Comments
 (0)