From f35e2e6ebe5b2b8db5e9c68c17ad16f2336dfb18 Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Thu, 3 May 2018 17:39:46 +1000 Subject: [PATCH 1/4] Remove various warnings and other cleanup Also upgrade some plugins. --- .../agent/test/IntegrationTestUtils.java | 36 ++++++---------- .../bootstrap/CallDepthThreadLocalMap.java | 6 +-- .../agent-tooling/agent-tooling.gradle | 3 +- .../trace/agent/tooling/Instrumenter.java | 2 +- .../apache-httpclient-4.3.gradle | 2 + .../instrumentation/aws-sdk/aws-sdk.gradle | 3 +- .../instrumentation/aws/SpanDecorator.java | 6 +-- .../classloaders/classloaders.gradle | 3 +- .../datastax-cassandra-3.2.gradle | 2 + .../src/main/scala/AkkaActors.scala | 8 ++-- .../java-concurrent/java-concurrent.gradle | 3 +- .../concurrent/ExecutorInstrumentation.java | 42 ++++++++++--------- .../jax-rs-annotations.gradle | 3 +- .../jax-rs-client/jax-rs-client.gradle | 3 +- .../jboss-classloading.gradle | 3 +- .../instrumentation/jdbc/jdbc.gradle | 3 +- .../jdbc/ConnectionInstrumentation.java | 2 +- .../jedis-1.4/jedis-1.4.gradle | 3 +- .../instrumentation/jetty-8/jetty-8.gradle | 3 +- .../instrumentation/jms-1/jms-1.gradle | 3 +- .../instrumentation/jms-2/jms-2.gradle | 3 +- .../kafka-clients-0.11.gradle | 2 + .../KafkaConsumerInstrumentation.java | 4 +- .../kafka_clients/TracingIterable.java | 5 ++- .../kafka-streams-0.11.gradle | 2 + .../mongo-3.1/mongo-3.1.gradle | 2 + .../mongo-async-3.3/mongo-async-3.3.gradle | 2 + .../instrumentation/okhttp-3/okhttp-3.gradle | 2 + .../osgi-classloading.gradle | 3 +- .../instrumentation/play-2.4/play-2.4.gradle | 3 +- .../ratpack-1.4/ratpack-1.4.gradle | 8 +++- .../servlet-2/servlet-2.gradle | 3 +- .../HttpServletRequestExtractAdapter.java | 8 ++-- .../servlet-3/servlet-3.gradle | 3 +- .../sparkjava-2.4/sparkjava-2.4.gradle | 3 +- .../spring-web/spring-web.gradle | 3 +- .../trace-annotation/trace-annotation.gradle | 3 +- .../trace/agent/test/AgentTestRunner.java | 2 + dd-java-agent/testing/testing.gradle | 4 ++ dd-trace-java.gradle | 6 +-- dd-trace-ot/dd-trace-ot.gradle | 3 +- .../decorators/OperationDecorator.java | 26 ++++++------ .../scopemanager/ContextualScopeManager.java | 2 +- .../scopemanager/ContinuableScope.java | 4 +- .../datadog/trace/common/DDTraceConfig.java | 8 ++-- .../java/datadog/trace/common/Service.java | 1 + .../datadog/trace/common/writer/DDApi.java | 4 +- .../trace/common/writer/ListWriter.java | 4 +- .../datadog/example/dropwizard/api/Book.java | 8 ++-- gradle/java.gradle | 1 + 50 files changed, 160 insertions(+), 111 deletions(-) diff --git a/dd-java-agent-ittests/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java b/dd-java-agent-ittests/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java index 628c2e8e95..8422f18365 100644 --- a/dd-java-agent-ittests/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java +++ b/dd-java-agent-ittests/src/test/java/datadog/trace/agent/test/IntegrationTestUtils.java @@ -39,7 +39,7 @@ public class IntegrationTestUtils { classloaderField = tracingAgentClass.getDeclaredField("AGENT_CLASSLOADER"); classloaderField.setAccessible(true); return (ClassLoader) classloaderField.get(null); - } catch (Exception e) { + } catch (final Exception e) { throw new IllegalStateException(e); } finally { if (null != classloaderField) { @@ -141,29 +141,19 @@ public class IntegrationTestUtils { return className.replace('.', '/') + ".class"; } - public static String[] getBootstrapPackagePrefixes() { - try { - Field f = - getAgentClassLoader() - .loadClass("datadog.trace.agent.tooling.Utils") - .getField("BOOTSTRAP_PACKAGE_PREFIXES"); - return (String[]) f.get(null); - } catch (Exception e) { - e.printStackTrace(); - } - return null; + public static String[] getBootstrapPackagePrefixes() throws Exception { + final Field f = + getAgentClassLoader() + .loadClass("datadog.trace.agent.tooling.Utils") + .getField("BOOTSTRAP_PACKAGE_PREFIXES"); + return (String[]) f.get(null); } - public static String[] getAgentPackagePrefixes() { - try { - Field f = - getAgentClassLoader() - .loadClass("datadog.trace.agent.tooling.Utils") - .getField("AGENT_PACKAGE_PREFIXES"); - return (String[]) f.get(null); - } catch (Exception e) { - e.printStackTrace(); - } - return null; + public static String[] getAgentPackagePrefixes() throws Exception { + final Field f = + getAgentClassLoader() + .loadClass("datadog.trace.agent.tooling.Utils") + .getField("AGENT_PACKAGE_PREFIXES"); + return (String[]) f.get(null); } } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java index 1c0660e9bf..58a363f180 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java @@ -14,7 +14,9 @@ public class CallDepthThreadLocalMap { private static final ThreadLocal> INSTANCES = new ThreadLocal<>(); - public static CallDepthThreadLocalMap get(Object o) { + private static final ThreadLocal tls = new ThreadLocal<>(); + + public static CallDepthThreadLocalMap get(final Object o) { if (INSTANCES.get() == null) { INSTANCES.set(new WeakHashMap()); } @@ -24,8 +26,6 @@ public class CallDepthThreadLocalMap { return INSTANCES.get().get(o); } - private final ThreadLocal tls = new ThreadLocal<>(); - private CallDepthThreadLocalMap() {} public int incrementCallDepth() { diff --git a/dd-java-agent/agent-tooling/agent-tooling.gradle b/dd-java-agent/agent-tooling/agent-tooling.gradle index 46820de561..ad294c408d 100644 --- a/dd-java-agent/agent-tooling/agent-tooling.gradle +++ b/dd-java-agent/agent-tooling/agent-tooling.gradle @@ -4,7 +4,8 @@ dependencies { compile project(':dd-java-agent:agent-bootstrap') compile deps.bytebuddy compile deps.bytebuddyagent - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice compileOnly project(':dd-trace-ot') diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java index 9c4b20f443..90308865a3 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/Instrumenter.java @@ -18,7 +18,7 @@ public interface Instrumenter { protected final boolean enabled; public Configurable(final String instrumentationName, final String... additionalNames) { - this.instrumentationNames = new HashSet(Arrays.asList(additionalNames)); + this.instrumentationNames = new HashSet<>(Arrays.asList(additionalNames)); instrumentationNames.add(instrumentationName); // If default is enabled, we want to enable individually, diff --git a/dd-java-agent/instrumentation/apache-httpclient-4.3/apache-httpclient-4.3.gradle b/dd-java-agent/instrumentation/apache-httpclient-4.3/apache-httpclient-4.3.gradle index 92b6a79825..b8deeab46c 100644 --- a/dd-java-agent/instrumentation/apache-httpclient-4.3/apache-httpclient-4.3.gradle +++ b/dd-java-agent/instrumentation/apache-httpclient-4.3/apache-httpclient-4.3.gradle @@ -31,4 +31,6 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice } diff --git a/dd-java-agent/instrumentation/aws-sdk/aws-sdk.gradle b/dd-java-agent/instrumentation/aws-sdk/aws-sdk.gradle index 7b513c512f..68c8a5973a 100644 --- a/dd-java-agent/instrumentation/aws-sdk/aws-sdk.gradle +++ b/dd-java-agent/instrumentation/aws-sdk/aws-sdk.gradle @@ -33,7 +33,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') // Include httpclient instrumentation for testing because it is a dependency for aws-sdk. diff --git a/dd-java-agent/instrumentation/aws-sdk/src/main/java/datadog/trace/instrumentation/aws/SpanDecorator.java b/dd-java-agent/instrumentation/aws-sdk/src/main/java/datadog/trace/instrumentation/aws/SpanDecorator.java index 0a2ff90100..89c6a6fdb9 100644 --- a/dd-java-agent/instrumentation/aws-sdk/src/main/java/datadog/trace/instrumentation/aws/SpanDecorator.java +++ b/dd-java-agent/instrumentation/aws-sdk/src/main/java/datadog/trace/instrumentation/aws/SpanDecorator.java @@ -33,7 +33,7 @@ class SpanDecorator { private static final Map SERVICE_NAMES = new ConcurrentHashMap<>(); private static final Map OPERATION_NAMES = new ConcurrentHashMap<>(); - static void onRequest(final Request request, final Span span) { + static void onRequest(final Request request, final Span span) { Tags.COMPONENT.set(span, COMPONENT_NAME); Tags.HTTP_METHOD.set(span, request.getHttpMethod().name()); Tags.HTTP_URL.set(span, request.getEndpoint().toString()); @@ -52,9 +52,9 @@ class SpanDecorator { try { final StringBuilder params = new StringBuilder("{"); - final Map> requestParams = request.getParameters(); + final Map> requestParams = request.getParameters(); boolean firstKey = true; - for (final Entry> entry : requestParams.entrySet()) { + for (final Entry> entry : requestParams.entrySet()) { if (!firstKey) { params.append(","); } diff --git a/dd-java-agent/instrumentation/classloaders/classloaders.gradle b/dd-java-agent/instrumentation/classloaders/classloaders.gradle index 15326191b5..24e24ba3f3 100644 --- a/dd-java-agent/instrumentation/classloaders/classloaders.gradle +++ b/dd-java-agent/instrumentation/classloaders/classloaders.gradle @@ -6,7 +6,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') } diff --git a/dd-java-agent/instrumentation/datastax-cassandra-3.2/datastax-cassandra-3.2.gradle b/dd-java-agent/instrumentation/datastax-cassandra-3.2/datastax-cassandra-3.2.gradle index 269f7f7bce..02f6d99d56 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra-3.2/datastax-cassandra-3.2.gradle +++ b/dd-java-agent/instrumentation/datastax-cassandra-3.2/datastax-cassandra-3.2.gradle @@ -33,6 +33,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0' diff --git a/dd-java-agent/instrumentation/java-concurrent/akka-testing/src/main/scala/AkkaActors.scala b/dd-java-agent/instrumentation/java-concurrent/akka-testing/src/main/scala/AkkaActors.scala index a4d53267ef..f2dc79d46c 100644 --- a/dd-java-agent/instrumentation/java-concurrent/akka-testing/src/main/scala/AkkaActors.scala +++ b/dd-java-agent/instrumentation/java-concurrent/akka-testing/src/main/scala/AkkaActors.scala @@ -1,12 +1,11 @@ +import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, Props} +import akka.pattern.ask +import akka.util.Timeout import datadog.trace.api.Trace import datadog.trace.context.TraceScope -import akka.pattern.ask import io.opentracing.util.GlobalTracer import scala.concurrent.duration._ -import akka.actor.{Actor, ActorLogging, ActorRef, ActorSystem, Props} -import akka.routing.Broadcast -import akka.util.Timeout // ! == send-message object AkkaActors { @@ -84,7 +83,6 @@ class Receiver extends Actor with ActorLogging { def receive = { case Greeting(greeting) => { AkkaActors.tracedChild(greeting) - "done" } } diff --git a/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle b/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle index 7951e9254f..95820d5ab5 100644 --- a/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle +++ b/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle @@ -6,7 +6,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:instrumentation:trace-annotation') diff --git a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentation.java b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentation.java index 36e4a04b77..0ecbf2ae84 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentation.java +++ b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/ExecutorInstrumentation.java @@ -16,7 +16,12 @@ import datadog.trace.context.TraceScope; import io.opentracing.Scope; import io.opentracing.util.GlobalTracer; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; @@ -78,8 +83,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { "akka.dispatch.ExecutionContexts$sameThreadExecutionContext$", "play.api.libs.streams.Execution$trampoline$" }; - WHITELISTED_EXECUTORS = - Collections.unmodifiableSet(new HashSet(Arrays.asList(whitelist))); + WHITELISTED_EXECUTORS = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(whitelist))); } public ExecutorInstrumentation() { @@ -93,7 +97,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { .and( new ElementMatcher() { @Override - public boolean matches(TypeDescription target) { + public boolean matches(final TypeDescription target) { final boolean whitelisted = WHITELISTED_EXECUTORS.contains(target.getName()); if (!whitelisted) { log.debug("Skipping executor instrumentation for {}", target.getName()); @@ -157,13 +161,13 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { public static class WrapCallableAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static DatadogWrapper wrapJob( - @Advice.Argument(value = 0, readOnly = false) Callable task) { + @Advice.Argument(value = 0, readOnly = false) Callable task) { final Scope scope = GlobalTracer.get().scopeManager().active(); if (scope instanceof TraceScope && ((TraceScope) scope).isAsyncPropagating() && task != null && !(task instanceof DatadogWrapper)) { - task = new CallableWrapper(task, (TraceScope) scope); + task = new CallableWrapper<>(task, (TraceScope) scope); return (CallableWrapper) task; } return null; @@ -184,11 +188,11 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { @Advice.Argument(value = 0, readOnly = false) Collection> tasks) { final Scope scope = GlobalTracer.get().scopeManager().active(); if (scope instanceof TraceScope && ((TraceScope) scope).isAsyncPropagating()) { - Collection> wrappedTasks = new ArrayList<>(tasks.size()); - for (Callable task : tasks) { + final Collection> wrappedTasks = new ArrayList<>(tasks.size()); + for (Callable task : tasks) { if (task != null) { if (!(task instanceof CallableWrapper)) { - task = new CallableWrapper(task, (TraceScope) scope); + task = new CallableWrapper<>(task, (TraceScope) scope); } wrappedTasks.add(task); } @@ -203,7 +207,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { public static void checkCancel( @Advice.Enter final Collection wrappedJobs, @Advice.Thrown final Throwable throwable) { if (null != wrappedJobs && null != throwable) { - for (Object wrapper : wrappedJobs) { + for (final Object wrapper : wrappedJobs) { if (wrapper instanceof DatadogWrapper) { ((DatadogWrapper) wrapper).cancel(); } @@ -217,7 +221,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { public abstract static class DatadogWrapper { protected final TraceScope.Continuation continuation; - public DatadogWrapper(TraceScope scope) { + public DatadogWrapper(final TraceScope scope) { continuation = scope.capture(); log.debug("created continuation {} from scope {}", continuation, scope); } @@ -234,7 +238,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { public static class RunnableWrapper extends DatadogWrapper implements Runnable { private final Runnable delegatee; - public RunnableWrapper(Runnable toWrap, TraceScope scope) { + public RunnableWrapper(final Runnable toWrap, final TraceScope scope) { super(scope); delegatee = toWrap; } @@ -255,7 +259,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { public static class CallableWrapper extends DatadogWrapper implements Callable { private final Callable delegatee; - public CallableWrapper(Callable toWrap, TraceScope scope) { + public CallableWrapper(final Callable toWrap, final TraceScope scope) { super(scope); delegatee = toWrap; } @@ -274,14 +278,14 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { /** Utils for pulling DatadogWrapper out of Future instances. */ public static class ConcurrentUtils { - private static Map, Field> fieldCache = new ConcurrentHashMap<>(); - private static String[] wrapperFields = {"runnable", "callable"}; + private static final Map, Field> fieldCache = new ConcurrentHashMap<>(); + private static final String[] wrapperFields = {"runnable", "callable"}; - public static boolean safeToWrap(Future f) { + public static boolean safeToWrap(final Future f) { return null != getDatadogWrapper(f); } - public static DatadogWrapper getDatadogWrapper(Future f) { + public static DatadogWrapper getDatadogWrapper(final Future f) { final Field field; if (fieldCache.containsKey(f.getClass())) { field = fieldCache.get(f.getClass()); @@ -293,7 +297,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { if (field != null) { try { field.setAccessible(true); - Object o = field.get(f); + final Object o = field.get(f); if (o instanceof DatadogWrapper) { return (DatadogWrapper) o; } @@ -312,7 +316,7 @@ public final class ExecutorInstrumentation extends Instrumenter.Configurable { try { field = clazz.getDeclaredField(wrapperFields[i]); break; - } catch (Exception e) { + } catch (final Exception e) { } } clazz = clazz.getSuperclass(); diff --git a/dd-java-agent/instrumentation/jax-rs-annotations/jax-rs-annotations.gradle b/dd-java-agent/instrumentation/jax-rs-annotations/jax-rs-annotations.gradle index cc370cd0d5..a249bd2f69 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations/jax-rs-annotations.gradle +++ b/dd-java-agent/instrumentation/jax-rs-annotations/jax-rs-annotations.gradle @@ -13,7 +13,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice compile project(':dd-java-agent:agent-tooling') diff --git a/dd-java-agent/instrumentation/jax-rs-client/jax-rs-client.gradle b/dd-java-agent/instrumentation/jax-rs-client/jax-rs-client.gradle index e3ddb92c9f..8991807e52 100644 --- a/dd-java-agent/instrumentation/jax-rs-client/jax-rs-client.gradle +++ b/dd-java-agent/instrumentation/jax-rs-client/jax-rs-client.gradle @@ -18,7 +18,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice compile project(':dd-java-agent:agent-tooling') diff --git a/dd-java-agent/instrumentation/jboss-classloading/jboss-classloading.gradle b/dd-java-agent/instrumentation/jboss-classloading/jboss-classloading.gradle index 2e9f890a6a..4f7ac8b5f1 100644 --- a/dd-java-agent/instrumentation/jboss-classloading/jboss-classloading.gradle +++ b/dd-java-agent/instrumentation/jboss-classloading/jboss-classloading.gradle @@ -3,7 +3,8 @@ apply from: "${rootDir}/gradle/java.gradle" dependencies { compile project(':dd-java-agent:agent-tooling') compile deps.bytebuddy - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile group: 'org.jboss.modules', name: 'jboss-modules', version: '1.3.10.Final' testCompile project(':dd-java-agent:testing') diff --git a/dd-java-agent/instrumentation/jdbc/jdbc.gradle b/dd-java-agent/instrumentation/jdbc/jdbc.gradle index bc7aba05b9..00ec61f5fc 100644 --- a/dd-java-agent/instrumentation/jdbc/jdbc.gradle +++ b/dd-java-agent/instrumentation/jdbc/jdbc.gradle @@ -5,5 +5,6 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice } diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java index c1bd268513..4f9e25e32e 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java @@ -72,7 +72,7 @@ public final class ConnectionInstrumentation extends Instrumenter.Configurable { if (url != null) { // Remove end of url to prevent passwords from leaking: final String sanitizedURL = url.replaceAll("[?;].*", ""); - final String type = url.split(":")[1]; + final String type = url.split(":", -1)[1]; String user = connection.getMetaData().getUserName(); if (user != null && user.trim().equals("")) { user = null; diff --git a/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle b/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle index 54eac320dd..2ffbab77ed 100644 --- a/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle +++ b/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle @@ -27,7 +27,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6' diff --git a/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle b/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle index 4d0403c917..eef6210209 100644 --- a/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle +++ b/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle @@ -27,7 +27,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.0.0.v20110901' diff --git a/dd-java-agent/instrumentation/jms-1/jms-1.gradle b/dd-java-agent/instrumentation/jms-1/jms-1.gradle index 6efe3fea6f..70dd0adf3f 100644 --- a/dd-java-agent/instrumentation/jms-1/jms-1.gradle +++ b/dd-java-agent/instrumentation/jms-1/jms-1.gradle @@ -18,7 +18,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice compile project(':dd-java-agent:agent-tooling') diff --git a/dd-java-agent/instrumentation/jms-2/jms-2.gradle b/dd-java-agent/instrumentation/jms-2/jms-2.gradle index de9d2b46b6..9a85b96064 100644 --- a/dd-java-agent/instrumentation/jms-2/jms-2.gradle +++ b/dd-java-agent/instrumentation/jms-2/jms-2.gradle @@ -22,7 +22,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice compile project(':dd-java-agent:agent-tooling') diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle b/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle index aae30f300a..f672f66687 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle @@ -27,6 +27,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile group: 'org.apache.kafka', name: 'kafka-clients', version: '0.11.0.0' diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java b/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java index d84d978a19..a6b28aabe3 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java @@ -72,7 +72,7 @@ public final class KafkaConsumerInstrumentation extends Instrumenter.Configurabl @Advice.OnMethodExit(suppress = Throwable.class) public static void wrap(@Advice.Return(readOnly = false) Iterable iterable) { if (iterable != null) { - iterable = new TracingIterable(iterable, "kafka.consume", ConsumeScopeAction.INSTANCE); + iterable = new TracingIterable<>(iterable, "kafka.consume", ConsumeScopeAction.INSTANCE); } } } @@ -83,7 +83,7 @@ public final class KafkaConsumerInstrumentation extends Instrumenter.Configurabl public static void wrap(@Advice.Return(readOnly = false) Iterator iterator) { if (iterator != null) { iterator = - new TracingIterable.TracingIterator( + new TracingIterable.TracingIterator<>( iterator, "kafka.consume", ConsumeScopeAction.INSTANCE); } } diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterable.java b/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterable.java index e2ff77f7dd..fea7908ea2 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterable.java +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TracingIterable.java @@ -67,9 +67,10 @@ public class TracingIterable implements Iterable { decorator.decorate(spanBuilder, next); currentScope = spanBuilder.startActive(true); } - } finally { - return next; + } catch (final Exception e) { + log.debug("Error during decoration", e); } + return next; } @Override diff --git a/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle b/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle index 681749e721..31ec53820d 100644 --- a/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle +++ b/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle @@ -27,6 +27,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') // Include kafka-clients instrumentation for tests. diff --git a/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle b/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle index e970380a25..5c9c6e9dd6 100644 --- a/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle +++ b/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle @@ -27,6 +27,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-trace-ot') testCompile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.4.2' diff --git a/dd-java-agent/instrumentation/mongo-async-3.3/mongo-async-3.3.gradle b/dd-java-agent/instrumentation/mongo-async-3.3/mongo-async-3.3.gradle index a2b503a89b..1fc6ce75d4 100644 --- a/dd-java-agent/instrumentation/mongo-async-3.3/mongo-async-3.3.gradle +++ b/dd-java-agent/instrumentation/mongo-async-3.3/mongo-async-3.3.gradle @@ -23,4 +23,6 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice } diff --git a/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle b/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle index 1042eb46a5..d374fd5a12 100644 --- a/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle +++ b/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle @@ -32,6 +32,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.0' diff --git a/dd-java-agent/instrumentation/osgi-classloading/osgi-classloading.gradle b/dd-java-agent/instrumentation/osgi-classloading/osgi-classloading.gradle index d027d2489f..18a452c8cc 100644 --- a/dd-java-agent/instrumentation/osgi-classloading/osgi-classloading.gradle +++ b/dd-java-agent/instrumentation/osgi-classloading/osgi-classloading.gradle @@ -3,7 +3,8 @@ apply from: "${rootDir}/gradle/java.gradle" dependencies { compile project(':dd-java-agent:agent-tooling') compile deps.bytebuddy - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile group: 'org.osgi', name: 'org.osgi.core', version: '4.0.0' testCompile project(':dd-java-agent:testing') diff --git a/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle b/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle index af30d6effd..fe3a04ee9c 100644 --- a/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle +++ b/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle @@ -14,7 +14,8 @@ dependencies { compile project(':dd-java-agent:agent-tooling') compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile group: 'org.scala-lang', name: 'scala-library', version: '2.11.12' testCompile group: 'com.typesafe.play', name: 'play_2.11', version: '2.4.0' diff --git a/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle b/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle index ea60315e13..e13f023d29 100644 --- a/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle +++ b/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle @@ -26,6 +26,10 @@ compileMain_java8Java { sourceCompatibility = 1.8 targetCompatibility = 1.8 } +configurations { + main_java8AnnotationProcessor.extendsFrom lombok + main_java8Implementation.extendsFrom lombok +} apply plugin: 'org.unbroken-dome.test-sets' @@ -43,7 +47,9 @@ dependencies { main_java8Compile deps.bytebuddy main_java8Compile deps.opentracing - main_java8Compile deps.autoservice + + annotationProcessor deps.autoservice + implementation deps.autoservice compileOnly sourceSets.main_java8.compileClasspath diff --git a/dd-java-agent/instrumentation/servlet-2/servlet-2.gradle b/dd-java-agent/instrumentation/servlet-2/servlet-2.gradle index 1898e05c2d..d7d4670114 100644 --- a/dd-java-agent/instrumentation/servlet-2/servlet-2.gradle +++ b/dd-java-agent/instrumentation/servlet-2/servlet-2.gradle @@ -19,7 +19,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '7.0.0.v20091005' diff --git a/dd-java-agent/instrumentation/servlet-2/src/main/java/datadog/trace/instrumentation/servlet2/HttpServletRequestExtractAdapter.java b/dd-java-agent/instrumentation/servlet-2/src/main/java/datadog/trace/instrumentation/servlet2/HttpServletRequestExtractAdapter.java index 29396b3516..ebe39df2d9 100644 --- a/dd-java-agent/instrumentation/servlet-2/src/main/java/datadog/trace/instrumentation/servlet2/HttpServletRequestExtractAdapter.java +++ b/dd-java-agent/instrumentation/servlet-2/src/main/java/datadog/trace/instrumentation/servlet2/HttpServletRequestExtractAdapter.java @@ -38,14 +38,14 @@ public class HttpServletRequestExtractAdapter implements TextMap { final HttpServletRequest httpServletRequest) { final Map> headersResult = new HashMap<>(); - final Enumeration headerNamesIt = httpServletRequest.getHeaderNames(); + final Enumeration headerNamesIt = httpServletRequest.getHeaderNames(); while (headerNamesIt.hasMoreElements()) { - final String headerName = headerNamesIt.nextElement(); + final String headerName = headerNamesIt.nextElement().toString(); - final Enumeration valuesIt = httpServletRequest.getHeaders(headerName); + final Enumeration valuesIt = httpServletRequest.getHeaders(headerName); final List valuesList = new ArrayList<>(1); while (valuesIt.hasMoreElements()) { - valuesList.add(valuesIt.nextElement()); + valuesList.add(valuesIt.nextElement().toString()); } headersResult.put(headerName, valuesList); diff --git a/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle b/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle index 75bd8b6940..893fa969f8 100644 --- a/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle +++ b/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle @@ -29,7 +29,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:instrumentation:jetty-8') // See if there's any conflicts. diff --git a/dd-java-agent/instrumentation/sparkjava-2.4/sparkjava-2.4.gradle b/dd-java-agent/instrumentation/sparkjava-2.4/sparkjava-2.4.gradle index 3aae2f5bc6..b9d62eedd3 100644 --- a/dd-java-agent/instrumentation/sparkjava-2.4/sparkjava-2.4.gradle +++ b/dd-java-agent/instrumentation/sparkjava-2.4/sparkjava-2.4.gradle @@ -42,7 +42,8 @@ dependencies { compile project(':dd-java-agent:agent-tooling') compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:instrumentation:jetty-8') testCompile project(':dd-java-agent:testing') diff --git a/dd-java-agent/instrumentation/spring-web/spring-web.gradle b/dd-java-agent/instrumentation/spring-web/spring-web.gradle index 163af1bf15..8eec6895a4 100644 --- a/dd-java-agent/instrumentation/spring-web/spring-web.gradle +++ b/dd-java-agent/instrumentation/spring-web/spring-web.gradle @@ -23,7 +23,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') diff --git a/dd-java-agent/instrumentation/trace-annotation/trace-annotation.gradle b/dd-java-agent/instrumentation/trace-annotation/trace-annotation.gradle index 2df6c0aac2..d49bf6b311 100644 --- a/dd-java-agent/instrumentation/trace-annotation/trace-annotation.gradle +++ b/dd-java-agent/instrumentation/trace-annotation/trace-annotation.gradle @@ -6,7 +6,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') } diff --git a/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java b/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java index f48937396e..4db936d2b7 100644 --- a/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java +++ b/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java @@ -12,6 +12,7 @@ import io.opentracing.Tracer; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.util.List; +import java.util.ServiceLoader; import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicInteger; import net.bytebuddy.agent.ByteBuddyAgent; @@ -101,6 +102,7 @@ public abstract class AgentTestRunner extends Specification { final ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(AgentTestRunner.class.getClassLoader()); + assert ServiceLoader.load(Instrumenter.class).iterator().hasNext(); activeTransformer = AgentInstaller.installBytebuddyAgent(instrumentation, new ErrorCountingListener()); } finally { diff --git a/dd-java-agent/testing/testing.gradle b/dd-java-agent/testing/testing.gradle index f4bdbf6ae8..0d8cee064c 100644 --- a/dd-java-agent/testing/testing.gradle +++ b/dd-java-agent/testing/testing.gradle @@ -7,9 +7,13 @@ dependencies { compile deps.opentracing compile deps.spock compile deps.testLogging + compile deps.guava compile project(':dd-trace-ot') compile project(':dd-java-agent:agent-tooling') + + annotationProcessor deps.autoservice + implementation deps.autoservice compile deps.groovy diff --git a/dd-trace-java.gradle b/dd-trace-java.gradle index 61bff8383b..18204cbb87 100644 --- a/dd-trace-java.gradle +++ b/dd-trace-java.gradle @@ -3,9 +3,9 @@ buildscript { jcenter() } dependencies { - classpath "io.franzbecker:gradle-lombok:1.8" - classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.4.18" - classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3" + classpath "io.franzbecker:gradle-lombok:1.13" + classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.7.2" + classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0" classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13" classpath 'org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.4.5' } diff --git a/dd-trace-ot/dd-trace-ot.gradle b/dd-trace-ot/dd-trace-ot.gradle index 32151e6f0c..20db992711 100644 --- a/dd-trace-ot/dd-trace-ot.gradle +++ b/dd-trace-ot/dd-trace-ot.gradle @@ -28,7 +28,8 @@ testSets { } dependencies { - compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice compile project(':dd-trace-api') compile deps.opentracing diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/decorators/OperationDecorator.java b/dd-trace-ot/src/main/java/datadog/opentracing/decorators/OperationDecorator.java index e35da8e64f..0245fa6505 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/decorators/OperationDecorator.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/decorators/OperationDecorator.java @@ -2,6 +2,7 @@ package datadog.opentracing.decorators; import datadog.opentracing.DDSpanContext; import io.opentracing.tag.Tags; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -11,18 +12,19 @@ import java.util.Map; */ public class OperationDecorator extends AbstractDecorator { - static final Map MAPPINGS = - new HashMap() { - { - // Component name <> Operation name - put("apache-httpclient", "apache.http"); - put("java-aws-sdk", "aws.http"); - // FIXME: JMS ops card is low (jms-send or jms-receive), may be this mapping is useless - put("java-jms", "jms"); - put("okhttp", "okhttp.http"); - // Cassandra, Mongo, JDBC are set via DBTypeDecorator - } - }; + static final Map MAPPINGS; + + static { + final Map mappings = new HashMap<>(); + // Component name <> Operation name + mappings.put("apache-httpclient", "apache.http"); + mappings.put("java-aws-sdk", "aws.http"); + // FIXME: JMS ops card is low (jms-send or jms-receive), may be this mapping is useless + mappings.put("java-jms", "jms"); + mappings.put("okhttp", "okhttp.http"); + // Cassandra, Mongo, JDBC are set via DBTypeDecorator + MAPPINGS = Collections.unmodifiableMap(mappings); + } public OperationDecorator() { super(); diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContextualScopeManager.java b/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContextualScopeManager.java index e0283a21c8..d1d6ed9d9e 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContextualScopeManager.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContextualScopeManager.java @@ -8,7 +8,7 @@ import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; public class ContextualScopeManager implements ScopeManager { - final ThreadLocal tlsScope = new ThreadLocal<>(); + static final ThreadLocal tlsScope = new ThreadLocal<>(); final Deque scopeContexts = new ConcurrentLinkedDeque<>(); @Override diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContinuableScope.java b/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContinuableScope.java index efe8df4343..7a44091f0d 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContinuableScope.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/scopemanager/ContinuableScope.java @@ -78,7 +78,7 @@ public class ContinuableScope implements Scope, TraceScope { } @Override - public void setAsyncPropagation(boolean value) { + public void setAsyncPropagation(final boolean value) { isAsyncPropagating.set(value); } @@ -87,6 +87,7 @@ public class ContinuableScope implements Scope, TraceScope { * * @return The new continuation, or null if this scope is not async propagating. */ + @Override public Continuation capture() { if (isAsyncPropagating()) { return new Continuation(); @@ -108,6 +109,7 @@ public class ContinuableScope implements Scope, TraceScope { trace.registerContinuation(this); } + @Override public ContinuableScope activate() { if (used.compareAndSet(false, true)) { return new ContinuableScope(scopeManager, openCount, this, spanUnderScope, finishOnClose); diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/DDTraceConfig.java b/dd-trace-ot/src/main/java/datadog/trace/common/DDTraceConfig.java index 472a9d68fa..f23f65d321 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/DDTraceConfig.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/DDTraceConfig.java @@ -83,12 +83,14 @@ public class DDTraceConfig extends Properties { return Collections.emptyMap(); } - final String[] tokens = str.split(","); + final String[] tokens = str.split(",", -1); final Map map = new HashMap<>(tokens.length + 1, 1f); for (final String token : tokens) { - final String[] keyValue = token.split(":"); - map.put(keyValue[0].trim(), keyValue[1].trim()); + final String[] keyValue = token.split(":", -1); + if (keyValue.length == 2) { + map.put(keyValue[0].trim(), keyValue[1].trim()); + } } return Collections.unmodifiableMap(map); } diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/Service.java b/dd-trace-ot/src/main/java/datadog/trace/common/Service.java index 668a29d8b9..deb453dd32 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/Service.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/Service.java @@ -57,6 +57,7 @@ public class Service { } @JsonValue + @Override public String toString() { return type; } diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java index 85b858932b..e1f192f331 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/DDApi.java @@ -10,6 +10,7 @@ import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -82,7 +83,8 @@ public class DDApi { String responseString = null; { final BufferedReader responseReader = - new BufferedReader(new InputStreamReader(httpCon.getInputStream())); + new BufferedReader( + new InputStreamReader(httpCon.getInputStream(), StandardCharsets.UTF_8)); final StringBuilder sb = new StringBuilder(); String line = null; diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/writer/ListWriter.java b/dd-trace-ot/src/main/java/datadog/trace/common/writer/ListWriter.java index e43b2c831d..9ea0a37966 100644 --- a/dd-trace-ot/src/main/java/datadog/trace/common/writer/ListWriter.java +++ b/dd-trace-ot/src/main/java/datadog/trace/common/writer/ListWriter.java @@ -1,7 +1,7 @@ package datadog.trace.common.writer; import datadog.opentracing.DDSpan; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CountDownLatch; @@ -10,7 +10,7 @@ import java.util.concurrent.TimeoutException; /** List writer used by tests mostly */ public class ListWriter extends CopyOnWriteArrayList> implements Writer { - private final List latches = new LinkedList<>(); + private final List latches = new ArrayList<>(); public List firstTrace() { return get(0); diff --git a/examples/dropwizard-mongo-client/src/main/java/datadog/example/dropwizard/api/Book.java b/examples/dropwizard-mongo-client/src/main/java/datadog/example/dropwizard/api/Book.java index abe23640d7..1a4d1f7da0 100644 --- a/examples/dropwizard-mongo-client/src/main/java/datadog/example/dropwizard/api/Book.java +++ b/examples/dropwizard-mongo-client/src/main/java/datadog/example/dropwizard/api/Book.java @@ -7,12 +7,12 @@ public class Book { private final String title; private final int numberPages; - private final String IsbnCode; + private final String isbnCode; public Book(final String isbnCode, final String title, final int numberPages) { this.title = title; this.numberPages = numberPages; - IsbnCode = isbnCode; + this.isbnCode = isbnCode; } public Book(final Document d) { @@ -21,7 +21,7 @@ public class Book { @JsonProperty("ISBN") public String getIsbnCode() { - return IsbnCode; + return isbnCode; } public String getTitle() { @@ -33,6 +33,6 @@ public class Book { } public Document toDocument() { - return new Document("isbn", IsbnCode).append("title", title).append("page", numberPages); + return new Document("isbn", isbnCode).append("title", title).append("page", numberPages); } } diff --git a/gradle/java.gradle b/gradle/java.gradle index 008b6fbdaa..7ce398b22a 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -13,6 +13,7 @@ lombok { // optional: values below are the defaults apply plugin: "net.ltgt.errorprone" tasks.withType(JavaCompile) { + options.compilerArgs += ['-Xep:FutureReturnValueIgnored:OFF'] // workaround for: https://github.com/google/error-prone/issues/780 options.compilerArgs += ['-Xep:ParameterName:OFF'] } From 114f088766785791e70b50f59e518b483a52c88e Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Fri, 4 May 2018 10:06:54 +1000 Subject: [PATCH 2/4] Fix TLS usage --- .../bootstrap/CallDepthThreadLocalMap.java | 47 ++++++++++--------- .../CallDepthThreadLocalMapTest.groovy | 35 ++++++++++++++ .../ClassLoaderInstrumentation.java | 5 +- .../jdbc/ConnectionInstrumentation.java | 5 +- .../PreparedStatementInstrumentation.java | 6 +-- .../jdbc/StatementInstrumentation.java | 5 +- 6 files changed, 71 insertions(+), 32 deletions(-) create mode 100644 dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/CallDepthThreadLocalMapTest.groovy diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java index 58a363f180..8f94401e30 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/CallDepthThreadLocalMap.java @@ -1,7 +1,7 @@ package datadog.trace.bootstrap; +import java.util.HashMap; import java.util.Map; -import java.util.WeakHashMap; import java.util.concurrent.atomic.AtomicInteger; /** @@ -11,36 +11,37 @@ import java.util.concurrent.atomic.AtomicInteger; * #incrementCallDepth at the beginning of each constructor. */ public class CallDepthThreadLocalMap { - private static final ThreadLocal> INSTANCES = - new ThreadLocal<>(); + private static final ThreadLocal> TLS = + new ThreadLocal>() { + @Override + public Map initialValue() { + return new HashMap<>(); + } + }; - private static final ThreadLocal tls = new ThreadLocal<>(); - - public static CallDepthThreadLocalMap get(final Object o) { - if (INSTANCES.get() == null) { - INSTANCES.set(new WeakHashMap()); - } - if (!INSTANCES.get().containsKey(o)) { - INSTANCES.get().put(o, new CallDepthThreadLocalMap()); - } - return INSTANCES.get().get(o); - } - - private CallDepthThreadLocalMap() {} - - public int incrementCallDepth() { - AtomicInteger depth = tls.get(); + public static int incrementCallDepth(final Key k) { + final Map map = TLS.get(); + AtomicInteger depth = map.get(k); if (depth == null) { depth = new AtomicInteger(0); - tls.set(depth); + map.put(k, depth); return 0; } else { return depth.incrementAndGet(); } } - public void reset() { - tls.remove(); - INSTANCES.get().remove(this); + public static void reset(final Key k) { + final Map map = TLS.get(); + if (map != null) { + map.remove(k); + } + } + + public enum Key { + CLASSLOADER, + CONNECTION, + PREPARED_STATEMENT, + STATEMENT } } diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/CallDepthThreadLocalMapTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/CallDepthThreadLocalMapTest.groovy new file mode 100644 index 0000000000..0df2d3219b --- /dev/null +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/CallDepthThreadLocalMapTest.groovy @@ -0,0 +1,35 @@ +package datadog.trace.bootstrap + +import spock.lang.Specification + +class CallDepthThreadLocalMapTest extends Specification { + + def "test CallDepthThreadLocalMap"() { + setup: + def k1 = CallDepthThreadLocalMap.Key.CLASSLOADER + def k2 = CallDepthThreadLocalMap.Key.CONNECTION + + expect: + CallDepthThreadLocalMap.incrementCallDepth(k1) == 0 + CallDepthThreadLocalMap.incrementCallDepth(k2) == 0 + + CallDepthThreadLocalMap.incrementCallDepth(k1) == 1 + CallDepthThreadLocalMap.incrementCallDepth(k2) == 1 + + when: + CallDepthThreadLocalMap.reset(k1) + + then: + CallDepthThreadLocalMap.incrementCallDepth(k2) == 2 + + when: + CallDepthThreadLocalMap.reset(k2) + + then: + CallDepthThreadLocalMap.incrementCallDepth(k1) == 0 + CallDepthThreadLocalMap.incrementCallDepth(k2) == 0 + + CallDepthThreadLocalMap.incrementCallDepth(k1) == 1 + CallDepthThreadLocalMap.incrementCallDepth(k2) == 1 + } +} diff --git a/dd-java-agent/instrumentation/classloaders/src/main/java/datadog/trace/instrumentation/classloaders/ClassLoaderInstrumentation.java b/dd-java-agent/instrumentation/classloaders/src/main/java/datadog/trace/instrumentation/classloaders/ClassLoaderInstrumentation.java index 116b69ff43..b411705902 100644 --- a/dd-java-agent/instrumentation/classloaders/src/main/java/datadog/trace/instrumentation/classloaders/ClassLoaderInstrumentation.java +++ b/dd-java-agent/instrumentation/classloaders/src/main/java/datadog/trace/instrumentation/classloaders/ClassLoaderInstrumentation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.classloaders; import static datadog.trace.agent.tooling.ClassLoaderMatcher.classLoaderHasClasses; +import static datadog.trace.bootstrap.CallDepthThreadLocalMap.Key.CLASSLOADER; import static net.bytebuddy.matcher.ElementMatchers.failSafe; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isSubTypeOf; @@ -45,7 +46,7 @@ public final class ClassLoaderInstrumentation extends Instrumenter.Configurable public static int constructorEnter() { // We use this to make sure we only apply the exit instrumentation // after the constructors are done calling their super constructors. - return CallDepthThreadLocalMap.get(ClassLoader.class).incrementCallDepth(); + return CallDepthThreadLocalMap.incrementCallDepth(CLASSLOADER); } // Not sure why, but adding suppress causes a verify error. @@ -53,7 +54,7 @@ public final class ClassLoaderInstrumentation extends Instrumenter.Configurable public static void constructorExit( @Advice.This final ClassLoader cl, @Advice.Enter final int depth) { if (depth == 0) { - CallDepthThreadLocalMap.get(ClassLoader.class).reset(); + CallDepthThreadLocalMap.reset(CLASSLOADER); try { final Field field = GlobalTracer.class.getDeclaredField("tracer"); diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java index 4f9e25e32e..2d87a5b268 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/ConnectionInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jdbc; +import static datadog.trace.bootstrap.CallDepthThreadLocalMap.Key.CONNECTION; import static net.bytebuddy.matcher.ElementMatchers.failSafe; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isInterface; @@ -58,7 +59,7 @@ public final class ConnectionInstrumentation extends Instrumenter.Configurable { public static int constructorEnter() { // We use this to make sure we only apply the exit instrumentation // after the constructors are done calling their super constructors. - return CallDepthThreadLocalMap.get(Connection.class).incrementCallDepth(); + return CallDepthThreadLocalMap.incrementCallDepth(CONNECTION); } // Since we're instrumenting the constructor, we can't add onThrowable. @@ -67,7 +68,7 @@ public final class ConnectionInstrumentation extends Instrumenter.Configurable { @Advice.Enter final int depth, @Advice.This final Connection connection) throws SQLException { if (depth == 0) { - CallDepthThreadLocalMap.get(Connection.class).reset(); + CallDepthThreadLocalMap.reset(CONNECTION); final String url = connection.getMetaData().getURL(); if (url != null) { // Remove end of url to prevent passwords from leaking: diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/PreparedStatementInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/PreparedStatementInstrumentation.java index bc1f3b49b6..5ff3d2e22c 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/PreparedStatementInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/PreparedStatementInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jdbc; +import static datadog.trace.bootstrap.CallDepthThreadLocalMap.Key.PREPARED_STATEMENT; import static io.opentracing.log.Fields.ERROR_OBJECT; import static net.bytebuddy.matcher.ElementMatchers.failSafe; import static net.bytebuddy.matcher.ElementMatchers.isInterface; @@ -51,8 +52,7 @@ public final class PreparedStatementInstrumentation extends Instrumenter.Configu @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope startSpan(@Advice.This final PreparedStatement statement) { - final int callDepth = - CallDepthThreadLocalMap.get(PreparedStatement.class).incrementCallDepth(); + final int callDepth = CallDepthThreadLocalMap.incrementCallDepth(PREPARED_STATEMENT); if (callDepth > 0) { return null; } @@ -99,7 +99,7 @@ public final class PreparedStatementInstrumentation extends Instrumenter.Configu span.log(Collections.singletonMap(ERROR_OBJECT, throwable)); } scope.close(); - CallDepthThreadLocalMap.get(PreparedStatement.class).reset(); + CallDepthThreadLocalMap.reset(PREPARED_STATEMENT); } } } diff --git a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java index 9013042463..d67be7b6ba 100644 --- a/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java +++ b/dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jdbc; +import static datadog.trace.bootstrap.CallDepthThreadLocalMap.Key.STATEMENT; import static io.opentracing.log.Fields.ERROR_OBJECT; import static net.bytebuddy.matcher.ElementMatchers.failSafe; import static net.bytebuddy.matcher.ElementMatchers.isInterface; @@ -52,7 +53,7 @@ public final class StatementInstrumentation extends Instrumenter.Configurable { @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope startSpan( @Advice.Argument(0) final String sql, @Advice.This final Statement statement) { - final int callDepth = CallDepthThreadLocalMap.get(Statement.class).incrementCallDepth(); + final int callDepth = CallDepthThreadLocalMap.incrementCallDepth(STATEMENT); if (callDepth > 0) { return null; } @@ -100,7 +101,7 @@ public final class StatementInstrumentation extends Instrumenter.Configurable { span.log(Collections.singletonMap(ERROR_OBJECT, throwable)); } scope.close(); - CallDepthThreadLocalMap.get(Statement.class).reset(); + CallDepthThreadLocalMap.reset(STATEMENT); } } } From 7dfdc2d50e5b61c56339af4b7494b3e5d29501ff Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Fri, 4 May 2018 15:38:41 +1000 Subject: [PATCH 3/4] Missing autoservice annotation processor --- .../instrumentation/hystrix-1.4/hystrix-1.4.gradle | 2 ++ .../hystrix-1.4/src/test/groovy/HystrixTest.groovy | 4 ++++ .../java/datadog/trace/agent/test/AgentTestRunner.java | 8 +++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle b/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle index c48bfcb591..4fcded6aae 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle +++ b/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle @@ -28,6 +28,8 @@ dependencies { compile deps.bytebuddy compile deps.opentracing compile deps.autoservice + annotationProcessor deps.autoservice + implementation deps.autoservice testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:instrumentation:java-concurrent') diff --git a/dd-java-agent/instrumentation/hystrix-1.4/src/test/groovy/HystrixTest.groovy b/dd-java-agent/instrumentation/hystrix-1.4/src/test/groovy/HystrixTest.groovy index 8aed84ca64..09740f50ab 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/src/test/groovy/HystrixTest.groovy +++ b/dd-java-agent/instrumentation/hystrix-1.4/src/test/groovy/HystrixTest.groovy @@ -35,6 +35,8 @@ class HystrixTest extends AgentTestRunner { operation(command) } expect: + TRANSFORMED_CLASSES.contains("com.netflix.hystrix.strategy.concurrency.HystrixContextScheduler\$ThreadPoolWorker") + TRANSFORMED_CLASSES.contains("HystrixTest\$1") result == "Hello!" assertTraces(TEST_WRITER, 1) { @@ -106,6 +108,8 @@ class HystrixTest extends AgentTestRunner { operation(command) } expect: + TRANSFORMED_CLASSES.contains("com.netflix.hystrix.strategy.concurrency.HystrixContextScheduler\$ThreadPoolWorker") + TRANSFORMED_CLASSES.contains("HystrixTest\$2") result == "Fallback!" assertTraces(TEST_WRITER, 1) { diff --git a/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java b/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java index 4db936d2b7..6e0b09dd87 100644 --- a/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java +++ b/dd-java-agent/testing/src/main/java/datadog/trace/agent/test/AgentTestRunner.java @@ -2,6 +2,7 @@ package datadog.trace.agent.test; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; +import com.google.common.collect.Sets; import datadog.opentracing.DDSpan; import datadog.opentracing.DDTracer; import datadog.trace.agent.tooling.AgentInstaller; @@ -13,6 +14,7 @@ import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; import java.util.List; import java.util.ServiceLoader; +import java.util.Set; import java.util.concurrent.Phaser; import java.util.concurrent.atomic.AtomicInteger; import net.bytebuddy.agent.ByteBuddyAgent; @@ -58,6 +60,8 @@ public abstract class AgentTestRunner extends Specification { // 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 TRANSFORMED_CLASSES = Sets.newConcurrentHashSet(); private static final AtomicInteger INSTRUMENTATION_ERROR_COUNT = new AtomicInteger(); private static final Instrumentation instrumentation; @@ -144,7 +148,9 @@ public abstract class AgentTestRunner extends Specification { final ClassLoader classLoader, final JavaModule module, final boolean loaded, - final DynamicType dynamicType) {} + final DynamicType dynamicType) { + TRANSFORMED_CLASSES.add(typeDescription.getActualName()); + } @Override public void onIgnored( From 9a523033769660b489e1c1a54a2eac7d9c386ba0 Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Fri, 2 Mar 2018 19:48:28 +1000 Subject: [PATCH 4/4] Apply jacoco to every java project MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some projects have ignores/whitelists, but generally coverage is pretty high. AFAIK, this doesn’t really capture instrumentation test coverage though. --- .../dd-java-agent-ittests.gradle | 4 -- .../agent-bootstrap/agent-bootstrap.gradle | 4 ++ .../agent-tooling/agent-tooling.gradle | 4 ++ dd-java-agent/dd-java-agent.gradle | 7 +- .../instrumentation/instrumentation.gradle | 4 ++ .../akka-testing/akka-testing.gradle | 4 ++ dd-java-agent/testing/testing.gradle | 8 +++ dd-trace-api/dd-trace-api.gradle | 1 - dd-trace-ot/dd-trace-ot.gradle | 9 +-- .../java/datadog/trace/common/Service.java | 65 ------------------- .../scopemanager/ScopeManagerTest.groovy | 16 +++++ .../sampling/RateByServiceSamplerTest.groovy | 19 ++++++ .../dropwizard-mongo-client.gradle | 1 - examples/rest-spark/rest-spark.gradle | 1 - .../spring-boot-jdbc-redis.gradle | 1 - gradle/jacoco.gradle | 22 +++++-- gradle/java.gradle | 1 + 17 files changed, 82 insertions(+), 89 deletions(-) delete mode 100644 dd-trace-ot/src/main/java/datadog/trace/common/Service.java diff --git a/dd-java-agent-ittests/dd-java-agent-ittests.gradle b/dd-java-agent-ittests/dd-java-agent-ittests.gradle index 7a7a480f3a..c829b08b10 100644 --- a/dd-java-agent-ittests/dd-java-agent-ittests.gradle +++ b/dd-java-agent-ittests/dd-java-agent-ittests.gradle @@ -53,7 +53,3 @@ tasks.withType(Test) { parent.subprojects.collect { it.tasks.withType(Test) } each { test.shouldRunAfter it } - -// Jacoco must be applied after the test javaagent config block above, -// otherwise the javaagent args conflict. (It's order dependent and added LIFO) -apply from: "${rootDir}/gradle/jacoco.gradle" diff --git a/dd-java-agent/agent-bootstrap/agent-bootstrap.gradle b/dd-java-agent/agent-bootstrap/agent-bootstrap.gradle index d7353bb842..154c6d8eeb 100644 --- a/dd-java-agent/agent-bootstrap/agent-bootstrap.gradle +++ b/dd-java-agent/agent-bootstrap/agent-bootstrap.gradle @@ -5,6 +5,10 @@ plugins { apply from: "${rootDir}/gradle/java.gradle" +whitelistedInstructionClasses += whitelistedBranchClasses += [ + 'datadog.trace.bootstrap.*' +] + dependencies { compile project(':dd-trace-api') compile deps.opentracing diff --git a/dd-java-agent/agent-tooling/agent-tooling.gradle b/dd-java-agent/agent-tooling/agent-tooling.gradle index ad294c408d..cf4a84a7ed 100644 --- a/dd-java-agent/agent-tooling/agent-tooling.gradle +++ b/dd-java-agent/agent-tooling/agent-tooling.gradle @@ -1,5 +1,9 @@ apply from: "${rootDir}/gradle/java.gradle" +whitelistedInstructionClasses += whitelistedBranchClasses += [ + 'datadog.trace.agent.tooling.*' +] + dependencies { compile project(':dd-java-agent:agent-bootstrap') compile deps.bytebuddy diff --git a/dd-java-agent/dd-java-agent.gradle b/dd-java-agent/dd-java-agent.gradle index 43b8809c22..d5fa68c4c5 100644 --- a/dd-java-agent/dd-java-agent.gradle +++ b/dd-java-agent/dd-java-agent.gradle @@ -6,13 +6,8 @@ description = 'dd-java-agent' apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/publish.gradle" -apply from: "${rootDir}/gradle/jacoco.gradle" -jacocoTestReport.dependsOn ':dd-java-agent-ittests:test' -whitelistedInstructionClasses += whitelistedBranchClasses += [ - 'datadog.agent.*', - 'datadog.agent.decorators.*', -] +jacocoTestReport.dependsOn ':dd-java-agent-ittests:test' /* * Include subproject's shadowJar in the dd-java-agent jar. diff --git a/dd-java-agent/instrumentation/instrumentation.gradle b/dd-java-agent/instrumentation/instrumentation.gradle index d37a3e96b1..fe129b67bd 100644 --- a/dd-java-agent/instrumentation/instrumentation.gradle +++ b/dd-java-agent/instrumentation/instrumentation.gradle @@ -15,6 +15,10 @@ subprojects { subProj -> } } +whitelistedInstructionClasses += whitelistedBranchClasses += [ + 'datadog.trace.instrumentation.*' +] + dependencies { compile(project(':dd-java-agent:agent-tooling')) { exclude module: ':dd-java-agent:agent-bootstrap' diff --git a/dd-java-agent/instrumentation/java-concurrent/akka-testing/akka-testing.gradle b/dd-java-agent/instrumentation/java-concurrent/akka-testing/akka-testing.gradle index 2519e05a87..0718cfbd7b 100644 --- a/dd-java-agent/instrumentation/java-concurrent/akka-testing/akka-testing.gradle +++ b/dd-java-agent/instrumentation/java-concurrent/akka-testing/akka-testing.gradle @@ -1,6 +1,10 @@ apply from: "${rootDir}/gradle/java.gradle" apply plugin: 'scala' +whitelistedInstructionClasses += whitelistedBranchClasses += [ + '*' +] + dependencies { compile project(':dd-trace-api') compile project(':dd-trace-ot') diff --git a/dd-java-agent/testing/testing.gradle b/dd-java-agent/testing/testing.gradle index 0d8cee064c..e357656a4a 100644 --- a/dd-java-agent/testing/testing.gradle +++ b/dd-java-agent/testing/testing.gradle @@ -1,5 +1,13 @@ apply from: "${rootDir}/gradle/java.gradle" +minimumBranchCoverage = 0.5 +minimumInstructionCoverage = 0.6 +whitelistedInstructionClasses += whitelistedBranchClasses += [ + 'datadog.trace.agent.test.*Assert', + 'datadog.trace.agent.test.AgentTestRunner.1', + 'datadog.trace.agent.test.TestUtils' +] + dependencies { compile deps.bytebuddy compile deps.bytebuddyagent diff --git a/dd-trace-api/dd-trace-api.gradle b/dd-trace-api/dd-trace-api.gradle index 5e68f0eff5..1b9a00d340 100644 --- a/dd-trace-api/dd-trace-api.gradle +++ b/dd-trace-api/dd-trace-api.gradle @@ -1,6 +1,5 @@ apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/publish.gradle" -apply from: "${rootDir}/gradle/jacoco.gradle" description = 'dd-trace-api' dependencies { diff --git a/dd-trace-ot/dd-trace-ot.gradle b/dd-trace-ot/dd-trace-ot.gradle index 20db992711..1eae3b359d 100644 --- a/dd-trace-ot/dd-trace-ot.gradle +++ b/dd-trace-ot/dd-trace-ot.gradle @@ -6,15 +6,12 @@ description = 'dd-trace-ot' apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/publish.gradle" -apply from: "${rootDir}/gradle/jacoco.gradle" -minimumBranchCoverage = 0.3 -minimumInstructionCoverage = 0.5 + +minimumBranchCoverage = 0.5 +minimumInstructionCoverage = 0.6 whitelistedInstructionClasses += whitelistedBranchClasses += [ 'datadog.opentracing.decorators.*', 'datadog.trace.common.writer.ListWriter', - 'datadog.trace.common.util.Clock', - 'datadog.trace.api.DDTags', - 'datadog.trace.common.util.ConfigUtils', 'datadog.trace.common.sampling.PrioritySampling' ] diff --git a/dd-trace-ot/src/main/java/datadog/trace/common/Service.java b/dd-trace-ot/src/main/java/datadog/trace/common/Service.java deleted file mode 100644 index deb453dd32..0000000000 --- a/dd-trace-ot/src/main/java/datadog/trace/common/Service.java +++ /dev/null @@ -1,65 +0,0 @@ -package datadog.trace.common; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonValue; - -public class Service { - - private final String name; - private final String appName; - private final Service.AppType appType; - - public Service(final String name, final String appName, final AppType appType) { - this.name = name; - this.appName = appName; - this.appType = appType; - } - - @JsonIgnore - public String getName() { - return name; - } - - @JsonProperty("app") - public String getAppName() { - return appName; - } - - @JsonProperty("app_type") - public AppType getAppType() { - return appType; - } - - @Override - public String toString() { - return "Service { " - + "name='" - + name - + "\', appName='" - + appName - + "', appType=" - + appType - + " }"; - } - - public enum AppType { - WEB("web"), - DB("db"), - CUSTOM("custom"), - CACHE("cache"), - WORKER("worker"); - - private final String type; - - AppType(final String type) { - this.type = type; - } - - @JsonValue - @Override - public String toString() { - return type; - } - } -} diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/scopemanager/ScopeManagerTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/scopemanager/ScopeManagerTest.groovy index 7efa86c0c2..5d4a64936a 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/scopemanager/ScopeManagerTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/scopemanager/ScopeManagerTest.groovy @@ -7,6 +7,7 @@ import datadog.opentracing.PendingTrace import datadog.trace.common.writer.ListWriter import io.opentracing.Scope import io.opentracing.Span +import io.opentracing.noop.NoopSpan import spock.lang.Specification import spock.lang.Subject import spock.lang.Unroll @@ -25,6 +26,21 @@ class ScopeManagerTest extends Specification { scopeManager.tlsScope.remove() } + def "non-ddspan activation results in a simple scope"() { + when: + def scope = scopeManager.activate(NoopSpan.INSTANCE, true) + + then: + scopeManager.active() == scope + scope instanceof SimpleScope + + when: + scope.close() + + then: + scopeManager.active() == null + } + def "threadlocal is empty"() { setup: def builder = tracer.buildSpan("test") diff --git a/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy b/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy index 57748343f0..098e1cf5c0 100644 --- a/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/trace/api/sampling/RateByServiceSamplerTest.groovy @@ -8,6 +8,25 @@ import spock.lang.Specification class RateByServiceSamplerTest extends Specification { + def "invalid rate -> 1"() { + setup: + RateByServiceSampler serviceSampler = new RateByServiceSampler() + ObjectMapper serializer = new ObjectMapper() + String response = '{"rate_by_service": {"service:,env:":' + rate + '}}' + serviceSampler.onResponse("traces", serializer.readTree(response)) + expect: + serviceSampler.baseSampler.sampleRate == expectedRate + + where: + rate | expectedRate + null | 1 + 1 | 1 + 0 | 1 + -5 | 1 + 5 | 1 + 0.5 | 0.5 + } + def "rate by service name"() { setup: RateByServiceSampler serviceSampler = new RateByServiceSampler() diff --git a/examples/dropwizard-mongo-client/dropwizard-mongo-client.gradle b/examples/dropwizard-mongo-client/dropwizard-mongo-client.gradle index ec91cbaf49..8bca2c85eb 100644 --- a/examples/dropwizard-mongo-client/dropwizard-mongo-client.gradle +++ b/examples/dropwizard-mongo-client/dropwizard-mongo-client.gradle @@ -4,7 +4,6 @@ plugins { apply plugin: 'application' apply from: "${rootDir}/gradle/java.gradle" -apply from: "${rootDir}/gradle/jacoco.gradle" version = 'demo' description = 'dropwizard-mongo-client' diff --git a/examples/rest-spark/rest-spark.gradle b/examples/rest-spark/rest-spark.gradle index 7c43ea8ab7..51f1df9525 100644 --- a/examples/rest-spark/rest-spark.gradle +++ b/examples/rest-spark/rest-spark.gradle @@ -4,7 +4,6 @@ plugins { apply plugin: 'application' apply from: "${rootDir}/gradle/java.gradle" -apply from: "${rootDir}/gradle/jacoco.gradle" version = 'demo' description = 'rest-spark' diff --git a/examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle b/examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle index 487dc27600..fd10a34660 100644 --- a/examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle +++ b/examples/spring-boot-jdbc-redis/spring-boot-jdbc-redis.gradle @@ -3,7 +3,6 @@ plugins { } apply from: "${rootDir}/gradle/java.gradle" -apply from: "${rootDir}/gradle/jacoco.gradle" version = 'demo' description = 'spring-boot-jdbc-redis' diff --git a/gradle/jacoco.gradle b/gradle/jacoco.gradle index 738cd21bcc..2778b0602a 100644 --- a/gradle/jacoco.gradle +++ b/gradle/jacoco.gradle @@ -1,5 +1,9 @@ apply plugin: "jacoco" +jacoco { + toolVersion = "0.8.0" +} + jacocoTestReport { dependsOn test reports { @@ -9,11 +13,21 @@ jacocoTestReport { } } -project.ext.whitelistedBranchClasses = [] -project.ext.whitelistedInstructionClasses = [] +if (project.parent.hasProperty("whitelistedBranchClasses")) { + project.ext.whitelistedBranchClasses = parent.whitelistedBranchClasses +} else { + project.ext.whitelistedBranchClasses = [] +} -project.ext.minimumBranchCoverage = 0.6 -project.ext.minimumInstructionCoverage = 0.6 +if (project.parent.hasProperty("whitelistedInstructionClasses")) { + project.ext.whitelistedInstructionClasses = parent.whitelistedInstructionClasses +} else { + project.ext.whitelistedInstructionClasses = [] +} + +// defaults can be overridden per project: +project.ext.minimumBranchCoverage = 0.9 +project.ext.minimumInstructionCoverage = 0.9 afterEvaluate { jacocoTestCoverageVerification { diff --git a/gradle/java.gradle b/gradle/java.gradle index 7ce398b22a..2e3db80ac0 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -153,6 +153,7 @@ tasks.withType(Test) { apply from: "$rootDir/gradle/checkstyle.gradle" apply from: "$rootDir/gradle/codenarc.gradle" +apply from: "$rootDir/gradle/jacoco.gradle" plugins.withType(BasePlugin) { project.afterEvaluate {