Skip to content

Commit 0373996

Browse files
authored
Merge pull request #463 from DataDog/ark/dd-global-tracer
Datadog Global Tracer
2 parents ab14c85 + 7154b54 commit 0373996

File tree

9 files changed

+129
-102
lines changed

9 files changed

+129
-102
lines changed

dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/TracerInstaller.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
package datadog.trace.agent.tooling;
22

33
import datadog.opentracing.DDTracer;
4-
import io.opentracing.Tracer;
5-
import io.opentracing.util.GlobalTracer;
64
import lombok.extern.slf4j.Slf4j;
75

86
@Slf4j
97
public class TracerInstaller {
108
/** Register a global tracer if no global tracer is already registered. */
119
public static synchronized void installGlobalTracer() {
12-
if (!GlobalTracer.isRegistered()) {
13-
final Tracer resolved = new DDTracer();
10+
if (!io.opentracing.util.GlobalTracer.isRegistered()) {
11+
final DDTracer tracer = new DDTracer();
1412
try {
15-
GlobalTracer.register(resolved);
13+
io.opentracing.util.GlobalTracer.register(tracer);
14+
datadog.trace.api.GlobalTracer.registerIfAbsent(tracer);
1615
} catch (final RuntimeException re) {
17-
log.warn("Failed to register tracer '" + resolved + "'", re);
16+
log.warn("Failed to register tracer '" + tracer + "'", re);
1817
}
1918
} else {
2019
log.debug("GlobalTracer already registered.");
@@ -23,7 +22,10 @@ public static synchronized void installGlobalTracer() {
2322

2423
public static void logVersionInfo() {
2524
VersionLogger.logAllVersions();
26-
log.debug(GlobalTracer.class.getName() + " loaded on " + GlobalTracer.class.getClassLoader());
25+
log.debug(
26+
io.opentracing.util.GlobalTracer.class.getName()
27+
+ " loaded on "
28+
+ io.opentracing.util.GlobalTracer.class.getClassLoader());
2729
log.debug(
2830
AgentInstaller.class.getName() + " loaded on " + AgentInstaller.class.getClassLoader());
2931
}

dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import datadog.opentracing.DDTracer;
88
import datadog.trace.agent.tooling.AgentInstaller;
99
import datadog.trace.agent.tooling.Instrumenter;
10+
import datadog.trace.api.GlobalTracer;
1011
import datadog.trace.common.writer.ListWriter;
1112
import datadog.trace.common.writer.Writer;
1213
import io.opentracing.Tracer;
@@ -84,6 +85,7 @@ public boolean add(final List<DDSpan> trace) {
8485
};
8586
TEST_TRACER = new DDTracer(TEST_WRITER);
8687
TestUtils.registerOrReplaceGlobalTracer((Tracer) TEST_TRACER);
88+
GlobalTracer.registerIfAbsent((DDTracer) TEST_TRACER);
8789
}
8890

8991
protected static Tracer getTestTracer() {
Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,16 @@
11
package datadog.trace.api;
22

3-
import java.util.concurrent.atomic.AtomicReference;
4-
53
/**
64
* Utility class to access the active trace and span ids.
75
*
86
* <p>Intended for use with MDC frameworks.
97
*/
108
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-
199
public static String getTraceId() {
20-
return provider.get().getTraceId();
10+
return GlobalTracer.get().getTraceId();
2111
}
2212

2313
public static String getSpanId() {
24-
return provider.get().getSpanId();
25-
}
26-
27-
public interface Provider {
28-
String getTraceId();
29-
30-
String getSpanId();
31-
32-
Provider NO_OP =
33-
new Provider() {
34-
@Override
35-
public String getTraceId() {
36-
return "0";
37-
}
38-
39-
@Override
40-
public String getSpanId() {
41-
return "0";
42-
}
43-
};
14+
return GlobalTracer.get().getSpanId();
4415
}
4516
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package datadog.trace.api;
2+
3+
import datadog.trace.api.interceptor.TraceInterceptor;
4+
import java.util.concurrent.atomic.AtomicReference;
5+
6+
/**
7+
* A global reference to the registered Datadog tracer.
8+
*
9+
* <p>OpenTracing's GlobalTracer cannot be cast to its DDTracer implementation, so this class exists
10+
* to provide a global window to datadog-specific features.
11+
*/
12+
public class GlobalTracer {
13+
private static final Tracer NO_OP =
14+
new Tracer() {
15+
@Override
16+
public String getTraceId() {
17+
return "0";
18+
}
19+
20+
@Override
21+
public String getSpanId() {
22+
return "0";
23+
}
24+
25+
@Override
26+
public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) {
27+
return false;
28+
}
29+
};
30+
private static final AtomicReference<Tracer> provider = new AtomicReference<>(NO_OP);
31+
32+
public static void registerIfAbsent(Tracer p) {
33+
if (p != null && p != NO_OP) {
34+
provider.compareAndSet(NO_OP, p);
35+
}
36+
}
37+
38+
public static Tracer get() {
39+
return provider.get();
40+
}
41+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package datadog.trace.api;
2+
3+
import datadog.trace.api.interceptor.TraceInterceptor;
4+
5+
/** A class with Datadog tracer features. */
6+
public interface Tracer {
7+
8+
/** Get the trace id of the active trace. Returns 0 if there is no active trace. */
9+
String getTraceId();
10+
11+
/**
12+
* Get the span id of the active span of the active trace. Returns 0 if there is no active trace.
13+
*/
14+
String getSpanId();
15+
16+
/**
17+
* Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones are
18+
* ignored.
19+
*
20+
* @param traceInterceptor
21+
* @return false if an interceptor with same priority exists.
22+
*/
23+
boolean addTraceInterceptor(TraceInterceptor traceInterceptor);
24+
}

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

Lines changed: 25 additions & 16 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;
@@ -49,7 +48,7 @@
4948

5049
/** DDTracer makes it easy to send traces and span to DD using the OpenTracing API. */
5150
@Slf4j
52-
public class DDTracer implements io.opentracing.Tracer, Closeable {
51+
public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace.api.Tracer {
5352

5453
public static final String UNASSIGNED_DEFAULT_SERVICE_NAME = "unnamed-java-app";
5554

@@ -162,8 +161,6 @@ public void run() {
162161
addDecorator(decorator);
163162
}
164163

165-
CorrelationIdentifier.registerIfAbsent(OTTraceCorrelation.INSTANCE);
166-
167164
log.info("New instance: {}", this);
168165
}
169166

@@ -202,17 +199,6 @@ public void addDecorator(final AbstractDecorator decorator) {
202199
spanContextDecorators.put(decorator.getMatchingTag(), list);
203200
}
204201

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-
216202
public void addScopeContext(final ScopeContext context) {
217203
scopeManager.addScopeContext(context);
218204
}
@@ -227,7 +213,7 @@ public void registerClassLoader(final ClassLoader classLoader) {
227213
try {
228214
for (final TraceInterceptor interceptor :
229215
ServiceLoader.load(TraceInterceptor.class, classLoader)) {
230-
addInterceptor(interceptor);
216+
addTraceInterceptor(interceptor);
231217
}
232218
} catch (final ServiceConfigurationError e) {
233219
log.warn("Problem loading TraceInterceptor for classLoader: " + classLoader, e);
@@ -308,6 +294,29 @@ void incrementTraceCount() {
308294
traceCount.incrementAndGet();
309295
}
310296

297+
@Override
298+
public String getTraceId() {
299+
final Span activeSpan = this.activeSpan();
300+
if (activeSpan instanceof DDSpan) {
301+
return ((DDSpan) activeSpan).getTraceId();
302+
}
303+
return "0";
304+
}
305+
306+
@Override
307+
public String getSpanId() {
308+
final Span activeSpan = this.activeSpan();
309+
if (activeSpan instanceof DDSpan) {
310+
return ((DDSpan) activeSpan).getSpanId();
311+
}
312+
return "0";
313+
}
314+
315+
@Override
316+
public boolean addTraceInterceptor(final TraceInterceptor interceptor) {
317+
return interceptors.add(interceptor);
318+
}
319+
311320
@Override
312321
public void close() {
313322
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: 21 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.api.GlobalTracer
67
import spock.lang.Specification
78

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

0 commit comments

Comments
 (0)