Skip to content

Commit e565205

Browse files
author
Andrew Kent
committed
TraceInterceptor registration api
1 parent ab14c85 commit e565205

6 files changed

Lines changed: 117 additions & 74 deletions

File tree

dd-trace-api/src/main/java/datadog/trace/api/CorrelationIdentifier.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
11
package datadog.trace.api;
22

3-
import java.util.concurrent.atomic.AtomicReference;
3+
import datadog.trace.context.TracerBridge;
44

55
/**
66
* Utility class to access the active trace and span ids.
77
*
88
* <p>Intended for use with MDC frameworks.
99
*/
1010
public class CorrelationIdentifier {
11-
private static final AtomicReference<Provider> provider = new AtomicReference<>(Provider.NO_OP);
12-
13-
public static void registerIfAbsent(Provider p) {
14-
if (p != null && p != Provider.NO_OP) {
15-
provider.compareAndSet(Provider.NO_OP, p);
16-
}
17-
}
18-
1911
public static String getTraceId() {
20-
return provider.get().getTraceId();
12+
return TracerBridge.get().getTraceId();
2113
}
2214

2315
public static String getSpanId() {
24-
return provider.get().getSpanId();
16+
return TracerBridge.get().getSpanId();
2517
}
2618

2719
public interface Provider {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package datadog.trace.context;
2+
3+
import datadog.trace.api.interceptor.TraceInterceptor;
4+
import java.util.concurrent.atomic.AtomicReference;
5+
6+
/** A global reference to the registered Datadog tracer. */
7+
public class TracerBridge {
8+
private static final AtomicReference<Provider> provider = new AtomicReference<>(Provider.NO_OP);
9+
10+
public static void registerIfAbsent(Provider p) {
11+
if (p != null && p != Provider.NO_OP) {
12+
provider.compareAndSet(Provider.NO_OP, p);
13+
}
14+
}
15+
16+
public static Provider get() {
17+
return provider.get();
18+
}
19+
20+
/**
21+
* Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones are
22+
* ignored.
23+
*
24+
* @param traceInterceptor
25+
* @return false if an interceptor with same priority exists.
26+
*/
27+
public static boolean addTraceInterceptor(TraceInterceptor traceInterceptor) {
28+
return get().addTraceInterceptor(traceInterceptor);
29+
}
30+
31+
public interface Provider {
32+
String getTraceId();
33+
34+
String getSpanId();
35+
36+
/**
37+
* Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones
38+
* are ignored.
39+
*
40+
* @param traceInterceptor
41+
* @return false if an interceptor with same priority exists.
42+
*/
43+
boolean addTraceInterceptor(TraceInterceptor traceInterceptor);
44+
45+
Provider NO_OP =
46+
new Provider() {
47+
@Override
48+
public String getTraceId() {
49+
return "0";
50+
}
51+
52+
@Override
53+
public String getSpanId() {
54+
return "0";
55+
}
56+
57+
@Override
58+
public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) {
59+
return false;
60+
}
61+
};
62+
}
63+
}

dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import datadog.opentracing.propagation.HTTPCodec;
1414
import datadog.opentracing.scopemanager.ContextualScopeManager;
1515
import datadog.opentracing.scopemanager.ScopeContext;
16-
import datadog.trace.api.CorrelationIdentifier;
1716
import datadog.trace.api.interceptor.MutableSpan;
1817
import datadog.trace.api.interceptor.TraceInterceptor;
1918
import datadog.trace.api.sampling.PrioritySampling;
@@ -24,6 +23,7 @@
2423
import datadog.trace.common.writer.DDAgentWriter;
2524
import datadog.trace.common.writer.DDApi;
2625
import datadog.trace.common.writer.Writer;
26+
import datadog.trace.context.TracerBridge;
2727
import io.opentracing.Scope;
2828
import io.opentracing.ScopeManager;
2929
import io.opentracing.Span;
@@ -49,7 +49,7 @@
4949

5050
/** DDTracer makes it easy to send traces and span to DD using the OpenTracing API. */
5151
@Slf4j
52-
public class DDTracer implements io.opentracing.Tracer, Closeable {
52+
public class DDTracer implements io.opentracing.Tracer, Closeable, TracerBridge.Provider {
5353

5454
public static final String UNASSIGNED_DEFAULT_SERVICE_NAME = "unnamed-java-app";
5555

@@ -162,7 +162,7 @@ public void run() {
162162
addDecorator(decorator);
163163
}
164164

165-
CorrelationIdentifier.registerIfAbsent(OTTraceCorrelation.INSTANCE);
165+
TracerBridge.registerIfAbsent(this);
166166

167167
log.info("New instance: {}", this);
168168
}
@@ -202,17 +202,6 @@ public void addDecorator(final AbstractDecorator decorator) {
202202
spanContextDecorators.put(decorator.getMatchingTag(), list);
203203
}
204204

205-
/**
206-
* Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones are
207-
* ignored.
208-
*
209-
* @param interceptor
210-
* @return false if an interceptor with same priority exists.
211-
*/
212-
public boolean addInterceptor(final TraceInterceptor interceptor) {
213-
return interceptors.add(interceptor);
214-
}
215-
216205
public void addScopeContext(final ScopeContext context) {
217206
scopeManager.addScopeContext(context);
218207
}
@@ -227,7 +216,7 @@ public void registerClassLoader(final ClassLoader classLoader) {
227216
try {
228217
for (final TraceInterceptor interceptor :
229218
ServiceLoader.load(TraceInterceptor.class, classLoader)) {
230-
addInterceptor(interceptor);
219+
addTraceInterceptor(interceptor);
231220
}
232221
} catch (final ServiceConfigurationError e) {
233222
log.warn("Problem loading TraceInterceptor for classLoader: " + classLoader, e);
@@ -308,6 +297,29 @@ void incrementTraceCount() {
308297
traceCount.incrementAndGet();
309298
}
310299

300+
@Override
301+
public String getTraceId() {
302+
final Span activeSpan = this.activeSpan();
303+
if (activeSpan instanceof DDSpan) {
304+
return ((DDSpan) activeSpan).getTraceId();
305+
}
306+
return "0";
307+
}
308+
309+
@Override
310+
public String getSpanId() {
311+
final Span activeSpan = this.activeSpan();
312+
if (activeSpan instanceof DDSpan) {
313+
return ((DDSpan) activeSpan).getSpanId();
314+
}
315+
return "0";
316+
}
317+
318+
@Override
319+
public boolean addTraceInterceptor(final TraceInterceptor interceptor) {
320+
return interceptors.add(interceptor);
321+
}
322+
311323
@Override
312324
public void close() {
313325
PendingTrace.close();

dd-trace-ot/src/main/java/datadog/opentracing/OTTraceCorrelation.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

dd-trace-ot/src/test/groovy/datadog/opentracing/OTTraceCorrelationTest.groovy renamed to dd-trace-ot/src/test/groovy/datadog/opentracing/TraceCorrelationTest.groovy

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@ import datadog.trace.common.writer.ListWriter
44
import spock.lang.Shared
55
import spock.lang.Specification
66

7-
class OTTraceCorrelationTest extends Specification {
7+
class TraceCorrelationTest extends Specification {
88

99
static final WRITER = new ListWriter()
1010

1111
@Shared
1212
DDTracer tracer = new DDTracer(WRITER)
13-
@Shared
14-
OTTraceCorrelation traceCorrelation = new OTTraceCorrelation(tracer)
1513

1614
def scope = tracer.buildSpan("test").startActive(true)
1715

@@ -24,24 +22,24 @@ class OTTraceCorrelationTest extends Specification {
2422
scope.close()
2523

2624
expect:
27-
"0" == traceCorrelation.getTraceId()
25+
"0" == tracer.getTraceId()
2826
}
2927

3028
def "get trace id with trace"() {
3129
expect:
32-
((DDSpan) scope.span()).traceId == traceCorrelation.getTraceId()
30+
((DDSpan) scope.span()).traceId == tracer.getTraceId()
3331
}
3432

3533
def "get span id without span"() {
3634
setup:
3735
scope.close()
3836

3937
expect:
40-
"0" == traceCorrelation.getSpanId()
38+
"0" == tracer.getSpanId()
4139
}
4240

4341
def "get span id with trace"() {
4442
expect:
45-
((DDSpan) scope.span()).spanId == traceCorrelation.getSpanId()
43+
((DDSpan) scope.span()).spanId == tracer.getSpanId()
4644
}
4745
}

dd-trace-ot/src/test/groovy/datadog/opentracing/TraceInterceptorTest.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package datadog.opentracing
33
import datadog.trace.api.interceptor.MutableSpan
44
import datadog.trace.api.interceptor.TraceInterceptor
55
import datadog.trace.common.writer.ListWriter
6+
import datadog.trace.context.TracerBridge
67
import spock.lang.Specification
78

89
import java.util.concurrent.atomic.AtomicBoolean
@@ -143,4 +144,22 @@ class TraceInterceptorTest extends Specification {
143144
tags["thread.id"] != null
144145
tags.size() == 6
145146
}
147+
148+
def "register interceptor through bridge" () {
149+
setup:
150+
def interceptor = new TraceInterceptor() {
151+
@Override
152+
Collection<? extends MutableSpan> onTraceComplete(Collection<? extends MutableSpan> trace) {
153+
return trace
154+
}
155+
156+
@Override
157+
int priority() {
158+
return 38
159+
}
160+
}
161+
162+
expect:
163+
TracerBridge.addTraceInterceptor(interceptor)
164+
}
146165
}

0 commit comments

Comments
 (0)