Remove OpenTracing interoperability (#44)

* Remove dependency on OpenTracing constants

* Remove OpenTracing tracer resolver

* Remove dep on OpenTracing Tracer and GlobalTracer

* Remove dep on OpenTracing ScopeManager/Context

* Remove dep on OpenTracing References

* Remove dep on OpenTracing Format

* Remove dep on OpenTracing Scope

* Remove dep on OpenTracing Span

* Remove OpenTracing compatibility tests

* Remove dep on OpenTracing SpanContext

* Remove dep on OpenTracing propagation classes

* Remove dep on OpenTracing log field name constants

* Remove dependency on OpenTracing

* Some last OpenTracing related renaming

* Remove unused code

* Remove code that's not doing anything

* A bit more cleanup
This commit is contained in:
Trask Stalnaker 2019-12-18 10:17:50 -08:00 committed by GitHub
parent 1fced9d473
commit 71cd1a69b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
79 changed files with 374 additions and 1158 deletions

View File

@ -1,6 +1,5 @@
Component,Origin,License,Copyright Component,Origin,License,Copyright
https://github.com/DataDog/dd-trace-java/blob/dev/dd-trace/src/main/java/com/datadoghq/trace/propagation/Codec.java,Uber,MIT, https://github.com/DataDog/dd-trace-java/blob/dev/dd-trace/src/main/java/com/datadoghq/trace/propagation/Codec.java,Uber,MIT,
import,io.opentracing,Apache-2.0,Copyright 2016-2017 The OpenTracing Authors
import,org.slf4j,MIT,Copyright (c) 2004-2017 QOS.ch import,org.slf4j,MIT,Copyright (c) 2004-2017 QOS.ch
import,com.google.auto.service.AutoService,Apache-2.0,"Copyright 2013 Google, Inc." import,com.google.auto.service.AutoService,Apache-2.0,"Copyright 2013 Google, Inc."
logback.xml,ch.qos.logback,EPL-1.0 OR LGPL-2.1,"Copyright (C) 1999-2015, QOS.ch. All rights reserved." logback.xml,ch.qos.logback,EPL-1.0 OR LGPL-2.1,"Copyright (C) 1999-2015, QOS.ch. All rights reserved."

1 Component Origin License Copyright
2 https://github.com/DataDog/dd-trace-java/blob/dev/dd-trace/src/main/java/com/datadoghq/trace/propagation/Codec.java Uber MIT
import io.opentracing Apache-2.0 Copyright 2016-2017 The OpenTracing Authors
3 import org.slf4j MIT Copyright (c) 2004-2017 QOS.ch
4 import com.google.auto.service.AutoService Apache-2.0 Copyright 2013 Google, Inc.
5 logback.xml ch.qos.logback EPL-1.0 OR LGPL-2.1 Copyright (C) 1999-2015, QOS.ch. All rights reserved.

View File

@ -7,7 +7,6 @@ apply from: "${rootDir}/gradle/java.gradle"
dependencies { dependencies {
compile project(':dd-trace-api') compile project(':dd-trace-api')
compile deps.opentracing
compile deps.slf4j compile deps.slf4j
compile group: 'org.slf4j', name: 'slf4j-simple', version: versions.slf4j compile group: 'org.slf4j', name: 'slf4j-simple', version: versions.slf4j
// ^ Generally a bad idea for libraries, but we're shadowing. // ^ Generally a bad idea for libraries, but we're shadowing.

View File

@ -13,8 +13,6 @@ public interface AgentSpan {
AgentSpan setError(boolean error); AgentSpan setError(boolean error);
AgentSpan setErrorMessage(String errorMessage);
AgentSpan addThrowable(Throwable throwable); AgentSpan addThrowable(Throwable throwable);
AgentSpan getLocalRootSpan(); AgentSpan getLocalRootSpan();

View File

@ -167,11 +167,6 @@ public class AgentTracer {
return this; return this;
} }
@Override
public AgentSpan setErrorMessage(final String errorMessage) {
return this;
}
@Override @Override
public AgentSpan addThrowable(final Throwable throwable) { public AgentSpan addThrowable(final Throwable throwable) {
return this; return this;

View File

@ -22,7 +22,6 @@ dependencies {
compile project(':dd-trace-ot') compile project(':dd-trace-ot')
testCompile deps.opentracing
testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:testing')
testCompile project(':utils:gc-utils') testCompile project(':utils:gc-utils')

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.decorator;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import datadog.trace.instrumentation.api.AgentScope; import datadog.trace.instrumentation.api.AgentScope;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags; import datadog.trace.instrumentation.api.Tags;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.Inet6Address; import java.net.Inet6Address;
@ -26,7 +26,7 @@ public abstract class BaseDecorator {
if (spanType() != null) { if (spanType() != null) {
span.setTag(DDTags.SPAN_TYPE, spanType()); span.setTag(DDTags.SPAN_TYPE, spanType());
} }
span.setTag(Tags.COMPONENT.getKey(), component()); span.setTag(Tags.COMPONENT, component());
return span; return span;
} }
@ -62,8 +62,8 @@ public abstract class BaseDecorator {
if (remoteConnection != null) { if (remoteConnection != null) {
onPeerConnection(span, remoteConnection.getAddress()); onPeerConnection(span, remoteConnection.getAddress());
span.setTag(Tags.PEER_HOSTNAME.getKey(), remoteConnection.getHostName()); span.setTag(Tags.PEER_HOSTNAME, remoteConnection.getHostName());
span.setTag(Tags.PEER_PORT.getKey(), remoteConnection.getPort()); span.setTag(Tags.PEER_PORT, remoteConnection.getPort());
} }
return span; return span;
} }
@ -71,11 +71,11 @@ public abstract class BaseDecorator {
public AgentSpan onPeerConnection(final AgentSpan span, final InetAddress remoteAddress) { public AgentSpan onPeerConnection(final AgentSpan span, final InetAddress remoteAddress) {
assert span != null; assert span != null;
if (remoteAddress != null) { if (remoteAddress != null) {
span.setTag(Tags.PEER_HOSTNAME.getKey(), remoteAddress.getHostName()); span.setTag(Tags.PEER_HOSTNAME, remoteAddress.getHostName());
if (remoteAddress instanceof Inet4Address) { if (remoteAddress instanceof Inet4Address) {
span.setTag(Tags.PEER_HOST_IPV4.getKey(), remoteAddress.getHostAddress()); span.setTag(Tags.PEER_HOST_IPV4, remoteAddress.getHostAddress());
} else if (remoteAddress instanceof Inet6Address) { } else if (remoteAddress instanceof Inet6Address) {
span.setTag(Tags.PEER_HOST_IPV6.getKey(), remoteAddress.getHostAddress()); span.setTag(Tags.PEER_HOST_IPV6, remoteAddress.getHostAddress());
} }
} }
return span; return span;

View File

@ -2,7 +2,7 @@ package datadog.trace.agent.decorator;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags; import datadog.trace.instrumentation.api.Tags;
public abstract class ClientDecorator extends BaseDecorator { public abstract class ClientDecorator extends BaseDecorator {
@ -18,7 +18,7 @@ public abstract class ClientDecorator extends BaseDecorator {
if (service() != null) { if (service() != null) {
span.setTag(DDTags.SERVICE_NAME, service()); span.setTag(DDTags.SERVICE_NAME, service());
} }
span.setTag(Tags.SPAN_KIND.getKey(), spanKind()); span.setTag(Tags.SPAN_KIND, spanKind());
return super.afterStart(span); return super.afterStart(span);
} }
} }

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.decorator;
import datadog.trace.api.Config; import datadog.trace.api.Config;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags; import datadog.trace.instrumentation.api.Tags;
public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorator { public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorator {
@ -16,7 +16,7 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
@Override @Override
public AgentSpan afterStart(final AgentSpan span) { public AgentSpan afterStart(final AgentSpan span) {
assert span != null; assert span != null;
span.setTag(Tags.DB_TYPE.getKey(), dbType()); span.setTag(Tags.DB_TYPE, dbType());
return super.afterStart(span); return super.afterStart(span);
} }
@ -30,9 +30,9 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) { public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) {
assert span != null; assert span != null;
if (connection != null) { if (connection != null) {
span.setTag(Tags.DB_USER.getKey(), dbUser(connection)); span.setTag(Tags.DB_USER, dbUser(connection));
final String instanceName = dbInstance(connection); final String instanceName = dbInstance(connection);
span.setTag(Tags.DB_INSTANCE.getKey(), instanceName); span.setTag(Tags.DB_INSTANCE, instanceName);
if (instanceName != null && Config.get().isDbClientSplitByInstance()) { if (instanceName != null && Config.get().isDbClientSplitByInstance()) {
span.setTag(DDTags.SERVICE_NAME, instanceName); span.setTag(DDTags.SERVICE_NAME, instanceName);
@ -43,7 +43,7 @@ public abstract class DatabaseClientDecorator<CONNECTION> extends ClientDecorato
public AgentSpan onStatement(final AgentSpan span, final String statement) { public AgentSpan onStatement(final AgentSpan span, final String statement) {
assert span != null; assert span != null;
span.setTag(Tags.DB_STATEMENT.getKey(), statement); span.setTag(Tags.DB_STATEMENT, statement);
return span; return span;
} }
} }

View File

@ -4,7 +4,7 @@ import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes; import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags; import datadog.trace.instrumentation.api.Tags;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -35,7 +35,7 @@ public abstract class HttpClientDecorator<REQUEST, RESPONSE> extends ClientDecor
public AgentSpan onRequest(final AgentSpan span, final REQUEST request) { public AgentSpan onRequest(final AgentSpan span, final REQUEST request) {
assert span != null; assert span != null;
if (request != null) { if (request != null) {
span.setTag(Tags.HTTP_METHOD.getKey(), method(request)); span.setTag(Tags.HTTP_METHOD, method(request));
// Copy of HttpServerDecorator url handling // Copy of HttpServerDecorator url handling
try { try {
@ -60,7 +60,7 @@ public abstract class HttpClientDecorator<REQUEST, RESPONSE> extends ClientDecor
urlNoParams.append(path); urlNoParams.append(path);
} }
span.setTag(Tags.HTTP_URL.getKey(), urlNoParams.toString()); span.setTag(Tags.HTTP_URL, urlNoParams.toString());
if (Config.get().isHttpClientTagQueryString()) { if (Config.get().isHttpClientTagQueryString()) {
span.setTag(DDTags.HTTP_QUERY, url.getQuery()); span.setTag(DDTags.HTTP_QUERY, url.getQuery());
@ -71,11 +71,11 @@ public abstract class HttpClientDecorator<REQUEST, RESPONSE> extends ClientDecor
log.debug("Error tagging url", e); log.debug("Error tagging url", e);
} }
span.setTag(Tags.PEER_HOSTNAME.getKey(), hostname(request)); span.setTag(Tags.PEER_HOSTNAME, hostname(request));
final Integer port = port(request); final Integer port = port(request);
// Negative or Zero ports might represent an unset/null value for an int type. Skip setting. // Negative or Zero ports might represent an unset/null value for an int type. Skip setting.
if (port != null && port > 0) { if (port != null && port > 0) {
span.setTag(Tags.PEER_PORT.getKey(), port); span.setTag(Tags.PEER_PORT, port);
} }
if (Config.get().isHttpClientSplitByDomain()) { if (Config.get().isHttpClientSplitByDomain()) {
@ -90,7 +90,7 @@ public abstract class HttpClientDecorator<REQUEST, RESPONSE> extends ClientDecor
if (response != null) { if (response != null) {
final Integer status = status(response); final Integer status = status(response);
if (status != null) { if (status != null) {
span.setTag(Tags.HTTP_STATUS.getKey(), status); span.setTag(Tags.HTTP_STATUS, status);
if (Config.get().getHttpClientErrorStatuses().contains(status)) { if (Config.get().getHttpClientErrorStatuses().contains(status)) {
span.setError(true); span.setError(true);

View File

@ -4,7 +4,7 @@ import datadog.trace.api.Config;
import datadog.trace.api.DDSpanTypes; import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags; import datadog.trace.instrumentation.api.Tags;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@ -39,7 +39,7 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
public AgentSpan onRequest(final AgentSpan span, final REQUEST request) { public AgentSpan onRequest(final AgentSpan span, final REQUEST request) {
assert span != null; assert span != null;
if (request != null) { if (request != null) {
span.setTag(Tags.HTTP_METHOD.getKey(), method(request)); span.setTag(Tags.HTTP_METHOD, method(request));
// Copy of HttpClientDecorator url handling // Copy of HttpClientDecorator url handling
try { try {
@ -64,7 +64,7 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
urlNoParams.append(path); urlNoParams.append(path);
} }
span.setTag(Tags.HTTP_URL.getKey(), urlNoParams.toString()); span.setTag(Tags.HTTP_URL, urlNoParams.toString());
if (Config.get().isHttpServerTagQueryString()) { if (Config.get().isHttpServerTagQueryString()) {
span.setTag(DDTags.HTTP_QUERY, url.getQuery()); span.setTag(DDTags.HTTP_QUERY, url.getQuery());
@ -82,19 +82,19 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) { public AgentSpan onConnection(final AgentSpan span, final CONNECTION connection) {
assert span != null; assert span != null;
if (connection != null) { if (connection != null) {
span.setTag(Tags.PEER_HOSTNAME.getKey(), peerHostname(connection)); span.setTag(Tags.PEER_HOSTNAME, peerHostname(connection));
final String ip = peerHostIP(connection); final String ip = peerHostIP(connection);
if (ip != null) { if (ip != null) {
if (VALID_IPV4_ADDRESS.matcher(ip).matches()) { if (VALID_IPV4_ADDRESS.matcher(ip).matches()) {
span.setTag(Tags.PEER_HOST_IPV4.getKey(), ip); span.setTag(Tags.PEER_HOST_IPV4, ip);
} else if (ip.contains(":")) { } else if (ip.contains(":")) {
span.setTag(Tags.PEER_HOST_IPV6.getKey(), ip); span.setTag(Tags.PEER_HOST_IPV6, ip);
} }
} }
final Integer port = peerPort(connection); final Integer port = peerPort(connection);
// Negative or Zero ports might represent an unset/null value for an int type. Skip setting. // Negative or Zero ports might represent an unset/null value for an int type. Skip setting.
if (port != null && port > 0) { if (port != null && port > 0) {
span.setTag(Tags.PEER_PORT.getKey(), port); span.setTag(Tags.PEER_PORT, port);
} }
} }
return span; return span;
@ -105,7 +105,7 @@ public abstract class HttpServerDecorator<REQUEST, CONNECTION, RESPONSE> extends
if (response != null) { if (response != null) {
final Integer status = status(response); final Integer status = status(response);
if (status != null) { if (status != null) {
span.setTag(Tags.HTTP_STATUS.getKey(), status); span.setTag(Tags.HTTP_STATUS, status);
if (Config.get().getHttpServerErrorStatuses().contains(status)) { if (Config.get().getHttpServerErrorStatuses().contains(status)) {
span.setError(true); span.setError(true);

View File

@ -1,14 +1,14 @@
package datadog.trace.agent.decorator; package datadog.trace.agent.decorator;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags; import datadog.trace.instrumentation.api.Tags;
public abstract class ServerDecorator extends BaseDecorator { public abstract class ServerDecorator extends BaseDecorator {
@Override @Override
public AgentSpan afterStart(final AgentSpan span) { public AgentSpan afterStart(final AgentSpan span) {
assert span != null; assert span != null;
span.setTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER); span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_SERVER);
return super.afterStart(span); return super.afterStart(span);
} }
} }

View File

@ -1,65 +1,62 @@
package datadog.trace.agent.tooling; package datadog.trace.agent.tooling;
import static io.opentracing.log.Fields.ERROR_OBJECT;
import static io.opentracing.propagation.Format.Builtin.TEXT_MAP_EXTRACT;
import static io.opentracing.propagation.Format.Builtin.TEXT_MAP_INJECT;
import static java.util.Collections.singletonMap;
import datadog.opentracing.DDSpan; import datadog.opentracing.DDSpan;
import datadog.opentracing.DDTracer;
import datadog.opentracing.NoopSpan;
import datadog.opentracing.Span;
import datadog.opentracing.SpanContext;
import datadog.opentracing.propagation.TextMapExtract;
import datadog.opentracing.propagation.TextMapInject;
import datadog.opentracing.scopemanager.DDScope;
import datadog.trace.context.TraceScope; import datadog.trace.context.TraceScope;
import datadog.trace.instrumentation.api.AgentPropagation; import datadog.trace.instrumentation.api.AgentPropagation;
import datadog.trace.instrumentation.api.AgentPropagation.Getter; import datadog.trace.instrumentation.api.AgentPropagation.Getter;
import datadog.trace.instrumentation.api.AgentScope; import datadog.trace.instrumentation.api.AgentScope;
import datadog.trace.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.api.AgentSpan;
import datadog.trace.instrumentation.api.AgentTracer.TracerAPI; import datadog.trace.instrumentation.api.AgentTracer.TracerAPI;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.SpanContext;
import io.opentracing.Tracer;
import io.opentracing.log.Fields;
import io.opentracing.noop.NoopSpan;
import io.opentracing.propagation.TextMapExtract;
import io.opentracing.propagation.TextMapInject;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
public final class OpenTracing32 implements TracerAPI { public final class AgentTracerImpl implements TracerAPI {
private final Tracer tracer = GlobalTracer.get(); private final DDTracer tracer;
private final OT32AgentPropagation propagation = new OT32AgentPropagation(); private final AgentPropagationImpl propagation = new AgentPropagationImpl();
private final OT32Span NOOP_SPAN = new OT32Span("", NoopSpan.INSTANCE); private final AgentSpanImpl NOOP_SPAN = new AgentSpanImpl("", NoopSpan.INSTANCE);
public AgentTracerImpl(final DDTracer tracer) {
this.tracer = tracer;
}
@Override @Override
public AgentSpan startSpan(final String spanName) { public AgentSpan startSpan(final String spanName) {
return new OT32Span(spanName); return new AgentSpanImpl(spanName);
} }
@Override @Override
public AgentSpan startSpan(final String spanName, final long startTimeMicros) { public AgentSpan startSpan(final String spanName, final long startTimeMicros) {
return new OT32Span(spanName, startTimeMicros); return new AgentSpanImpl(spanName, startTimeMicros);
} }
@Override @Override
public AgentSpan startSpan(final String spanName, final AgentSpan.Context parent) { public AgentSpan startSpan(final String spanName, final AgentSpan.Context parent) {
return new OT32Span(spanName, (OT32Context) parent); return new AgentSpanImpl(spanName, (AgentContextImpl) parent);
} }
@Override @Override
public AgentSpan startSpan( public AgentSpan startSpan(
final String spanName, final AgentSpan.Context parent, final long startTimeMicros) { final String spanName, final AgentSpan.Context parent, final long startTimeMicros) {
return new OT32Span(spanName, parent, startTimeMicros); return new AgentSpanImpl(spanName, parent, startTimeMicros);
} }
@Override @Override
public AgentScope activateSpan(final AgentSpan span, final boolean finishSpanOnClose) { public AgentScope activateSpan(final AgentSpan span, final boolean finishSpanOnClose) {
// when span is noopSpan(), the scope returned is not a TracerScope // when span is noopSpan(), the scope returned is not a TracerScope
final Scope scope = tracer.scopeManager().activate(((OT32Span) span).span, finishSpanOnClose); final DDScope scope =
return new OT32Scope(span, scope); tracer.scopeManager().activate(((AgentSpanImpl) span).span, finishSpanOnClose);
return new AgentScopeImpl(span, scope);
} }
@Override @Override
@ -75,12 +72,12 @@ public final class OpenTracing32 implements TracerAPI {
} else { } else {
spanName = ""; spanName = "";
} }
return new OT32Span(spanName, span); return new AgentSpanImpl(spanName, span);
} }
@Override @Override
public TraceScope activeScope() { public TraceScope activeScope() {
final Scope scope = tracer.scopeManager().active(); final DDScope scope = tracer.scopeManager().active();
if (scope instanceof TraceScope) { if (scope instanceof TraceScope) {
return (TraceScope) scope; return (TraceScope) scope;
} else { } else {
@ -98,37 +95,37 @@ public final class OpenTracing32 implements TracerAPI {
return NOOP_SPAN; return NOOP_SPAN;
} }
private final class OT32Span implements AgentSpan { private final class AgentSpanImpl implements AgentSpan {
private final Span span; private final Span span;
private volatile String spanName; private volatile String spanName;
private OT32Span(final String spanName) { private AgentSpanImpl(final String spanName) {
this(spanName, tracer.buildSpan(spanName).start()); this(spanName, tracer.buildSpan(spanName).start());
} }
private OT32Span(final String spanName, final long startTimeMicros) { private AgentSpanImpl(final String spanName, final long startTimeMicros) {
this(spanName, tracer.buildSpan(spanName).withStartTimestamp(startTimeMicros).start()); this(spanName, tracer.buildSpan(spanName).withStartTimestamp(startTimeMicros).start());
} }
private OT32Span(final String spanName, final OT32Context parent) { private AgentSpanImpl(final String spanName, final AgentContextImpl parent) {
this( this(
spanName, spanName,
tracer.buildSpan(spanName).ignoreActiveSpan().asChildOf(parent.context).start()); tracer.buildSpan(spanName).ignoreActiveSpan().asChildOf(parent.context).start());
} }
private OT32Span(final String spanName, final Context parent, final long startTimeMicros) { private AgentSpanImpl(final String spanName, final Context parent, final long startTimeMicros) {
this( this(
spanName, spanName,
tracer tracer
.buildSpan(spanName) .buildSpan(spanName)
.ignoreActiveSpan() .ignoreActiveSpan()
.asChildOf(((OT32Context) parent).context) .asChildOf(((AgentContextImpl) parent).context)
.withStartTimestamp(startTimeMicros) .withStartTimestamp(startTimeMicros)
.start()); .start());
} }
private OT32Span(final String spanName, final Span span) { private AgentSpanImpl(final String spanName, final Span span) {
this.spanName = spanName; this.spanName = spanName;
this.span = span; this.span = span;
} }
@ -168,20 +165,16 @@ public final class OpenTracing32 implements TracerAPI {
if (span instanceof DDSpan) { if (span instanceof DDSpan) {
((DDSpan) span).setError(error); ((DDSpan) span).setError(error);
} else { } else {
Tags.ERROR.set(span, error); span.setTag("error", error);
} }
return this; return this;
} }
@Override
public AgentSpan setErrorMessage(final String errorMessage) {
span.log(singletonMap(Fields.MESSAGE, errorMessage));
return this;
}
@Override @Override
public AgentSpan addThrowable(final Throwable throwable) { public AgentSpan addThrowable(final Throwable throwable) {
span.log(singletonMap(ERROR_OBJECT, throwable)); if (span instanceof DDSpan) {
((DDSpan) span).setErrorMeta(throwable);
}
return this; return this;
} }
@ -192,15 +185,15 @@ public final class OpenTracing32 implements TracerAPI {
if (root == span) { if (root == span) {
return this; return this;
} }
return new OT32Span(root.getOperationName(), (Span) root); return new AgentSpanImpl(root.getOperationName(), (Span) root);
} }
return this; return this;
} }
@Override @Override
public OT32Context context() { public AgentContextImpl context() {
final SpanContext context = span.context(); final SpanContext context = span.context();
return new OT32Context(context); return new AgentContextImpl(context);
} }
@Override @Override
@ -224,14 +217,14 @@ public final class OpenTracing32 implements TracerAPI {
} }
} }
private final class OT32Scope implements AgentScope { private final class AgentScopeImpl implements AgentScope {
private final OT32Span span; private final AgentSpanImpl span;
private final Scope scope; private final DDScope scope;
private OT32Scope(final AgentSpan span, final Scope scope) { private AgentScopeImpl(final AgentSpan span, final DDScope scope) {
assert span instanceof OT32Span; assert span instanceof AgentSpanImpl;
this.span = (OT32Span) span; this.span = (AgentSpanImpl) span;
this.scope = scope; this.scope = scope;
} }
@ -254,11 +247,11 @@ public final class OpenTracing32 implements TracerAPI {
} }
} }
private final class OT32AgentPropagation implements AgentPropagation { private final class AgentPropagationImpl implements AgentPropagation {
@Override @Override
public TraceScope.Continuation capture() { public TraceScope.Continuation capture() {
final Scope active = tracer.scopeManager().active(); final DDScope active = tracer.scopeManager().active();
if (active instanceof TraceScope) { if (active instanceof TraceScope) {
return ((TraceScope) active).capture(); return ((TraceScope) active).capture();
} else { } else {
@ -268,11 +261,10 @@ public final class OpenTracing32 implements TracerAPI {
@Override @Override
public <C> void inject(final AgentSpan span, final C carrier, final Setter<C> setter) { public <C> void inject(final AgentSpan span, final C carrier, final Setter<C> setter) {
assert span instanceof OT32Span; assert span instanceof AgentSpanImpl;
tracer.inject( tracer.inject(
((OT32Span) span).getSpan().context(), ((AgentSpanImpl) span).getSpan().context(),
TEXT_MAP_INJECT, new AgentPropagationImpl.Injector<>(carrier, setter));
new OT32AgentPropagation.Injector<>(carrier, setter));
} }
private final class Injector<C> implements TextMapInject { private final class Injector<C> implements TextMapInject {
@ -292,7 +284,7 @@ public final class OpenTracing32 implements TracerAPI {
@Override @Override
public <C> AgentSpan.Context extract(final C carrier, final Getter<C> getter) { public <C> AgentSpan.Context extract(final C carrier, final Getter<C> getter) {
return new OT32Context(tracer.extract(TEXT_MAP_EXTRACT, new Extractor(carrier, getter))); return new AgentContextImpl(tracer.extract(new Extractor(carrier, getter)));
} }
} }
@ -312,26 +304,11 @@ public final class OpenTracing32 implements TracerAPI {
} }
} }
private static final class OT32Context implements AgentSpan.Context, SpanContext { private static final class AgentContextImpl implements AgentSpan.Context, SpanContext {
private final SpanContext context; private final SpanContext context;
private OT32Context(final SpanContext context) { private AgentContextImpl(final SpanContext context) {
this.context = context; this.context = context;
} }
@Override
public String toTraceId() {
return context.toTraceId();
}
@Override
public String toSpanId() {
return context.toSpanId();
}
@Override
public Iterable<Entry<String, String>> baggageItems() {
return context.baggageItems();
}
} }
} }

View File

@ -5,7 +5,6 @@ import static datadog.trace.bootstrap.WeakMap.Provider.newWeakMap;
import datadog.trace.bootstrap.DatadogClassLoader; import datadog.trace.bootstrap.DatadogClassLoader;
import datadog.trace.bootstrap.PatchLogger; import datadog.trace.bootstrap.PatchLogger;
import datadog.trace.bootstrap.WeakMap; import datadog.trace.bootstrap.WeakMap;
import io.opentracing.util.GlobalTracer;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@ -101,10 +100,6 @@ public class ClassLoaderMatcher {
*/ */
private boolean delegatesToBootstrap(final ClassLoader loader) { private boolean delegatesToBootstrap(final ClassLoader loader) {
boolean delegates = true; boolean delegates = true;
if (!loadsExpectedClass(loader, GlobalTracer.class)) {
log.debug("loader {} failed to delegate bootstrap opentracing class", loader);
delegates = false;
}
if (!loadsExpectedClass(loader, PatchLogger.class)) { if (!loadsExpectedClass(loader, PatchLogger.class)) {
log.debug("loader {} failed to delegate bootstrap datadog class", loader); log.debug("loader {} failed to delegate bootstrap datadog class", loader);
delegates = false; delegates = false;

View File

@ -18,8 +18,7 @@ public final class Constants {
"datadog.trace.api", "datadog.trace.api",
"datadog.trace.bootstrap", "datadog.trace.bootstrap",
"datadog.trace.context", "datadog.trace.context",
"datadog.trace.instrumentation.api", "datadog.trace.instrumentation.api"
"io.opentracing",
}; };
// This is used in IntegrationTestUtils.java // This is used in IntegrationTestUtils.java
@ -35,8 +34,6 @@ public final class Constants {
"com.blogspot.mydailyjava.weaklockfree", "com.blogspot.mydailyjava.weaklockfree",
// bytebuddy // bytebuddy
"net.bytebuddy", "net.bytebuddy",
// OT contribs for dd trace resolver
"io.opentracing.contrib",
"org.yaml.snakeyaml", "org.yaml.snakeyaml",
// disruptor // disruptor
"com.lmax.disruptor", "com.lmax.disruptor",

View File

@ -10,29 +10,20 @@ public class TracerInstaller {
/** Register a global tracer if no global tracer is already registered. */ /** Register a global tracer if no global tracer is already registered. */
public static synchronized void installGlobalTracer() { public static synchronized void installGlobalTracer() {
if (Config.get().isTraceEnabled()) { if (Config.get().isTraceEnabled()) {
if (!io.opentracing.util.GlobalTracer.isRegistered()) { final DDTracer tracer = new DDTracer();
final DDTracer tracer = new DDTracer(); try {
try { datadog.trace.api.GlobalTracer.registerIfAbsent(tracer);
io.opentracing.util.GlobalTracer.register(tracer); AgentTracer.registerIfAbsent(new AgentTracerImpl(tracer));
datadog.trace.api.GlobalTracer.registerIfAbsent(tracer); } catch (final RuntimeException re) {
AgentTracer.registerIfAbsent(new OpenTracing32()); log.warn("Failed to register tracer '" + tracer + "'", re);
} catch (final RuntimeException re) {
log.warn("Failed to register tracer '" + tracer + "'", re);
}
} else {
log.debug("GlobalTracer already registered.");
} }
} else { } else {
log.debug("Tracing is disabled, not installing GlobalTracer."); log.debug("Tracing is disabled.");
} }
} }
public static void logVersionInfo() { public static void logVersionInfo() {
VersionLogger.logAllVersions(); VersionLogger.logAllVersions();
log.debug(
io.opentracing.util.GlobalTracer.class.getName()
+ " loaded on "
+ io.opentracing.util.GlobalTracer.class.getClassLoader());
log.debug( log.debug(
AgentInstaller.class.getName() + " loaded on " + AgentInstaller.class.getClassLoader()); AgentInstaller.class.getName() + " loaded on " + AgentInstaller.class.getClassLoader());
} }

View File

@ -4,8 +4,8 @@ package datadog.trace.agent.decorator
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import datadog.trace.instrumentation.api.AgentScope import datadog.trace.instrumentation.api.AgentScope
import datadog.trace.instrumentation.api.AgentSpan import datadog.trace.instrumentation.api.AgentSpan
import datadog.trace.instrumentation.api.Tags
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.tag.Tags
import spock.lang.Shared import spock.lang.Shared
class BaseDecoratorTest extends DDSpecification { class BaseDecoratorTest extends DDSpecification {
@ -21,7 +21,7 @@ class BaseDecoratorTest extends DDSpecification {
then: then:
1 * span.setTag(DDTags.SPAN_TYPE, decorator.spanType()) 1 * span.setTag(DDTags.SPAN_TYPE, decorator.spanType())
1 * span.setTag(Tags.COMPONENT.key, "test-component") 1 * span.setTag(Tags.COMPONENT, "test-component")
_ * span.setTag(_, _) // Want to allow other calls from child implementations. _ * span.setTag(_, _) // Want to allow other calls from child implementations.
0 * _ 0 * _
} }
@ -32,16 +32,16 @@ class BaseDecoratorTest extends DDSpecification {
then: then:
if (connection.getAddress()) { if (connection.getAddress()) {
2 * span.setTag(Tags.PEER_HOSTNAME.key, connection.hostName) 2 * span.setTag(Tags.PEER_HOSTNAME, connection.hostName)
} else { } else {
1 * span.setTag(Tags.PEER_HOSTNAME.key, connection.hostName) 1 * span.setTag(Tags.PEER_HOSTNAME, connection.hostName)
} }
1 * span.setTag(Tags.PEER_PORT.key, connection.port) 1 * span.setTag(Tags.PEER_PORT, connection.port)
if (connection.address instanceof Inet4Address) { if (connection.address instanceof Inet4Address) {
1 * span.setTag(Tags.PEER_HOST_IPV4.key, connection.address.hostAddress) 1 * span.setTag(Tags.PEER_HOST_IPV4, connection.address.hostAddress)
} }
if (connection.address instanceof Inet6Address) { if (connection.address instanceof Inet6Address) {
1 * span.setTag(Tags.PEER_HOST_IPV6.key, connection.address.hostAddress) 1 * span.setTag(Tags.PEER_HOST_IPV6, connection.address.hostAddress)
} }
0 * _ 0 * _

View File

@ -2,7 +2,7 @@ package datadog.trace.agent.decorator
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import datadog.trace.instrumentation.api.AgentSpan import datadog.trace.instrumentation.api.AgentSpan
import io.opentracing.tag.Tags import datadog.trace.instrumentation.api.Tags
class ClientDecoratorTest extends BaseDecoratorTest { class ClientDecoratorTest extends BaseDecoratorTest {
@ -19,8 +19,8 @@ class ClientDecoratorTest extends BaseDecoratorTest {
if (serviceName != null) { if (serviceName != null) {
1 * span.setTag(DDTags.SERVICE_NAME, serviceName) 1 * span.setTag(DDTags.SERVICE_NAME, serviceName)
} }
1 * span.setTag(Tags.COMPONENT.key, "test-component") 1 * span.setTag(Tags.COMPONENT, "test-component")
1 * span.setTag(Tags.SPAN_KIND.key, "client") 1 * span.setTag(Tags.SPAN_KIND, "client")
1 * span.setTag(DDTags.SPAN_TYPE, decorator.spanType()) 1 * span.setTag(DDTags.SPAN_TYPE, decorator.spanType())
_ * span.setTag(_, _) // Want to allow other calls from child implementations. _ * span.setTag(_, _) // Want to allow other calls from child implementations.
0 * _ 0 * _

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.decorator
import datadog.trace.api.Config import datadog.trace.api.Config
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import datadog.trace.instrumentation.api.AgentSpan import datadog.trace.instrumentation.api.AgentSpan
import io.opentracing.tag.Tags import datadog.trace.instrumentation.api.Tags
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
@ -22,9 +22,9 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest {
if (serviceName != null) { if (serviceName != null) {
1 * span.setTag(DDTags.SERVICE_NAME, serviceName) 1 * span.setTag(DDTags.SERVICE_NAME, serviceName)
} }
1 * span.setTag(Tags.COMPONENT.key, "test-component") 1 * span.setTag(Tags.COMPONENT, "test-component")
1 * span.setTag(Tags.SPAN_KIND.key, "client") 1 * span.setTag(Tags.SPAN_KIND, "client")
1 * span.setTag(Tags.DB_TYPE.key, "test-db") 1 * span.setTag(Tags.DB_TYPE, "test-db")
1 * span.setTag(DDTags.SPAN_TYPE, "test-type") 1 * span.setTag(DDTags.SPAN_TYPE, "test-type")
0 * _ 0 * _
@ -43,8 +43,8 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest {
then: then:
if (session) { if (session) {
1 * span.setTag(Tags.DB_USER.key, session.user) 1 * span.setTag(Tags.DB_USER, session.user)
1 * span.setTag(Tags.DB_INSTANCE.key, session.instance) 1 * span.setTag(Tags.DB_INSTANCE, session.instance)
if (renameService && session.instance) { if (renameService && session.instance) {
1 * span.setTag(DDTags.SERVICE_NAME, session.instance) 1 * span.setTag(DDTags.SERVICE_NAME, session.instance)
} }
@ -67,7 +67,7 @@ class DatabaseClientDecoratorTest extends ClientDecoratorTest {
decorator.onStatement(span, statement) decorator.onStatement(span, statement)
then: then:
1 * span.setTag(Tags.DB_STATEMENT.key, statement) 1 * span.setTag(Tags.DB_STATEMENT, statement)
0 * _ 0 * _
where: where:

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.decorator
import datadog.trace.api.Config import datadog.trace.api.Config
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import datadog.trace.instrumentation.api.AgentSpan import datadog.trace.instrumentation.api.AgentSpan
import io.opentracing.tag.Tags import datadog.trace.instrumentation.api.Tags
import spock.lang.Shared import spock.lang.Shared
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
@ -26,10 +26,10 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
then: then:
if (req) { if (req) {
1 * span.setTag(Tags.HTTP_METHOD.key, req.method) 1 * span.setTag(Tags.HTTP_METHOD, req.method)
1 * span.setTag(Tags.HTTP_URL.key, "$req.url") 1 * span.setTag(Tags.HTTP_URL, "$req.url")
1 * span.setTag(Tags.PEER_HOSTNAME.key, req.host) 1 * span.setTag(Tags.PEER_HOSTNAME, req.host)
1 * span.setTag(Tags.PEER_PORT.key, req.port) 1 * span.setTag(Tags.PEER_PORT, req.port)
if (renameService) { if (renameService) {
1 * span.setTag(DDTags.SERVICE_NAME, req.host) 1 * span.setTag(DDTags.SERVICE_NAME, req.host)
} }
@ -55,14 +55,14 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
then: then:
if (expectedUrl) { if (expectedUrl) {
1 * span.setTag(Tags.HTTP_URL.key, expectedUrl) 1 * span.setTag(Tags.HTTP_URL, expectedUrl)
} }
if (expectedUrl && tagQueryString) { if (expectedUrl && tagQueryString) {
1 * span.setTag(DDTags.HTTP_QUERY, expectedQuery) 1 * span.setTag(DDTags.HTTP_QUERY, expectedQuery)
1 * span.setTag(DDTags.HTTP_FRAGMENT, expectedFragment) 1 * span.setTag(DDTags.HTTP_FRAGMENT, expectedFragment)
} }
1 * span.setTag(Tags.HTTP_METHOD.key, null) 1 * span.setTag(Tags.HTTP_METHOD, null)
1 * span.setTag(Tags.PEER_HOSTNAME.key, null) 1 * span.setTag(Tags.PEER_HOSTNAME, null)
0 * _ 0 * _
where: where:
@ -94,7 +94,7 @@ class HttpClientDecoratorTest extends ClientDecoratorTest {
then: then:
if (status) { if (status) {
1 * span.setTag(Tags.HTTP_STATUS.key, status) 1 * span.setTag(Tags.HTTP_STATUS, status)
} }
if (error) { if (error) {
1 * span.setError(true) 1 * span.setError(true)

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.decorator
import datadog.trace.api.Config import datadog.trace.api.Config
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import datadog.trace.instrumentation.api.AgentSpan import datadog.trace.instrumentation.api.AgentSpan
import io.opentracing.tag.Tags import datadog.trace.instrumentation.api.Tags
import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride import static datadog.trace.agent.test.utils.ConfigUtils.withConfigOverride
@ -20,8 +20,8 @@ class HttpServerDecoratorTest extends ServerDecoratorTest {
then: then:
if (req) { if (req) {
1 * span.setTag(Tags.HTTP_METHOD.key, "test-method") 1 * span.setTag(Tags.HTTP_METHOD, "test-method")
1 * span.setTag(Tags.HTTP_URL.key, url) 1 * span.setTag(Tags.HTTP_URL, url)
} }
0 * _ 0 * _
@ -46,13 +46,13 @@ class HttpServerDecoratorTest extends ServerDecoratorTest {
then: then:
if (expectedUrl) { if (expectedUrl) {
1 * span.setTag(Tags.HTTP_URL.key, expectedUrl) 1 * span.setTag(Tags.HTTP_URL, expectedUrl)
} }
if (expectedUrl && tagQueryString) { if (expectedUrl && tagQueryString) {
1 * span.setTag(DDTags.HTTP_QUERY, expectedQuery) 1 * span.setTag(DDTags.HTTP_QUERY, expectedQuery)
1 * span.setTag(DDTags.HTTP_FRAGMENT, expectedFragment) 1 * span.setTag(DDTags.HTTP_FRAGMENT, expectedFragment)
} }
1 * span.setTag(Tags.HTTP_METHOD.key, null) 1 * span.setTag(Tags.HTTP_METHOD, null)
0 * _ 0 * _
where: where:
@ -83,12 +83,12 @@ class HttpServerDecoratorTest extends ServerDecoratorTest {
then: then:
if (conn) { if (conn) {
1 * span.setTag(Tags.PEER_HOSTNAME.key, "test-host") 1 * span.setTag(Tags.PEER_HOSTNAME, "test-host")
1 * span.setTag(Tags.PEER_PORT.key, 555) 1 * span.setTag(Tags.PEER_PORT, 555)
if (ipv4) { if (ipv4) {
1 * span.setTag(Tags.PEER_HOST_IPV4.key, "10.0.0.1") 1 * span.setTag(Tags.PEER_HOST_IPV4, "10.0.0.1")
} else if (ipv4 != null) { } else if (ipv4 != null) {
1 * span.setTag(Tags.PEER_HOST_IPV6.key, "3ffe:1900:4545:3:200:f8ff:fe21:67cf") 1 * span.setTag(Tags.PEER_HOST_IPV6, "3ffe:1900:4545:3:200:f8ff:fe21:67cf")
} }
} }
0 * _ 0 * _
@ -112,7 +112,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest {
then: then:
if (status) { if (status) {
1 * span.setTag(Tags.HTTP_STATUS.key, status) 1 * span.setTag(Tags.HTTP_STATUS, status)
} }
if (error) { if (error) {
1 * span.setError(true) 1 * span.setError(true)

View File

@ -3,7 +3,7 @@ package datadog.trace.agent.decorator
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import datadog.trace.instrumentation.api.AgentSpan import datadog.trace.instrumentation.api.AgentSpan
import io.opentracing.tag.Tags import datadog.trace.instrumentation.api.Tags
class ServerDecoratorTest extends BaseDecoratorTest { class ServerDecoratorTest extends BaseDecoratorTest {
@ -15,8 +15,8 @@ class ServerDecoratorTest extends BaseDecoratorTest {
decorator.afterStart(span) decorator.afterStart(span)
then: then:
1 * span.setTag(Tags.COMPONENT.key, "test-component") 1 * span.setTag(Tags.COMPONENT, "test-component")
1 * span.setTag(Tags.SPAN_KIND.key, "server") 1 * span.setTag(Tags.SPAN_KIND, "server")
1 * span.setTag(DDTags.SPAN_TYPE, decorator.spanType()) 1 * span.setTag(DDTags.SPAN_TYPE, decorator.spanType())
0 * _ 0 * _
} }

View File

@ -1,7 +1,7 @@
dependencies { dependencies {
compile project(':dd-trace-api') compile project(':dd-trace-api')
compile project(':dd-java-agent:agent-bootstrap')
compile project(':dd-java-agent:benchmark-integration') compile project(':dd-java-agent:benchmark-integration')
compile deps.opentracing
compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.1.v20170120' compile group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.1.v20170120'
compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.1.v20170120' compile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.1.v20170120'

View File

@ -1,8 +1,9 @@
package datadog.perftest; package datadog.perftest;
import static datadog.trace.instrumentation.api.AgentTracer.activeSpan;
import datadog.trace.api.Trace; import datadog.trace.api.Trace;
import io.opentracing.Span; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.util.GlobalTracer;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
public class Worker { public class Worker {
@ -10,7 +11,7 @@ public class Worker {
@Trace @Trace
/** Simulate work for the give number of milliseconds. */ /** Simulate work for the give number of milliseconds. */
public static void doWork(final long workTimeMS) { public static void doWork(final long workTimeMS) {
final Span span = GlobalTracer.get().activeSpan(); final AgentSpan span = activeSpan();
if (span != null) { if (span != null) {
span.setTag("work-time", workTimeMS); span.setTag("work-time", workTimeMS);
span.setTag("info", "interesting stuff"); span.setTag("info", "interesting stuff");

View File

@ -1,9 +1,10 @@
package datadog.perftest.jetty; package datadog.perftest.jetty;
import static datadog.trace.instrumentation.api.AgentTracer.activeSpan;
import datadog.perftest.Worker; import datadog.perftest.Worker;
import datadog.trace.api.Trace; import datadog.trace.api.Trace;
import io.opentracing.Span; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.util.GlobalTracer;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
@ -58,7 +59,7 @@ public class JettyPerftest {
@Trace @Trace
private void scheduleWork(final long workTimeMS) { private void scheduleWork(final long workTimeMS) {
final Span span = GlobalTracer.get().activeSpan(); final AgentSpan span = activeSpan();
if (span != null) { if (span != null) {
span.setTag("work-time", workTimeMS); span.setTag("work-time", workTimeMS);
span.setTag("info", "interesting stuff"); span.setTag("info", "interesting stuff");

View File

@ -1,8 +1,8 @@
package controllers package controllers
import datadog.trace.instrumentation.api.AgentTracer.activeSpan
import datadog.trace.api.Trace import datadog.trace.api.Trace
import io.opentracing.Span
import io.opentracing.util.GlobalTracer
import javax.inject.Inject import javax.inject.Inject
import play.api.mvc._ import play.api.mvc._
@ -30,7 +30,7 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl
@Trace @Trace
private def scheduleWork(workTimeMS: Long) { private def scheduleWork(workTimeMS: Long) {
val span = GlobalTracer.get().activeSpan val span = activeSpan
if (span != null) { if (span != null) {
span.setTag("work-time", workTimeMS) span.setTag("work-time", workTimeMS)
span.setTag("info", "interesting stuff") span.setTag("info", "interesting stuff")

View File

@ -1,14 +1,14 @@
package controllers package controllers
import datadog.trace.instrumentation.api.AgentTracer.activeSpan
import datadog.trace.api.Trace import datadog.trace.api.Trace
import io.opentracing.Span
import io.opentracing.util.GlobalTracer
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
object Worker { object Worker {
@Trace @Trace
def doWork(workTimeMS: Long) = { def doWork(workTimeMS: Long) = {
val span = GlobalTracer.get.activeSpan val span = activeSpan
if (span != null) { if (span != null) {
span.setTag("work-time", workTimeMS) span.setTag("work-time", workTimeMS)
span.setTag("info", "interesting stuff") span.setTag("info", "interesting stuff")

View File

@ -21,8 +21,8 @@ dependencies {
play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion" play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion"
play project(':dd-trace-api') play project(':dd-trace-api')
play project(':dd-java-agent:agent-bootstrap')
play project(':dd-java-agent:benchmark-integration') play project(':dd-java-agent:benchmark-integration')
play deps.opentracing
} }
repositories { repositories {

View File

@ -6,6 +6,7 @@ apply from: "${rootDir}/gradle/java.gradle"
dependencies { dependencies {
jmh project(':dd-trace-api') jmh project(':dd-trace-api')
jmh project(':dd-trace-ot')
jmh group: 'net.bytebuddy', name: 'byte-buddy-agent', version: '1.7.6' jmh group: 'net.bytebuddy', name: 'byte-buddy-agent', version: '1.7.6'
// Add a bunch of dependencies so instrumentation is not disabled. // Add a bunch of dependencies so instrumentation is not disabled.

View File

@ -2,10 +2,10 @@ package datadog.benchmark;
import datadog.benchmark.classes.TracedClass; import datadog.benchmark.classes.TracedClass;
import datadog.benchmark.classes.UntracedClass; import datadog.benchmark.classes.UntracedClass;
import datadog.opentracing.DDTracer;
import datadog.trace.api.GlobalTracer;
import java.lang.instrument.Instrumentation; import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException; import java.lang.instrument.UnmodifiableClassException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.file.Paths; import java.nio.file.Paths;
import net.bytebuddy.agent.ByteBuddyAgent; import net.bytebuddy.agent.ByteBuddyAgent;
import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Benchmark;
@ -37,15 +37,7 @@ public class ClassRetransformingBenchmark {
@TearDown @TearDown
public void stopAgent() { public void stopAgent() {
try { ((DDTracer) GlobalTracer.get()).close();
final Class<?> gt = Class.forName("io.opentracing.util.GlobalTracer");
final Field tracerField = gt.getDeclaredField("tracer");
tracerField.setAccessible(true);
final Object tracer = tracerField.get(null);
final Method close = tracer.getClass().getMethod("close");
close.invoke(tracer);
} catch (final Exception e) {
}
} }
} }

View File

@ -104,7 +104,6 @@ dependencies {
testCompile project(':dd-trace-ot') testCompile project(':dd-trace-ot')
testCompile project(':utils:gc-utils') testCompile project(':utils:gc-utils')
testCompile deps.opentracingMock
testCompile deps.testLogging testCompile deps.testLogging
testCompile deps.guava testCompile deps.guava

View File

@ -74,7 +74,6 @@ dependencies {
compile project(':dd-trace-api') compile project(':dd-trace-api')
compile project(':dd-java-agent:agent-tooling') compile project(':dd-java-agent:agent-tooling')
compile deps.opentracing
compile deps.autoservice compile deps.autoservice
annotationProcessor deps.autoservice annotationProcessor deps.autoservice

View File

@ -121,7 +121,6 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default {
// for a failed request. Thus, check the response code // for a failed request. Thus, check the response code
if (response != null && !response.isSuccessStatusCode()) { if (response != null && !response.isSuccessStatusCode()) {
span.setError(true); span.setError(true);
span.setErrorMessage(response.getStatusMessage());
} }
DECORATE.beforeFinish(span); DECORATE.beforeFinish(span);

View File

@ -10,7 +10,7 @@ class OSGIClassloadingTest extends AgentTestRunner {
@Rule @Rule
public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties() public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties()
static final String BOOT_DELEGATION_ADDITION = "datadog.slf4j.*,datadog.slf4j,datadog.trace.api.*,datadog.trace.api,datadog.trace.bootstrap.*,datadog.trace.bootstrap,datadog.trace.context.*,datadog.trace.context,datadog.trace.instrumentation.api.*,datadog.trace.instrumentation.api,io.opentracing.*,io.opentracing" static final String BOOT_DELEGATION_ADDITION = "datadog.slf4j.*,datadog.slf4j,datadog.trace.api.*,datadog.trace.api,datadog.trace.bootstrap.*,datadog.trace.bootstrap,datadog.trace.context.*,datadog.trace.context,datadog.trace.instrumentation.api.*,datadog.trace.instrumentation.api"
def "delegation property set on module load"() { def "delegation property set on module load"() {
when: when:

View File

@ -3,6 +3,7 @@ apply from: "${rootDir}/gradle/java.gradle"
dependencies { dependencies {
compile project(':dd-trace-api') compile project(':dd-trace-api')
compile project(':dd-trace-ot') compile project(':dd-trace-ot')
compile project(':dd-java-agent:agent-bootstrap')
compile 'info.picocli:picocli:4.0.4' compile 'info.picocli:picocli:4.0.4'
compile deps.guava compile deps.guava
@ -13,6 +14,6 @@ task launch(type: JavaExec) {
main = 'datadog.loadgenerator.LoadGenerator' main = 'datadog.loadgenerator.LoadGenerator'
jvmArgs = ["-javaagent:${project(':dd-java-agent').shadowJar.archivePath}", "-Ddd.service.name=loadtest"] jvmArgs = ["-javaagent:${project(':dd-java-agent').shadowJar.archivePath}", "-Ddd.service.name=loadtest"]
systemProperties System.properties systemProperties System.properties
dependsOn project(':dd-java-agent').shadowJar dependsOn project(':dd-java-agent').shadowJar
} }

View File

@ -1,10 +1,11 @@
package datadog.loadgenerator; package datadog.loadgenerator;
import static datadog.trace.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.instrumentation.api.AgentTracer.startSpan;
import com.google.common.util.concurrent.RateLimiter; import com.google.common.util.concurrent.RateLimiter;
import io.opentracing.Scope; import datadog.trace.instrumentation.api.AgentScope;
import io.opentracing.Span; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
@ -90,19 +91,18 @@ public class LoadGenerator implements Callable<Integer> {
@Override @Override
public void run() { public void run() {
final Tracer tracer = GlobalTracer.get();
while (true) { while (true) {
rateLimiter.acquire(); rateLimiter.acquire();
final Span parent = tracer.buildSpan("parentSpan").start(); final AgentSpan parent = startSpan("parentSpan");
try (final Scope scope = tracer.activateSpan(parent)) { try (final AgentScope scope = activateSpan(parent, true)) {
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
final Span widthSpan = tracer.buildSpan("span-" + i).start(); final AgentSpan widthSpan = startSpan("span-" + i);
try (final Scope widthScope = tracer.activateSpan(widthSpan)) { try (final AgentScope widthScope = activateSpan(widthSpan, true)) {
for (int j = 0; j < depth - 2; j++) { for (int j = 0; j < depth - 2; j++) {
final Span depthSpan = tracer.buildSpan("span-" + i + "-" + j).start(); final AgentSpan depthSpan = startSpan("span-" + i + "-" + j);
try (final Scope depthScope = tracer.activateSpan(depthSpan)) { try (final AgentScope depthScope = activateSpan(depthSpan, true)) {
// do nothing. Maybe sleep? but that will mean we need more threads to keep the // do nothing. Maybe sleep? but that will mean we need more threads to keep the
// effective rate // effective rate
} finally { } finally {

View File

@ -3,12 +3,8 @@ package datadog.trace.agent.integration.classloading
import com.google.common.collect.MapMaker import com.google.common.collect.MapMaker
import com.google.common.reflect.ClassPath import com.google.common.reflect.ClassPath
import datadog.trace.agent.test.IntegrationTestUtils import datadog.trace.agent.test.IntegrationTestUtils
import io.opentracing.util.GlobalTracer
import spock.lang.Ignore
import spock.lang.Specification import spock.lang.Specification
import java.lang.reflect.Field
class ShadowPackageRenamingTest extends Specification { class ShadowPackageRenamingTest extends Specification {
def "agent dependencies renamed"() { def "agent dependencies renamed"() {
setup: setup:
@ -34,20 +30,6 @@ class ShadowPackageRenamingTest extends Specification {
agentSource.getFile() != userGuava.getFile() agentSource.getFile() != userGuava.getFile()
} }
@Ignore("OT 0.32 removed this field. Need to find another option.")
def "java getLogger rewritten to safe logger"() {
setup:
Field logField = GlobalTracer.getDeclaredField("LOGGER")
logField.setAccessible(true)
Object logger = logField.get(null)
expect:
!logger.getClass().getName().startsWith("java.util.logging")
cleanup:
logField?.setAccessible(false)
}
def "agent classes not visible"() { def "agent classes not visible"() {
when: when:
ClassLoader.getSystemClassLoader().loadClass("datadog.trace.agent.tooling.AgentInstaller") ClassLoader.getSystemClassLoader().loadClass("datadog.trace.agent.tooling.AgentInstaller")

View File

@ -1,7 +1,5 @@
package datadog.trace.agent.test; package datadog.trace.agent.test;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -129,30 +127,6 @@ public class IntegrationTestUtils {
} }
} }
public static void registerOrReplaceGlobalTracer(final Tracer tracer) {
try {
GlobalTracer.register(tracer);
} catch (final Exception e) {
// Force it anyway using reflection
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
field.set(null, tracer);
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
}
if (!GlobalTracer.isRegistered()) {
throw new RuntimeException("Unable to register the global tracer.");
}
}
/** com.foo.Bar -> com/foo/Bar.class */ /** com.foo.Bar -> com/foo/Bar.class */
public static String getResourceName(final String className) { public static String getResourceName(final String className) {
return className.replace('.', '/') + ".class"; return className.replace('.', '/') + ".class";

View File

@ -6,6 +6,7 @@ import com.google.common.collect.Sets;
import datadog.opentracing.DDSpan; import datadog.opentracing.DDSpan;
import datadog.opentracing.DDTracer; import datadog.opentracing.DDTracer;
import datadog.opentracing.PendingTrace; import datadog.opentracing.PendingTrace;
import datadog.opentracing.Span;
import datadog.trace.agent.test.asserts.ListWriterAssert; import datadog.trace.agent.test.asserts.ListWriterAssert;
import datadog.trace.agent.test.utils.GlobalTracerUtils; import datadog.trace.agent.test.utils.GlobalTracerUtils;
import datadog.trace.agent.tooling.AgentInstaller; import datadog.trace.agent.tooling.AgentInstaller;
@ -18,8 +19,6 @@ import groovy.lang.Closure;
import groovy.lang.DelegatesTo; import groovy.lang.DelegatesTo;
import groovy.transform.stc.ClosureParams; import groovy.transform.stc.ClosureParams;
import groovy.transform.stc.SimpleType; import groovy.transform.stc.SimpleType;
import io.opentracing.Span;
import io.opentracing.Tracer;
import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation; import java.lang.instrument.Instrumentation;
import java.util.List; import java.util.List;
@ -69,10 +68,7 @@ public abstract class AgentTestRunner extends DDSpecification {
*/ */
public static final ListWriter TEST_WRITER; public static final ListWriter TEST_WRITER;
// having a reference to io.opentracing.Tracer in test field protected static final DDTracer TEST_TRACER;
// loads opentracing before bootstrap classpath is setup
// so we declare tracer as an object and cast when needed.
protected static final Object TEST_TRACER;
protected static final Set<String> TRANSFORMED_CLASSES = Sets.newConcurrentHashSet(); protected static final Set<String> TRANSFORMED_CLASSES = Sets.newConcurrentHashSet();
private static final AtomicInteger INSTRUMENTATION_ERROR_COUNT = new AtomicInteger(); private static final AtomicInteger INSTRUMENTATION_ERROR_COUNT = new AtomicInteger();
@ -96,12 +92,12 @@ public abstract class AgentTestRunner extends DDSpecification {
} }
}; };
TEST_TRACER = new DDTracer(TEST_WRITER); TEST_TRACER = new DDTracer(TEST_WRITER);
GlobalTracerUtils.registerOrReplaceGlobalTracer((Tracer) TEST_TRACER); GlobalTracerUtils.registerOrReplaceGlobalTracer(TEST_TRACER);
GlobalTracer.registerIfAbsent((datadog.trace.api.Tracer) TEST_TRACER); GlobalTracer.registerIfAbsent(TEST_TRACER);
} }
protected static Tracer getTestTracer() { protected static DDTracer getTestTracer() {
return (Tracer) TEST_TRACER; return TEST_TRACER;
} }
protected static Writer getTestWriter() { protected static Writer getTestWriter() {
@ -204,7 +200,7 @@ public abstract class AgentTestRunner extends DDSpecification {
@SneakyThrows @SneakyThrows
public static void blockUntilChildSpansFinished(final int numberOfSpans) { public static void blockUntilChildSpansFinished(final int numberOfSpans) {
final Span span = io.opentracing.util.GlobalTracer.get().activeSpan(); final Span span = ((DDTracer) GlobalTracer.get()).activeSpan();
final long deadline = System.currentTimeMillis() + TIMEOUT_MILLIS; final long deadline = System.currentTimeMillis() + TIMEOUT_MILLIS;
if (span instanceof DDSpan) { if (span instanceof DDSpan) {
final PendingTrace pendingTrace = ((DDSpan) span).context().getTrace(); final PendingTrace pendingTrace = ((DDSpan) span).context().getTrace();

View File

@ -35,8 +35,7 @@ public class SpockRunner extends Sputnik {
"datadog.trace.api", "datadog.trace.api",
"datadog.trace.bootstrap", "datadog.trace.bootstrap",
"datadog.trace.context", "datadog.trace.context",
"datadog.trace.instrumentation.api", "datadog.trace.instrumentation.api"
"io.opentracing",
}; };
private static final String[] TEST_BOOTSTRAP_PREFIXES; private static final String[] TEST_BOOTSTRAP_PREFIXES;
@ -44,7 +43,6 @@ public class SpockRunner extends Sputnik {
static { static {
ByteBuddyAgent.install(); ByteBuddyAgent.install();
final String[] testBS = { final String[] testBS = {
"io.opentracing",
"org.slf4j", "org.slf4j",
"ch.qos.logback", "ch.qos.logback",
// Tomcat's servlet classes must be on boostrap // Tomcat's servlet classes must be on boostrap

View File

@ -1,50 +1,11 @@
package datadog.trace.agent.test.utils; package datadog.trace.agent.test.utils;
import datadog.trace.agent.tooling.OpenTracing32; import datadog.opentracing.DDTracer;
import datadog.trace.agent.tooling.AgentTracerImpl;
import datadog.trace.instrumentation.api.AgentTracer; import datadog.trace.instrumentation.api.AgentTracer;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import java.lang.reflect.Field;
public class GlobalTracerUtils { public class GlobalTracerUtils {
public static void registerOrReplaceGlobalTracer(final Tracer tracer) { public static void registerOrReplaceGlobalTracer(final DDTracer tracer) {
try { AgentTracer.registerIfAbsent(new AgentTracerImpl(tracer));
GlobalTracer.register(tracer);
AgentTracer.registerIfAbsent(new OpenTracing32());
} catch (final Exception e) {
// Force it anyway using reflection
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
field.set(null, tracer);
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
}
if (!GlobalTracer.isRegistered()) {
throw new RuntimeException("Unable to register the global tracer.");
}
}
/** Get the tracer implementation out of the GlobalTracer */
public static Tracer getUnderlyingGlobalTracer() {
Field field = null;
try {
field = GlobalTracer.class.getDeclaredField("tracer");
field.setAccessible(true);
return (Tracer) field.get(GlobalTracer.get());
} catch (final Exception e2) {
throw new IllegalStateException(e2);
} finally {
if (null != field) {
field.setAccessible(false);
}
}
} }
} }

View File

@ -3,11 +3,7 @@ import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.SpockRunner import datadog.trace.agent.test.SpockRunner
import datadog.trace.agent.test.utils.ClasspathUtils import datadog.trace.agent.test.utils.ClasspathUtils
import datadog.trace.agent.test.utils.ConfigUtils import datadog.trace.agent.test.utils.ConfigUtils
import datadog.trace.agent.test.utils.GlobalTracerUtils
import datadog.trace.agent.tooling.Constants import datadog.trace.agent.tooling.Constants
import io.opentracing.Span
import io.opentracing.Tracer
import spock.lang.Shared
import java.lang.reflect.Field import java.lang.reflect.Field
import java.util.concurrent.TimeoutException import java.util.concurrent.TimeoutException
@ -17,26 +13,16 @@ import static datadog.trace.api.Config.TRACE_CLASSES_EXCLUDE
class AgentTestRunnerTest extends AgentTestRunner { class AgentTestRunnerTest extends AgentTestRunner {
private static final ClassLoader BOOTSTRAP_CLASSLOADER = null private static final ClassLoader BOOTSTRAP_CLASSLOADER = null
private static final ClassLoader OT_LOADER
private static final boolean AGENT_INSTALLED_IN_CLINIT private static final boolean AGENT_INSTALLED_IN_CLINIT
@Shared
private Class sharedSpanClass
static { static {
ConfigUtils.updateConfig { ConfigUtils.updateConfig {
System.setProperty("dd." + TRACE_CLASSES_EXCLUDE, "config.exclude.packagename.*, config.exclude.SomeClass,config.exclude.SomeClass\$NestedClass") System.setProperty("dd." + TRACE_CLASSES_EXCLUDE, "config.exclude.packagename.*, config.exclude.SomeClass,config.exclude.SomeClass\$NestedClass")
} }
// when test class initializes, opentracing should be set up, but not the agent.
OT_LOADER = io.opentracing.Tracer.getClassLoader()
AGENT_INSTALLED_IN_CLINIT = getAgentTransformer() != null AGENT_INSTALLED_IN_CLINIT = getAgentTransformer() != null
} }
def setupSpec() {
sharedSpanClass = Span
}
def "spock runner bootstrap prefixes correct for test setup"() { def "spock runner bootstrap prefixes correct for test setup"() {
expect: expect:
SpockRunner.BOOTSTRAP_PACKAGE_PREFIXES_COPY == Constants.BOOTSTRAP_PACKAGE_PREFIXES SpockRunner.BOOTSTRAP_PACKAGE_PREFIXES_COPY == Constants.BOOTSTRAP_PACKAGE_PREFIXES
@ -58,13 +44,9 @@ class AgentTestRunnerTest extends AgentTestRunner {
} }
expect: expect:
// shared OT classes should cause no trouble
sharedSpanClass.getClassLoader() == BOOTSTRAP_CLASSLOADER
Tracer.getClassLoader() == BOOTSTRAP_CLASSLOADER
!AGENT_INSTALLED_IN_CLINIT !AGENT_INSTALLED_IN_CLINIT
getTestTracer() == GlobalTracerUtils.getUnderlyingGlobalTracer() getTestTracer() == datadog.trace.api.GlobalTracer.get()
getAgentTransformer() != null getAgentTransformer() != null
GlobalTracerUtils.getUnderlyingGlobalTracer() == datadog.trace.api.GlobalTracer.get()
bootstrapClassesIncorrectlyLoaded == [] bootstrapClassesIncorrectlyLoaded == []
} }

View File

@ -1,14 +1,15 @@
import datadog.opentracing.DDSpan import datadog.opentracing.DDSpan
import datadog.opentracing.DDTracer
import datadog.opentracing.scopemanager.DDScope
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.CorrelationIdentifier import datadog.trace.api.CorrelationIdentifier
import io.opentracing.Scope import datadog.trace.api.GlobalTracer
import io.opentracing.util.GlobalTracer
class TraceCorrelationTest extends AgentTestRunner { class TraceCorrelationTest extends AgentTestRunner {
def "access trace correlation only under trace"() { def "access trace correlation only under trace"() {
when: when:
Scope scope = GlobalTracer.get().buildSpan("myspan").startActive(true) DDScope scope = ((DDTracer) GlobalTracer.get()).buildSpan("myspan").startActive(true)
DDSpan span = (DDSpan) scope.span() DDSpan span = (DDSpan) scope.span()
then: then:

View File

@ -16,7 +16,6 @@ dependencies {
compile deps.bytebuddy compile deps.bytebuddy
compile deps.bytebuddyagent compile deps.bytebuddyagent
compile deps.slf4j compile deps.slf4j
compile deps.opentracing
compile deps.spock compile deps.spock
compile deps.testLogging compile deps.testLogging
compile deps.guava compile deps.guava

View File

@ -50,7 +50,6 @@ dependencies {
play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion" play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion"
play project(':dd-trace-api') play project(':dd-trace-api')
play deps.opentracing
testCompile project(':dd-smoke-tests') testCompile project(':dd-smoke-tests')
} }

View File

@ -9,6 +9,7 @@ excludedClassesCoverage += [
'datadog.trace.api.GlobalTracer*', 'datadog.trace.api.GlobalTracer*',
'datadog.trace.api.CorrelationIdentifier', 'datadog.trace.api.CorrelationIdentifier',
'datadog.trace.api.DDTags', 'datadog.trace.api.DDTags',
'datadog.trace.api.LogFields',
'datadog.trace.api.Config' 'datadog.trace.api.Config'
] ]

View File

@ -40,7 +40,6 @@ public class Config {
public static final String TRACE_ENABLED = "trace.enabled"; public static final String TRACE_ENABLED = "trace.enabled";
public static final String INTEGRATIONS_ENABLED = "integrations.enabled"; public static final String INTEGRATIONS_ENABLED = "integrations.enabled";
public static final String WRITER_TYPE = "writer.type"; public static final String WRITER_TYPE = "writer.type";
public static final String TRACE_RESOLVER_ENABLED = "trace.resolver.enabled";
public static final String TRACE_ANNOTATIONS = "trace.annotations"; public static final String TRACE_ANNOTATIONS = "trace.annotations";
public static final String TRACE_EXECUTORS_ALL = "trace.executors.all"; public static final String TRACE_EXECUTORS_ALL = "trace.executors.all";
public static final String TRACE_EXECUTORS = "trace.executors"; public static final String TRACE_EXECUTORS = "trace.executors";
@ -65,7 +64,6 @@ public class Config {
private static final boolean DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION = true; private static final boolean DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION = true;
private static final boolean DEFAULT_TRACE_RESOLVER_ENABLED = true;
private static final Set<Integer> DEFAULT_HTTP_SERVER_ERROR_STATUSES = private static final Set<Integer> DEFAULT_HTTP_SERVER_ERROR_STATUSES =
parseIntegerRangeSet("500-599", "default"); parseIntegerRangeSet("500-599", "default");
private static final Set<Integer> DEFAULT_HTTP_CLIENT_ERROR_STATUSES = private static final Set<Integer> DEFAULT_HTTP_CLIENT_ERROR_STATUSES =
@ -88,7 +86,6 @@ public class Config {
@Getter private final boolean traceEnabled; @Getter private final boolean traceEnabled;
@Getter private final boolean integrationsEnabled; @Getter private final boolean integrationsEnabled;
@Getter private final String writerType; @Getter private final String writerType;
@Getter private final boolean traceResolverEnabled;
@Getter private final List<String> excludedClasses; @Getter private final List<String> excludedClasses;
@Getter private final Set<Integer> httpServerErrorStatuses; @Getter private final Set<Integer> httpServerErrorStatuses;
@Getter private final Set<Integer> httpClientErrorStatuses; @Getter private final Set<Integer> httpClientErrorStatuses;
@ -120,8 +117,6 @@ public class Config {
integrationsEnabled = integrationsEnabled =
getBooleanSettingFromEnvironment(INTEGRATIONS_ENABLED, DEFAULT_INTEGRATIONS_ENABLED); getBooleanSettingFromEnvironment(INTEGRATIONS_ENABLED, DEFAULT_INTEGRATIONS_ENABLED);
writerType = getSettingFromEnvironment(WRITER_TYPE, DEFAULT_WRITER_TYPE); writerType = getSettingFromEnvironment(WRITER_TYPE, DEFAULT_WRITER_TYPE);
traceResolverEnabled =
getBooleanSettingFromEnvironment(TRACE_RESOLVER_ENABLED, DEFAULT_TRACE_RESOLVER_ENABLED);
excludedClasses = getListSettingFromEnvironment(TRACE_CLASSES_EXCLUDE, null); excludedClasses = getListSettingFromEnvironment(TRACE_CLASSES_EXCLUDE, null);
@ -178,8 +173,6 @@ public class Config {
integrationsEnabled = integrationsEnabled =
getPropertyBooleanValue(properties, INTEGRATIONS_ENABLED, parent.integrationsEnabled); getPropertyBooleanValue(properties, INTEGRATIONS_ENABLED, parent.integrationsEnabled);
writerType = properties.getProperty(WRITER_TYPE, parent.writerType); writerType = properties.getProperty(WRITER_TYPE, parent.writerType);
traceResolverEnabled =
getPropertyBooleanValue(properties, TRACE_RESOLVER_ENABLED, parent.traceResolverEnabled);
excludedClasses = excludedClasses =
getPropertyListValue(properties, TRACE_CLASSES_EXCLUDE, parent.excludedClasses); getPropertyListValue(properties, TRACE_CLASSES_EXCLUDE, parent.excludedClasses);

View File

@ -0,0 +1,9 @@
package datadog.trace.api;
// standard log field names from OpenTracing (see io.opentracing.log.Fields)
public class LogFields {
public static final String ERROR_OBJECT = "error.object";
public static final String MESSAGE = "message";
}

View File

@ -14,7 +14,6 @@ import static datadog.trace.api.Config.PARTIAL_FLUSH_MIN_SPANS
import static datadog.trace.api.Config.PREFIX import static datadog.trace.api.Config.PREFIX
import static datadog.trace.api.Config.RUNTIME_CONTEXT_FIELD_INJECTION import static datadog.trace.api.Config.RUNTIME_CONTEXT_FIELD_INJECTION
import static datadog.trace.api.Config.TRACE_ENABLED import static datadog.trace.api.Config.TRACE_ENABLED
import static datadog.trace.api.Config.TRACE_RESOLVER_ENABLED
import static datadog.trace.api.Config.WRITER_TYPE import static datadog.trace.api.Config.WRITER_TYPE
class ConfigTest extends DDSpecification { class ConfigTest extends DDSpecification {
@ -33,7 +32,6 @@ class ConfigTest extends DDSpecification {
then: then:
config.traceEnabled == true config.traceEnabled == true
config.writerType == "LoggingWriter" config.writerType == "LoggingWriter"
config.traceResolverEnabled == true
config.httpServerErrorStatuses == (500..599).toSet() config.httpServerErrorStatuses == (500..599).toSet()
config.httpClientErrorStatuses == (400..599).toSet() config.httpClientErrorStatuses == (400..599).toSet()
config.httpClientSplitByDomain == false config.httpClientSplitByDomain == false
@ -55,7 +53,6 @@ class ConfigTest extends DDSpecification {
def prop = new Properties() def prop = new Properties()
prop.setProperty(TRACE_ENABLED, "false") prop.setProperty(TRACE_ENABLED, "false")
prop.setProperty(WRITER_TYPE, "LoggingWriter") prop.setProperty(WRITER_TYPE, "LoggingWriter")
prop.setProperty(TRACE_RESOLVER_ENABLED, "false")
prop.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") prop.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122")
prop.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111") prop.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111")
prop.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") prop.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
@ -69,7 +66,6 @@ class ConfigTest extends DDSpecification {
then: then:
config.traceEnabled == false config.traceEnabled == false
config.writerType == "LoggingWriter" config.writerType == "LoggingWriter"
config.traceResolverEnabled == false
config.httpServerErrorStatuses == (122..457).toSet() config.httpServerErrorStatuses == (122..457).toSet()
config.httpClientErrorStatuses == (111..111).toSet() config.httpClientErrorStatuses == (111..111).toSet()
config.httpClientSplitByDomain == true config.httpClientSplitByDomain == true
@ -82,7 +78,6 @@ class ConfigTest extends DDSpecification {
setup: setup:
System.setProperty(PREFIX + TRACE_ENABLED, "false") System.setProperty(PREFIX + TRACE_ENABLED, "false")
System.setProperty(PREFIX + WRITER_TYPE, "LoggingWriter") System.setProperty(PREFIX + WRITER_TYPE, "LoggingWriter")
System.setProperty(PREFIX + TRACE_RESOLVER_ENABLED, "false")
System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122")
System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "111") System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "111")
System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
@ -96,7 +91,6 @@ class ConfigTest extends DDSpecification {
then: then:
config.traceEnabled == false config.traceEnabled == false
config.writerType == "LoggingWriter" config.writerType == "LoggingWriter"
config.traceResolverEnabled == false
config.httpServerErrorStatuses == (122..457).toSet() config.httpServerErrorStatuses == (122..457).toSet()
config.httpClientErrorStatuses == (111..111).toSet() config.httpClientErrorStatuses == (111..111).toSet()
config.httpClientSplitByDomain == true config.httpClientSplitByDomain == true
@ -135,7 +129,6 @@ class ConfigTest extends DDSpecification {
setup: setup:
System.setProperty(PREFIX + TRACE_ENABLED, " ") System.setProperty(PREFIX + TRACE_ENABLED, " ")
System.setProperty(PREFIX + WRITER_TYPE, " ") System.setProperty(PREFIX + WRITER_TYPE, " ")
System.setProperty(PREFIX + TRACE_RESOLVER_ENABLED, " ")
System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "1111") System.setProperty(PREFIX + HTTP_SERVER_ERROR_STATUSES, "1111")
System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "1:1") System.setProperty(PREFIX + HTTP_CLIENT_ERROR_STATUSES, "1:1")
System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "invalid") System.setProperty(PREFIX + HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "invalid")
@ -147,7 +140,6 @@ class ConfigTest extends DDSpecification {
then: then:
config.traceEnabled == true config.traceEnabled == true
config.writerType == " " config.writerType == " "
config.traceResolverEnabled == true
config.httpServerErrorStatuses == (500..599).toSet() config.httpServerErrorStatuses == (500..599).toSet()
config.httpClientErrorStatuses == (400..599).toSet() config.httpClientErrorStatuses == (400..599).toSet()
config.httpClientSplitByDomain == false config.httpClientSplitByDomain == false
@ -159,7 +151,6 @@ class ConfigTest extends DDSpecification {
Properties properties = new Properties() Properties properties = new Properties()
properties.setProperty(TRACE_ENABLED, "false") properties.setProperty(TRACE_ENABLED, "false")
properties.setProperty(WRITER_TYPE, "LoggingWriter") properties.setProperty(WRITER_TYPE, "LoggingWriter")
properties.setProperty(TRACE_RESOLVER_ENABLED, "false")
properties.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122") properties.setProperty(HTTP_SERVER_ERROR_STATUSES, "123-456,457,124-125,122")
properties.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111") properties.setProperty(HTTP_CLIENT_ERROR_STATUSES, "111")
properties.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true") properties.setProperty(HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN, "true")
@ -172,7 +163,6 @@ class ConfigTest extends DDSpecification {
then: then:
config.traceEnabled == false config.traceEnabled == false
config.writerType == "LoggingWriter" config.writerType == "LoggingWriter"
config.traceResolverEnabled == false
config.httpServerErrorStatuses == (122..457).toSet() config.httpServerErrorStatuses == (122..457).toSet()
config.httpClientErrorStatuses == (111..111).toSet() config.httpClientErrorStatuses == (111..111).toSet()
config.httpClientSplitByDomain == true config.httpClientSplitByDomain == true

View File

@ -10,24 +10,18 @@ apply from: "${rootDir}/gradle/publish.gradle"
minimumBranchCoverage = 0.5 minimumBranchCoverage = 0.5
minimumInstructionCoverage = 0.5 minimumInstructionCoverage = 0.5
excludedClassesCoverage += [ excludedClassesCoverage += [
'datadog.opentracing.NoopSpan',
'datadog.trace.common.writer.ListWriter', 'datadog.trace.common.writer.ListWriter',
'datadog.trace.common.writer.LoggingWriter' 'datadog.trace.common.writer.LoggingWriter'
] ]
apply plugin: 'org.unbroken-dome.test-sets' apply plugin: 'org.unbroken-dome.test-sets'
testSets {
ot31CompatabilityTest
ot33CompatabilityTest
}
dependencies { dependencies {
annotationProcessor deps.autoservice annotationProcessor deps.autoservice
implementation deps.autoservice implementation deps.autoservice
compile project(':dd-trace-api') compile project(':dd-trace-api')
compile deps.opentracing
compile group: 'io.opentracing.contrib', name: 'opentracing-tracerresolver', version: '0.1.0'
compile deps.slf4j compile deps.slf4j
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.11.0' // Last version to support Java7 compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.11.0' // Last version to support Java7
@ -41,34 +35,8 @@ dependencies {
testCompile project(":dd-java-agent:testing") testCompile project(":dd-java-agent:testing")
testCompile project(':utils:gc-utils') testCompile project(':utils:gc-utils')
testCompile group: 'com.github.stefanbirkner', name: 'system-rules', version: '1.17.1' testCompile group: 'com.github.stefanbirkner', name: 'system-rules', version: '1.17.1'
ot31CompatabilityTestCompile group: 'io.opentracing', name: 'opentracing-api', version: '0.31.0'
ot31CompatabilityTestCompile group: 'io.opentracing', name: 'opentracing-util', version: '0.31.0'
ot31CompatabilityTestCompile group: 'io.opentracing', name: 'opentracing-noop', version: '0.31.0'
ot33CompatabilityTestCompile group: 'io.opentracing', name: 'opentracing-api', version: '0.33.0'
ot33CompatabilityTestCompile group: 'io.opentracing', name: 'opentracing-util', version: '0.33.0'
ot33CompatabilityTestCompile group: 'io.opentracing', name: 'opentracing-noop', version: '0.33.0'
} }
[configurations.ot31CompatabilityTestCompile, configurations.ot31CompatabilityTestRuntime].each {
it.resolutionStrategy {
force group: 'io.opentracing', name: 'opentracing-api', version: '0.31.0'
force group: 'io.opentracing', name: 'opentracing-util', version: '0.31.0'
force group: 'io.opentracing', name: 'opentracing-noop', version: '0.31.0'
}
}
[configurations.ot33CompatabilityTestCompile, configurations.ot33CompatabilityTestRuntime].each {
it.resolutionStrategy {
force group: 'io.opentracing', name: 'opentracing-api', version: '0.33.0'
force group: 'io.opentracing', name: 'opentracing-util', version: '0.33.0'
force group: 'io.opentracing', name: 'opentracing-noop', version: '0.33.0'
}
}
test.finalizedBy ot31CompatabilityTest
test.finalizedBy ot33CompatabilityTest
jmh { jmh {
// include = [".*URLAsResourceNameBenchmark"] // include = [".*URLAsResourceNameBenchmark"]
// include = ['some regular expression'] // include pattern (regular expression) for benchmarks to be executed // include = ['some regular expression'] // include pattern (regular expression) for benchmarks to be executed

View File

@ -1,9 +1,9 @@
package datadog.trace; package datadog.trace;
import datadog.opentracing.DDTracer; import datadog.opentracing.DDTracer;
import datadog.opentracing.Span;
import datadog.opentracing.scopemanager.DDScope;
import datadog.trace.common.writer.ListWriter; import datadog.trace.common.writer.ListWriter;
import io.opentracing.Span;
import io.opentracing.Tracer;
import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.State;
@ -13,9 +13,8 @@ public class DDTraceBenchmark {
@State(org.openjdk.jmh.annotations.Scope.Thread) @State(org.openjdk.jmh.annotations.Scope.Thread)
public static class TraceState { public static class TraceState {
public ListWriter traceCollector = new ListWriter(); public ListWriter traceCollector = new ListWriter();
public Tracer tracer = new DDTracer(traceCollector); public DDTracer tracer = new DDTracer(traceCollector);
// TODO: this will need to be fixed if we want backwards compatibility for older versions... public DDScope scope = tracer.buildSpan(SPAN_NAME).startActive(true);
public io.opentracing.Scope scope = tracer.buildSpan(SPAN_NAME).startActive(true);
} }
@Benchmark @Benchmark
@ -42,7 +41,7 @@ public class DDTraceBenchmark {
@Benchmark @Benchmark
public Object testFullActiveSpan(final TraceState state) { public Object testFullActiveSpan(final TraceState state) {
final io.opentracing.Scope scope = state.tracer.buildSpan(SPAN_NAME).startActive(true); final DDScope scope = state.tracer.buildSpan(SPAN_NAME).startActive(true);
scope.close(); scope.close();
return scope; return scope;
} }

View File

@ -1,11 +1,7 @@
package datadog.opentracing; package datadog.opentracing;
import static io.opentracing.log.Fields.ERROR_OBJECT;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import datadog.trace.common.util.Clock; import datadog.trace.common.util.Clock;
import io.opentracing.Span;
import io.opentracing.tag.Tag;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.io.StringWriter; import java.io.StringWriter;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -95,7 +91,6 @@ public class DDSpan implements Span {
} }
} }
@Override
public final void finish(final long stoptimeMicros) { public final void finish(final long stoptimeMicros) {
finishAndAddToTrace(TimeUnit.MICROSECONDS.toNanos(stoptimeMicros - startTimeMicro)); finishAndAddToTrace(TimeUnit.MICROSECONDS.toNanos(stoptimeMicros - startTimeMicro));
} }
@ -136,132 +131,37 @@ public class DDSpan implements Span {
setTag(DDTags.ERROR_STACK, errorString.toString()); setTag(DDTags.ERROR_STACK, errorString.toString());
} }
private boolean extractError(final Map<String, ?> map) {
if (map.get(ERROR_OBJECT) instanceof Throwable) {
final Throwable error = (Throwable) map.get(ERROR_OBJECT);
setErrorMeta(error);
return true;
}
return false;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#setTag(java.lang.String, java.lang.String)
*/
@Override @Override
public final DDSpan setTag(final String tag, final String value) { public final DDSpan setTag(final String tag, final String value) {
context().setTag(tag, (Object) value); context().setTag(tag, value);
return this; return this;
} }
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#setTag(java.lang.String, boolean)
*/
@Override @Override
public final DDSpan setTag(final String tag, final boolean value) { public final DDSpan setTag(final String tag, final boolean value) {
context().setTag(tag, (Object) value); context().setTag(tag, value);
return this; return this;
} }
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#setTag(java.lang.String, java.lang.Number)
*/
@Override @Override
public final DDSpan setTag(final String tag, final Number value) { public final DDSpan setTag(final String tag, final Number value) {
context().setTag(tag, (Object) value); context().setTag(tag, value);
return this; return this;
} }
@Override
public <T> Span setTag(final Tag<T> tag, final T value) {
context().setTag(tag.getKey(), value);
return this;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#context()
*/
@Override @Override
public final DDSpanContext context() { public final DDSpanContext context() {
return context; return context;
} }
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#getBaggageItem(java.lang.String)
*/
@Override
public final String getBaggageItem(final String key) {
return null;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#setBaggageItem(java.lang.String, java.lang.String)
*/
@Override
public final DDSpan setBaggageItem(final String key, final String value) {
return this;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#setOperationName(java.lang.String)
*/
@Override @Override
public final DDSpan setOperationName(final String operationName) { public final DDSpan setOperationName(final String operationName) {
context().setOperationName(operationName); context().setOperationName(operationName);
return this; return this;
} }
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#log(java.util.Map)
*/
@Override
public final DDSpan log(final Map<String, ?> map) {
if (!extractError(map)) {
log.debug("`log` method is not implemented. Doing nothing");
}
return this;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#log(long, java.util.Map)
*/
@Override
public final DDSpan log(final long l, final Map<String, ?> map) {
if (!extractError(map)) {
log.debug("`log` method is not implemented. Doing nothing");
}
return this;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#log(java.lang.String)
*/
@Override
public final DDSpan log(final String s) {
log.debug("`log` method is not implemented. Provided log: {}", s);
return this;
}
/* (non-Javadoc)
* @see io.opentracing.BaseSpan#log(long, java.lang.String)
*/
@Override
public final DDSpan log(final long l, final String s) {
log.debug("`log` method is not implemented. Provided log: {}", s);
return this;
}
// Getters // Getters
/**
* Span metrics.
*
* @return metrics for this span
*/
public Map<String, Number> getMetrics() {
return context.getMetrics();
}
public long getStartTime() { public long getStartTime() {
return startTimeNano > 0 ? startTimeNano : TimeUnit.MICROSECONDS.toNanos(startTimeMicro); return startTimeNano > 0 ? startTimeNano : TimeUnit.MICROSECONDS.toNanos(startTimeMicro);
} }

View File

@ -16,7 +16,7 @@ import lombok.extern.slf4j.Slf4j;
* associated Span instance * associated Span instance
*/ */
@Slf4j @Slf4j
public class DDSpanContext implements io.opentracing.SpanContext { public class DDSpanContext implements SpanContext {
private static final Map<String, Number> EMPTY_METRICS = Collections.emptyMap(); private static final Map<String, Number> EMPTY_METRICS = Collections.emptyMap();
@ -76,11 +76,6 @@ public class DDSpanContext implements io.opentracing.SpanContext {
return traceId; return traceId;
} }
@Override
public String toTraceId() {
return traceId.toString();
}
public BigInteger getParentId() { public BigInteger getParentId() {
return parentId; return parentId;
} }
@ -89,11 +84,6 @@ public class DDSpanContext implements io.opentracing.SpanContext {
return spanId; return spanId;
} }
@Override
public String toSpanId() {
return spanId.toString();
}
public String getOperationName() { public String getOperationName() {
return operationName; return operationName;
} }
@ -110,22 +100,10 @@ public class DDSpanContext implements io.opentracing.SpanContext {
this.errorFlag = errorFlag; this.errorFlag = errorFlag;
} }
/* (non-Javadoc)
* @see io.opentracing.SpanContext#baggageItems()
*/
@Override
public Iterable<Map.Entry<String, String>> baggageItems() {
return Collections.emptyList();
}
public PendingTrace getTrace() { public PendingTrace getTrace() {
return trace; return trace;
} }
public DDTracer getTracer() {
return tracer;
}
public Map<String, Number> getMetrics() { public Map<String, Number> getMetrics() {
final Map<String, Number> metrics = this.metrics.get(); final Map<String, Number> metrics = this.metrics.get();
return metrics == null ? EMPTY_METRICS : metrics; return metrics == null ? EMPTY_METRICS : metrics;

View File

@ -2,20 +2,13 @@ package datadog.opentracing;
import datadog.opentracing.propagation.ExtractedContext; import datadog.opentracing.propagation.ExtractedContext;
import datadog.opentracing.propagation.HttpCodec; import datadog.opentracing.propagation.HttpCodec;
import datadog.opentracing.propagation.TextMapExtract;
import datadog.opentracing.propagation.TextMapInject;
import datadog.opentracing.scopemanager.ContextualScopeManager; import datadog.opentracing.scopemanager.ContextualScopeManager;
import datadog.opentracing.scopemanager.ScopeContext; import datadog.opentracing.scopemanager.DDScope;
import datadog.trace.api.Config; import datadog.trace.api.Config;
import datadog.trace.common.writer.Writer; import datadog.trace.common.writer.Writer;
import datadog.trace.context.ScopeListener; import datadog.trace.context.ScopeListener;
import io.opentracing.References;
import io.opentracing.Scope;
import io.opentracing.ScopeManager;
import io.opentracing.Span;
import io.opentracing.SpanContext;
import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMapExtract;
import io.opentracing.propagation.TextMapInject;
import io.opentracing.tag.Tag;
import java.io.Closeable; import java.io.Closeable;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.math.BigInteger; import java.math.BigInteger;
@ -23,14 +16,13 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** DDTracer makes it easy to send traces and span to DD using the OpenTracing API. */ /** DDTracer makes it easy to send traces and span to DD using the OpenTracing API. */
@Slf4j @Slf4j
public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace.api.Tracer { public class DDTracer implements Closeable, datadog.trace.api.Tracer {
// UINT64 max value // UINT64 max value
public static final BigInteger TRACE_ID_MAX = public static final BigInteger TRACE_ID_MAX =
BigInteger.valueOf(2).pow(64).subtract(BigInteger.ONE); BigInteger.valueOf(2).pow(64).subtract(BigInteger.ONE);
@ -58,10 +50,6 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
this(Config.get()); this(Config.get());
} }
public DDTracer(final Properties config) {
this(Config.get(config));
}
private DDTracer(final Config config) { private DDTracer(final Config config) {
this(Writer.Builder.forConfig(config), config.getPartialFlushMinSpans()); this(Writer.Builder.forConfig(config), config.getPartialFlushMinSpans());
log.debug("Using config: {}", config); log.debug("Using config: {}", config);
@ -109,48 +97,24 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
} }
} }
@Deprecated
public void addScopeContext(final ScopeContext context) {
scopeManager.addScopeContext(context);
}
@Override
public ContextualScopeManager scopeManager() { public ContextualScopeManager scopeManager() {
return scopeManager; return scopeManager;
} }
@Override
public Span activeSpan() { public Span activeSpan() {
return scopeManager.activeSpan(); return scopeManager.activeSpan();
} }
@Override
public Scope activateSpan(final Span span) {
return scopeManager.activate(span);
}
@Override
public DDSpanBuilder buildSpan(final String operationName) { public DDSpanBuilder buildSpan(final String operationName) {
return new DDSpanBuilder(operationName, scopeManager); return new DDSpanBuilder(operationName, scopeManager);
} }
@Override public void inject(final SpanContext spanContext, final TextMapInject carrier) {
public <T> void inject(final SpanContext spanContext, final Format<T> format, final T carrier) { injector.inject((DDSpanContext) spanContext, carrier);
if (carrier instanceof TextMapInject) {
injector.inject((DDSpanContext) spanContext, (TextMapInject) carrier);
} else {
log.debug("Unsupported format for propagation - {}", format.getClass().getName());
}
} }
@Override public SpanContext extract(final TextMapExtract carrier) {
public <T> SpanContext extract(final Format<T> format, final T carrier) { return extractor.extract(carrier);
if (carrier instanceof TextMapExtract) {
return extractor.extract((TextMapExtract) carrier);
} else {
log.debug("Unsupported format for propagation - {}", format.getClass().getName());
return null;
}
} }
/** @param trace a list of the spans related to the same trace */ /** @param trace a list of the spans related to the same trace */
@ -207,8 +171,8 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
} }
/** Spans are built using this builder */ /** Spans are built using this builder */
public class DDSpanBuilder implements SpanBuilder { public class DDSpanBuilder {
private final ScopeManager scopeManager; private final ContextualScopeManager scopeManager;
/** Each span must have an operationName according to the opentracing specification */ /** Each span must have an operationName according to the opentracing specification */
private final String operationName; private final String operationName;
@ -220,13 +184,12 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
private boolean errorFlag; private boolean errorFlag;
private boolean ignoreScope = false; private boolean ignoreScope = false;
public DDSpanBuilder(final String operationName, final ScopeManager scopeManager) { public DDSpanBuilder(final String operationName, final ContextualScopeManager scopeManager) {
this.operationName = operationName; this.operationName = operationName;
this.scopeManager = scopeManager; this.scopeManager = scopeManager;
} }
@Override public DDSpanBuilder ignoreActiveSpan() {
public SpanBuilder ignoreActiveSpan() {
ignoreScope = true; ignoreScope = true;
return this; return this;
} }
@ -235,48 +198,32 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
return new DDSpan(timestampMicro, buildSpanContext()); return new DDSpan(timestampMicro, buildSpanContext());
} }
@Override public DDScope startActive(final boolean finishSpanOnClose) {
public Scope startActive(final boolean finishSpanOnClose) {
final DDSpan span = startSpan(); final DDSpan span = startSpan();
final Scope scope = scopeManager.activate(span, finishSpanOnClose); final DDScope scope = scopeManager.activate(span, finishSpanOnClose);
log.debug("Starting a new active span: {}", span); log.debug("Starting a new active span: {}", span);
return scope; return scope;
} }
@Override
@Deprecated @Deprecated
public DDSpan startManual() { public DDSpan startManual() {
return start(); return start();
} }
@Override
public DDSpan start() { public DDSpan start() {
final DDSpan span = startSpan(); final DDSpan span = startSpan();
log.debug("Starting a new span: {}", span); log.debug("Starting a new span: {}", span);
return span; return span;
} }
@Override
public DDSpanBuilder withTag(final String tag, final Number number) { public DDSpanBuilder withTag(final String tag, final Number number) {
return withTag(tag, (Object) number); return withTag(tag, (Object) number);
} }
@Override
public DDSpanBuilder withTag(final String tag, final String string) { public DDSpanBuilder withTag(final String tag, final String string) {
return withTag(tag, (Object) string); return withTag(tag, (Object) string);
} }
@Override
public DDSpanBuilder withTag(final String tag, final boolean bool) {
return withTag(tag, (Object) bool);
}
@Override
public <T> SpanBuilder withTag(final Tag<T> tag, final T value) {
return withTag(tag.getKey(), value);
}
@Override
public DDSpanBuilder withStartTimestamp(final long timestampMicroseconds) { public DDSpanBuilder withStartTimestamp(final long timestampMicroseconds) {
timestampMicro = timestampMicroseconds; timestampMicro = timestampMicroseconds;
return this; return this;
@ -287,37 +234,15 @@ public class DDTracer implements io.opentracing.Tracer, Closeable, datadog.trace
return this; return this;
} }
@Override
public DDSpanBuilder asChildOf(final Span span) { public DDSpanBuilder asChildOf(final Span span) {
return asChildOf(span == null ? null : span.context()); return asChildOf(span == null ? null : span.context());
} }
@Override
public DDSpanBuilder asChildOf(final SpanContext spanContext) { public DDSpanBuilder asChildOf(final SpanContext spanContext) {
parent = spanContext; parent = spanContext;
return this; return this;
} }
@Override
public DDSpanBuilder addReference(final String referenceType, final SpanContext spanContext) {
if (spanContext == null) {
return this;
}
if (!(spanContext instanceof ExtractedContext) && !(spanContext instanceof DDSpanContext)) {
log.debug(
"Expected to have a DDSpanContext or ExtractedContext but got "
+ spanContext.getClass().getName());
return this;
}
if (References.CHILD_OF.equals(referenceType)
|| References.FOLLOWS_FROM.equals(referenceType)) {
return asChildOf(spanContext);
} else {
log.debug("Only support reference type of CHILD_OF and FOLLOWS_FROM");
}
return this;
}
// Private methods // Private methods
private DDSpanBuilder withTag(final String tag, final Object value) { private DDSpanBuilder withTag(final String tag, final Object value) {
if (value == null || (value instanceof String && ((String) value).isEmpty())) { if (value == null || (value instanceof String && ((String) value).isEmpty())) {

View File

@ -0,0 +1,37 @@
package datadog.opentracing;
public class NoopSpan implements Span {
public static final NoopSpan INSTANCE = new NoopSpan();
@Override
public SpanContext context() {
return NoopSpanContext.INSTANCE;
}
@Override
public void finish() {}
@Override
public NoopSpan setTag(final String key, final String value) {
return this;
}
@Override
public NoopSpan setTag(final String key, final boolean value) {
return this;
}
@Override
public NoopSpan setTag(final String key, final Number value) {
return this;
}
@Override
public NoopSpan setOperationName(final String operationName) {
return this;
}
static final class NoopSpanContext implements SpanContext {
static final NoopSpanContext INSTANCE = new NoopSpanContext();
}
}

View File

@ -0,0 +1,18 @@
package datadog.opentracing;
// temporary replacement for io.opentracing.Span
// this is currently needed as superclass for DDSpan and NoopSpan
public interface Span {
SpanContext context();
Span setTag(String key, String value);
Span setTag(String key, boolean value);
Span setTag(String key, Number value);
Span setOperationName(String operationName);
void finish();
}

View File

@ -0,0 +1,4 @@
package datadog.opentracing;
// temporary replacement for io.opentracing.SpanContext
public interface SpanContext {}

View File

@ -3,8 +3,6 @@ package datadog.opentracing.propagation;
import static datadog.opentracing.propagation.HttpCodec.validateUInt64BitsID; import static datadog.opentracing.propagation.HttpCodec.validateUInt64BitsID;
import datadog.opentracing.DDSpanContext; import datadog.opentracing.DDSpanContext;
import io.opentracing.propagation.TextMapExtract;
import io.opentracing.propagation.TextMapInject;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Map; import java.util.Map;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -1,9 +1,7 @@
package datadog.opentracing.propagation; package datadog.opentracing.propagation;
import io.opentracing.SpanContext; import datadog.opentracing.SpanContext;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Collections;
import java.util.Map;
/** /**
* Propagated data resulting from calling tracer.extract with header data from an incoming request. * Propagated data resulting from calling tracer.extract with header data from an incoming request.
@ -17,21 +15,6 @@ public class ExtractedContext implements SpanContext {
this.spanId = spanId; this.spanId = spanId;
} }
@Override
public String toTraceId() {
return "";
}
@Override
public String toSpanId() {
return "";
}
@Override
public Iterable<Map.Entry<String, String>> baggageItems() {
return Collections.emptyList();
}
public BigInteger getTraceId() { public BigInteger getTraceId() {
return traceId; return traceId;
} }

View File

@ -2,8 +2,6 @@ package datadog.opentracing.propagation;
import datadog.opentracing.DDSpanContext; import datadog.opentracing.DDSpanContext;
import datadog.opentracing.DDTracer; import datadog.opentracing.DDTracer;
import io.opentracing.propagation.TextMapExtract;
import io.opentracing.propagation.TextMapInject;
import java.math.BigInteger; import java.math.BigInteger;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

View File

@ -0,0 +1,10 @@
package datadog.opentracing.propagation;
import java.util.Iterator;
import java.util.Map;
// temporary replacement for io.opentracing.propagation.TextMapExtract
public interface TextMapExtract extends Iterable<Map.Entry<String, String>> {
@Override
Iterator<Map.Entry<String, String>> iterator();
}

View File

@ -0,0 +1,6 @@
package datadog.opentracing.propagation;
// temporary replacement for io.opentracing.propagation.TextMapInject
public interface TextMapInject {
void put(String key, String value);
}

View File

@ -1,30 +0,0 @@
package datadog.opentracing.resolver;
import com.google.auto.service.AutoService;
import com.google.common.annotations.VisibleForTesting;
import datadog.opentracing.DDTracer;
import datadog.trace.api.Config;
import io.opentracing.Tracer;
import io.opentracing.contrib.tracerresolver.TracerResolver;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@AutoService(TracerResolver.class)
public class DDTracerResolver extends TracerResolver {
@VisibleForTesting
Tracer resolve(final Config config) {
if (config.isTraceResolverEnabled()) {
log.info("Creating DDTracer with DDTracerResolver");
return new DDTracer();
} else {
log.info("DDTracerResolver disabled");
return null;
}
}
@Override
protected Tracer resolve() {
return resolve(Config.get());
}
}

View File

@ -1,65 +1,33 @@
package datadog.opentracing.scopemanager; package datadog.opentracing.scopemanager;
import datadog.opentracing.DDSpan; import datadog.opentracing.DDSpan;
import datadog.opentracing.Span;
import datadog.trace.context.ScopeListener; import datadog.trace.context.ScopeListener;
import io.opentracing.Scope;
import io.opentracing.ScopeManager;
import io.opentracing.Span;
import java.util.Deque;
import java.util.List; import java.util.List;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
public class ContextualScopeManager implements ScopeManager { public class ContextualScopeManager {
static final ThreadLocal<DDScope> tlsScope = new ThreadLocal<>(); static final ThreadLocal<DDScope> tlsScope = new ThreadLocal<>();
final Deque<ScopeContext> scopeContexts = new ConcurrentLinkedDeque<>();
final List<ScopeListener> scopeListeners = new CopyOnWriteArrayList<>(); final List<ScopeListener> scopeListeners = new CopyOnWriteArrayList<>();
@Override public DDScope activate(final Span span, final boolean finishOnClose) {
public Scope activate(final Span span, final boolean finishOnClose) {
for (final ScopeContext context : scopeContexts) {
if (context.inContext()) {
return context.activate(span, finishOnClose);
}
}
if (span instanceof DDSpan) { if (span instanceof DDSpan) {
return new ContinuableScope(this, (DDSpan) span, finishOnClose); return new ContinuableScope(this, (DDSpan) span, finishOnClose);
} else { } else {
// NoopSpan
return new SimpleScope(this, span, finishOnClose); return new SimpleScope(this, span, finishOnClose);
} }
} }
@Override public DDScope active() {
public Scope activate(final Span span) {
return activate(span, false);
}
@Override
public Scope active() {
for (final ScopeContext csm : scopeContexts) {
if (csm.inContext()) {
return csm.active();
}
}
return tlsScope.get(); return tlsScope.get();
} }
@Override
public Span activeSpan() { public Span activeSpan() {
for (final ScopeContext csm : scopeContexts) {
if (csm.inContext()) {
return csm.activeSpan();
}
}
final DDScope active = tlsScope.get(); final DDScope active = tlsScope.get();
return active == null ? null : active.span(); return active == null ? null : active.span();
} }
@Deprecated
public void addScopeContext(final ScopeContext context) {
scopeContexts.addFirst(context);
}
/** Attach a listener to scope activation events */ /** Attach a listener to scope activation events */
public void addScopeListener(final ScopeListener listener) { public void addScopeListener(final ScopeListener listener) {
scopeListeners.add(listener); scopeListeners.add(listener);

View File

@ -1,10 +1,12 @@
package datadog.opentracing.scopemanager; package datadog.opentracing.scopemanager;
import io.opentracing.Scope; import datadog.opentracing.Span;
import io.opentracing.Span; import java.io.Closeable;
public interface DDScope extends Closeable {
// Intentionally package private.
interface DDScope extends Scope {
@Override
Span span(); Span span();
@Override
void close();
} }

View File

@ -1,15 +0,0 @@
package datadog.opentracing.scopemanager;
import io.opentracing.ScopeManager;
/** Represents a ScopeManager that is only valid in certain cases such as on a specific thread. */
@Deprecated
public interface ScopeContext extends ScopeManager {
/**
* When multiple ScopeContexts are active, the first one to respond true will have control.
*
* @return true if this ScopeContext should be active
*/
boolean inContext();
}

View File

@ -1,7 +1,7 @@
package datadog.opentracing.scopemanager; package datadog.opentracing.scopemanager;
import datadog.opentracing.Span;
import datadog.trace.context.ScopeListener; import datadog.trace.context.ScopeListener;
import io.opentracing.Span;
/** Simple scope implementation which does not propagate across threads. */ /** Simple scope implementation which does not propagate across threads. */
public class SimpleScope implements DDScope { public class SimpleScope implements DDScope {

View File

@ -1,102 +0,0 @@
import datadog.opentracing.DDSpan
import datadog.opentracing.DDSpanContext
import datadog.opentracing.DDTracer
import datadog.opentracing.propagation.ExtractedContext
import datadog.trace.common.writer.ListWriter
import datadog.trace.util.test.DDSpecification
import io.opentracing.Tracer
import io.opentracing.propagation.Format
import io.opentracing.propagation.TextMap
import spock.lang.Subject
import static datadog.trace.agent.test.asserts.ListWriterAssert.assertTraces
import static datadog.trace.agent.test.utils.TraceUtils.basicSpan
// This test focuses on things that are different between OpenTracing API 0.31.0 and 0.32.0
class OT31ApiTest extends DDSpecification {
static final WRITER = new ListWriter()
@Subject
Tracer tracer = new DDTracer(WRITER)
def "test startActive"() {
when:
def scope = tracer.buildSpan("some name").startActive(finishSpan)
scope.close()
then:
(scope.span() as DDSpan).isFinished() == finishSpan
where:
finishSpan << [true, false]
}
def "test startManual"() {
when:
tracer.buildSpan("some name").startManual().finish()
then:
assertTraces(WRITER, 1) {
trace(0, 1) {
basicSpan(it, 0, "some name")
}
}
}
def "test scopemanager"() {
setup:
def span = tracer.buildSpan("some name").start()
when:
tracer.scopeManager().activate(span, finishSpan) != null
tracer.scopeManager().active().span() == span
then:
tracer.scopeManager().active().close()
(span as DDSpan).isFinished() == finishSpan
where:
finishSpan << [true, false]
}
def "test inject extract"() {
setup:
def context = tracer.buildSpan("some name").start().context() as DDSpanContext
def textMap = [:]
def adapter = new TextMapAdapter(textMap)
when:
tracer.inject(context, Format.Builtin.TEXT_MAP, adapter)
then:
textMap == [
"x-datadog-trace-id" : context.toTraceId(),
"x-datadog-parent-id": context.toSpanId(),
]
when:
def extract = tracer.extract(Format.Builtin.TEXT_MAP, adapter) as ExtractedContext
then:
extract.traceId == context.traceId
extract.spanId == context.spanId
}
static class TextMapAdapter implements TextMap {
private final Map<String, String> map
TextMapAdapter(Map<String, String> map) {
this.map = map
}
@Override
Iterator<Map.Entry<String, String>> iterator() {
return map.entrySet().iterator()
}
@Override
void put(String key, String value) {
map.put(key, value)
}
}
}

View File

@ -1,49 +0,0 @@
import datadog.opentracing.DDSpan
import datadog.opentracing.DDTracer
import datadog.trace.common.writer.ListWriter
import datadog.trace.util.test.DDSpecification
import io.opentracing.Tracer
import spock.lang.Subject
import static datadog.trace.agent.test.asserts.ListWriterAssert.assertTraces
import static datadog.trace.agent.test.utils.TraceUtils.basicSpan
// This test focuses on things that are different between OpenTracing API 0.32.0 and 0.33.0
class OT33ApiTest extends DDSpecification {
static final WRITER = new ListWriter()
@Subject
Tracer tracer = new DDTracer(WRITER)
def "test start"() {
when:
def span = tracer.buildSpan("some name").start()
def scope = tracer.activateSpan(span)
scope.close()
then:
(scope.span() as DDSpan).isFinished() == false
assertTraces(WRITER, 0) {}
when:
span.finish()
then:
assertTraces(WRITER, 1) {
trace(0, 1) {
basicSpan(it, 0, "some name")
}
}
}
def "test scopemanager"() {
setup:
def span = tracer.buildSpan("some name").start()
when:
tracer.scopeManager().activate(span) != null
then:
tracer.activeSpan() == span
}
}

View File

@ -1,11 +1,10 @@
package datadog.opentracing package datadog.opentracing
import datadog.opentracing.propagation.ExtractedContext import datadog.opentracing.propagation.ExtractedContext
import datadog.opentracing.scopemanager.DDScope
import datadog.trace.api.Config import datadog.trace.api.Config
import datadog.trace.common.writer.ListWriter import datadog.trace.common.writer.ListWriter
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.Scope
import io.opentracing.noop.NoopSpan
import static java.util.concurrent.TimeUnit.MILLISECONDS import static java.util.concurrent.TimeUnit.MILLISECONDS
@ -143,12 +142,12 @@ class DDSpanBuilderTest extends DDSpecification {
def "should link to parent span implicitly"() { def "should link to parent span implicitly"() {
setup: setup:
final Scope parent = noopParent ? final DDScope parent = noopParent ?
tracer.scopeManager().activate(NoopSpan.INSTANCE, false) : tracer.scopeManager().activate(NoopSpan.INSTANCE, false) :
tracer.buildSpan("parent") tracer.buildSpan("parent")
.startActive(false) .startActive(false)
final BigInteger expectedParentId = noopParent ? 0G : new BigInteger(parent.span().context().toSpanId()) final BigInteger expectedParentId = noopParent ? 0G : ((DDSpanContext) parent.span().context()).getSpanId()
final String expectedName = "fakeName" final String expectedName = "fakeName"
@ -187,46 +186,6 @@ class DDSpanBuilderTest extends DDSpecification {
span.getOperationName() == expectedName span.getOperationName() == expectedName
} }
def "should inherit the DD parent attributes addReference CHILD_OF"() {
setup:
def expectedName = "fakeName"
final DDSpan parent =
tracer
.buildSpan(expectedName)
.start()
DDSpan span =
tracer
.buildSpan(expectedName)
.addReference("child_of", parent.context())
.start()
expect:
span.getOperationName() == expectedName
}
def "should inherit the DD parent attributes add reference FOLLOWS_FROM"() {
setup:
def expectedName = "fakeName"
final DDSpan parent =
tracer
.buildSpan(expectedName)
.start()
DDSpan span =
tracer
.buildSpan(expectedName)
.addReference("follows_from", parent.context())
.start()
expect:
span.getOperationName() == expectedName
}
def "should track all spans in trace"() { def "should track all spans in trace"() {
setup: setup:
List<DDSpan> spans = [] List<DDSpan> spans = []

View File

@ -3,7 +3,6 @@ package datadog.opentracing
import datadog.opentracing.propagation.ExtractedContext import datadog.opentracing.propagation.ExtractedContext
import datadog.trace.common.writer.ListWriter import datadog.trace.common.writer.ListWriter
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.SpanContext
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit

View File

@ -1,8 +1,6 @@
package datadog.opentracing.propagation package datadog.opentracing.propagation
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.SpanContext
import io.opentracing.propagation.TextMapExtractAdapter
import static datadog.opentracing.DDTracer.TRACE_ID_MAX import static datadog.opentracing.DDTracer.TRACE_ID_MAX
import static datadog.opentracing.propagation.DatadogHttpCodec.SPAN_ID_KEY import static datadog.opentracing.propagation.DatadogHttpCodec.SPAN_ID_KEY
@ -46,7 +44,7 @@ class DatadogHttpExtractorTest extends DDSpecification {
] ]
when: when:
SpanContext context = extractor.extract(new TextMapExtractAdapter(headers)) ExtractedContext context = extractor.extract(new TextMapExtractAdapter(headers))
then: then:
context == null context == null
@ -61,7 +59,7 @@ class DatadogHttpExtractorTest extends DDSpecification {
] ]
when: when:
SpanContext context = extractor.extract(new TextMapExtractAdapter(headers)) ExtractedContext context = extractor.extract(new TextMapExtractAdapter(headers))
then: then:
context == null context == null
@ -75,7 +73,7 @@ class DatadogHttpExtractorTest extends DDSpecification {
] ]
when: when:
SpanContext context = extractor.extract(new TextMapExtractAdapter(headers)) ExtractedContext context = extractor.extract(new TextMapExtractAdapter(headers))
then: then:
context == null context == null

View File

@ -5,7 +5,6 @@ import datadog.opentracing.DDTracer
import datadog.opentracing.PendingTrace import datadog.opentracing.PendingTrace
import datadog.trace.common.writer.ListWriter import datadog.trace.common.writer.ListWriter
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.propagation.TextMapInjectAdapter
import static datadog.opentracing.DDTracer.TRACE_ID_MAX import static datadog.opentracing.DDTracer.TRACE_ID_MAX
import static datadog.opentracing.propagation.DatadogHttpCodec.SPAN_ID_KEY import static datadog.opentracing.propagation.DatadogHttpCodec.SPAN_ID_KEY

View File

@ -2,8 +2,6 @@ package datadog.opentracing.propagation
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.SpanContext
import io.opentracing.propagation.TextMapExtractAdapter
import spock.lang.Shared import spock.lang.Shared
import static datadog.opentracing.DDTracer.TRACE_ID_MAX import static datadog.opentracing.DDTracer.TRACE_ID_MAX
@ -26,7 +24,7 @@ class HttpExtractorTest extends DDSpecification {
} }
when: when:
final SpanContext context = extractor.extract(new TextMapExtractAdapter(actual)) final ExtractedContext context = extractor.extract(new TextMapExtractAdapter(actual))
then: then:
if (expectedTraceId == null) { if (expectedTraceId == null) {

View File

@ -5,7 +5,6 @@ import datadog.opentracing.DDTracer
import datadog.opentracing.PendingTrace import datadog.opentracing.PendingTrace
import datadog.trace.common.writer.ListWriter import datadog.trace.common.writer.ListWriter
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.propagation.TextMapInjectAdapter
class HttpInjectorTest extends DDSpecification { class HttpInjectorTest extends DDSpecification {

View File

@ -0,0 +1,18 @@
package datadog.opentracing.propagation;
import java.util.Iterator;
import java.util.Map;
// temporary replacement for io.opentracing.propagation.TextMapExtractAdapter
public class TextMapExtractAdapter implements TextMapExtract {
protected final Map<String, String> map;
public TextMapExtractAdapter(final Map<String, String> map) {
this.map = map;
}
@Override
public Iterator<Map.Entry<String, String>> iterator() {
return map.entrySet().iterator();
}
}

View File

@ -0,0 +1,17 @@
package datadog.opentracing.propagation;
import java.util.Map;
// temporary replacement for io.opentracing.propagation.TextMapInjectAdapter
public class TextMapInjectAdapter implements TextMapInject {
protected final Map<String, ? super String> map;
public TextMapInjectAdapter(final Map<String, ? super String> map) {
this.map = map;
}
@Override
public void put(final String key, final String value) {
map.put(key, value);
}
}

View File

@ -1,34 +0,0 @@
package datadog.opentracing.resolver
import datadog.opentracing.DDTracer
import datadog.trace.api.Config
import datadog.trace.util.test.DDSpecification
import io.opentracing.contrib.tracerresolver.TracerResolver
class DDTracerResolverTest extends DDSpecification {
def resolver = new DDTracerResolver()
def "test resolveTracer"() {
when:
def tracer = TracerResolver.resolveTracer()
then:
tracer instanceof DDTracer
}
def "test disable DDTracerResolver"() {
setup:
System.setProperty("dd.trace.resolver.enabled", "false")
when:
def tracer = resolver.resolve(new Config())
then:
tracer == null
cleanup:
System.clearProperty("dd.trace.resolver.enabled")
}
}

View File

@ -3,21 +3,17 @@ package datadog.opentracing.scopemanager
import datadog.opentracing.DDSpan import datadog.opentracing.DDSpan
import datadog.opentracing.DDSpanContext import datadog.opentracing.DDSpanContext
import datadog.opentracing.DDTracer import datadog.opentracing.DDTracer
import datadog.opentracing.NoopSpan
import datadog.trace.common.writer.ListWriter import datadog.trace.common.writer.ListWriter
import datadog.trace.context.ScopeListener import datadog.trace.context.ScopeListener
import datadog.trace.util.gc.GCUtils import datadog.trace.util.gc.GCUtils
import datadog.trace.util.test.DDSpecification import datadog.trace.util.test.DDSpecification
import io.opentracing.Scope
import io.opentracing.Span
import io.opentracing.noop.NoopSpan
import spock.lang.Subject import spock.lang.Subject
import spock.lang.Timeout import spock.lang.Timeout
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.concurrent.CountDownLatch import java.util.concurrent.CountDownLatch
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
import java.util.concurrent.atomic.AtomicReference
import static java.util.concurrent.TimeUnit.SECONDS import static java.util.concurrent.TimeUnit.SECONDS
@ -397,105 +393,6 @@ class ScopeManagerTest extends DDSpecification {
writer == [[childSpan, span]] writer == [[childSpan, span]]
} }
def "context takes control (#active)"() {
setup:
contexts.each {
scopeManager.addScopeContext(it)
}
def builder = tracer.buildSpan("test")
def scope = (AtomicReferenceScope) builder.startActive(true)
expect:
scopeManager.tlsScope.get() == null
scopeManager.active() == scope
contexts[active].get() == scope.get()
writer.empty
where:
active | contexts
0 | [new AtomicReferenceScope(true)]
1 | [new AtomicReferenceScope(true), new AtomicReferenceScope(true)]
3 | [new AtomicReferenceScope(false), new AtomicReferenceScope(true), new AtomicReferenceScope(false), new AtomicReferenceScope(true)]
}
def "disabled context is ignored (#contexts.size)"() {
setup:
contexts.each {
scopeManager.addScopeContext(it)
}
def builder = tracer.buildSpan("test")
def scope = builder.startActive(true)
expect:
contexts.findAll {
it.get() != null
} == []
scopeManager.tlsScope.get() == scope
scopeManager.active() == scope
writer.empty
where:
contexts | _
[] | _
[new AtomicReferenceScope(false)] | _
[new AtomicReferenceScope(false), new AtomicReferenceScope(false)] | _
[new AtomicReferenceScope(false), new AtomicReferenceScope(false), new AtomicReferenceScope(false)] | _
}
def "ContinuableScope put in threadLocal after continuation activation"() {
setup:
ContinuableScope scope = (ContinuableScope) tracer.buildSpan("parent").startActive(true)
scope.setAsyncPropagation(true)
expect:
scopeManager.tlsScope.get() == scope
when:
def cont = scope.capture()
scope.close()
then:
scopeManager.tlsScope.get() == null
when:
scopeManager.addScopeContext(new AtomicReferenceScope(true))
def newScope = cont.activate()
then:
newScope != scope
scopeManager.tlsScope.get() == newScope
}
def "context to threadlocal (#contexts.size)"() {
setup:
contexts.each {
scopeManager.addScopeContext(it)
}
def scope = tracer.buildSpan("parent").startActive(false)
def span = scope.span()
expect:
scope instanceof AtomicReferenceScope
scopeManager.tlsScope.get() == null
when:
scope.close()
contexts.each {
((AtomicBoolean) it.enabled).set(false)
}
scope = scopeManager.activate(span, true)
then:
scope instanceof ContinuableScope
scopeManager.tlsScope.get() == scope
where:
contexts | _
[new AtomicReferenceScope(true)] | _
[new AtomicReferenceScope(true), new AtomicReferenceScope(true)] | _
}
def "add scope listener"() { def "add scope listener"() {
setup: setup:
AtomicInteger activatedCount = new AtomicInteger(0) AtomicInteger activatedCount = new AtomicInteger(0)
@ -514,14 +411,14 @@ class ScopeManagerTest extends DDSpecification {
}) })
when: when:
Scope scope1 = scopeManager.activate(NoopSpan.INSTANCE, true) DDScope scope1 = scopeManager.activate(NoopSpan.INSTANCE, true)
then: then:
activatedCount.get() == 1 activatedCount.get() == 1
closedCount.get() == 0 closedCount.get() == 0
when: when:
Scope scope2 = scopeManager.activate(NoopSpan.INSTANCE, true) DDScope scope2 = scopeManager.activate(NoopSpan.INSTANCE, true)
then: then:
activatedCount.get() == 2 activatedCount.get() == 2
@ -542,14 +439,14 @@ class ScopeManagerTest extends DDSpecification {
closedCount.get() == 2 closedCount.get() == 2
when: when:
Scope continuableScope = tracer.buildSpan("foo").startActive(true) DDScope continuableScope = tracer.buildSpan("foo").startActive(true)
then: then:
continuableScope instanceof ContinuableScope continuableScope instanceof ContinuableScope
activatedCount.get() == 4 activatedCount.get() == 4
when: when:
Scope childContinuableScope = tracer.buildSpan("child").startActive(true) DDScope childContinuableScope = tracer.buildSpan("child").startActive(true)
then: then:
childContinuableScope instanceof ContinuableScope childContinuableScope instanceof ContinuableScope
@ -571,56 +468,7 @@ class ScopeManagerTest extends DDSpecification {
closedCount.get() == 4 closedCount.get() == 4
} }
boolean spanFinished(Span span) { boolean spanFinished(DDSpan span) {
return ((DDSpan) span)?.isFinished() return span?.isFinished()
}
class AtomicReferenceScope extends AtomicReference<Span> implements ScopeContext, Scope {
final AtomicBoolean enabled
AtomicReferenceScope(boolean enabled) {
this.enabled = new AtomicBoolean(enabled)
}
@Override
boolean inContext() {
return enabled.get()
}
@Override
void close() {
getAndSet(null).finish()
}
@Override
Span span() {
return get()
}
@Override
Scope activate(Span span, boolean finishSpanOnClose) {
set(span)
return this
}
@Override
Scope activate(Span span) {
set(span)
return this
}
@Override
Scope active() {
return get() == null ? null : this
}
@Override
Span activeSpan() {
return active()?.span()
}
String toString() {
return "Ref: " + super.toString()
}
} }
} }

View File

@ -3,37 +3,26 @@ def spockGroovyVer = groovyVer.replaceAll(/\.\d+$/, '')
ext { ext {
versions = [ versions = [
opentracing: '0.32.0', slf4j : "1.7.29",
guava : "20.0", // Last version to support Java 7
slf4j : "1.7.29", spock : "1.3-groovy-$spockGroovyVer",
guava : "20.0", // Last version to support Java 7 groovy : groovyVer,
logback : "1.2.3",
spock : "1.3-groovy-$spockGroovyVer", lombok : "1.18.10",
groovy : groovyVer, bytebuddy : "1.10.4",
logback : "1.2.3", scala : "2.11.12", // Last version to support Java 7 (2.12+ require Java 8+)
lombok : "1.18.10", kotlin : "1.3.50",
bytebuddy : "1.10.4", coroutines: "1.3.0"
scala : "2.11.12", // Last version to support Java 7 (2.12+ require Java 8+)
kotlin : "1.3.50",
coroutines : "1.3.0"
] ]
deps = [ deps = [
// OpenTracing
opentracingApi : dependencies.create(group: 'io.opentracing', name: 'opentracing-api', version: versions.opentracing),
opentracing : [
dependencies.create(group: 'io.opentracing', name: 'opentracing-api', version: versions.opentracing),
dependencies.create(group: 'io.opentracing', name: 'opentracing-noop', version: versions.opentracing),
dependencies.create(group: 'io.opentracing', name: 'opentracing-util', version: versions.opentracing),
],
opentracingMock: dependencies.create(group: 'io.opentracing', name: 'opentracing-mock', version: versions.opentracing),
// General // General
slf4j : "org.slf4j:slf4j-api:${versions.slf4j}", slf4j : "org.slf4j:slf4j-api:${versions.slf4j}",
guava : "com.google.guava:guava:$versions.guava", guava : "com.google.guava:guava:$versions.guava",
bytebuddy : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy', version: "${versions.bytebuddy}"), bytebuddy : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy', version: "${versions.bytebuddy}"),
bytebuddyagent : dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy-agent', version: "${versions.bytebuddy}"), bytebuddyagent: dependencies.create(group: 'net.bytebuddy', name: 'byte-buddy-agent', version: "${versions.bytebuddy}"),
autoservice : [ autoservice : [
dependencies.create(group: 'com.google.auto.service', name: 'auto-service', version: '1.0-rc3'), dependencies.create(group: 'com.google.auto.service', name: 'auto-service', version: '1.0-rc3'),
dependencies.create(group: 'com.google.auto', name: 'auto-common', version: '0.8'), dependencies.create(group: 'com.google.auto', name: 'auto-common', version: '0.8'),
// These are the last versions that support guava 20.0. Upgrading has odd interactions with shadow. // These are the last versions that support guava 20.0. Upgrading has odd interactions with shadow.
@ -42,23 +31,23 @@ ext {
// Testing // Testing
spock : [ spock : [
dependencies.create("org.spockframework:spock-core:${versions.spock}", { dependencies.create("org.spockframework:spock-core:${versions.spock}", {
exclude group: 'org.codehaus.groovy', module: 'groovy-all' exclude group: 'org.codehaus.groovy', module: 'groovy-all'
}), }),
// Used by Spock for mocking: // Used by Spock for mocking:
dependencies.create(group: 'org.objenesis', name: 'objenesis', version: '2.6') // Last version to support Java7 dependencies.create(group: 'org.objenesis', name: 'objenesis', version: '2.6') // Last version to support Java7
], ],
groovy : "org.codehaus.groovy:groovy-all:${versions.groovy}", groovy : "org.codehaus.groovy:groovy-all:${versions.groovy}",
testcontainers : "org.testcontainers:testcontainers:1.12.2", testcontainers: "org.testcontainers:testcontainers:1.12.2",
testLogging : [ testLogging : [
dependencies.create(group: 'ch.qos.logback', name: 'logback-classic', version: versions.logback), dependencies.create(group: 'ch.qos.logback', name: 'logback-classic', version: versions.logback),
dependencies.create(group: 'org.slf4j', name: 'log4j-over-slf4j', version: versions.slf4j), dependencies.create(group: 'org.slf4j', name: 'log4j-over-slf4j', version: versions.slf4j),
dependencies.create(group: 'org.slf4j', name: 'jcl-over-slf4j', version: versions.slf4j), dependencies.create(group: 'org.slf4j', name: 'jcl-over-slf4j', version: versions.slf4j),
dependencies.create(group: 'org.slf4j', name: 'jul-to-slf4j', version: versions.slf4j), dependencies.create(group: 'org.slf4j', name: 'jul-to-slf4j', version: versions.slf4j),
], ],
scala : dependencies.create(group: 'org.scala-lang', name: 'scala-library', version: "${versions.scala}"), scala : dependencies.create(group: 'org.scala-lang', name: 'scala-library', version: "${versions.scala}"),
kotlin : dependencies.create(group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "${versions.kotlin}"), kotlin : dependencies.create(group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: "${versions.kotlin}"),
coroutines : dependencies.create(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: "${versions.coroutines}"), coroutines : dependencies.create(group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: "${versions.coroutines}"),
] ]
} }