diff --git a/dd-java-agent/dependency-reduced-pom.xml b/dd-java-agent/dependency-reduced-pom.xml index cf64aaf30c..a71706c4b4 100644 --- a/dd-java-agent/dependency-reduced-pom.xml +++ b/dd-java-agent/dependency-reduced-pom.xml @@ -23,10 +23,17 @@ maven-surefire-plugin 2.20 - -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar *Test.java + + ElasticSearchInstrumentationTest.java + + 3 + false + -Xmx500m -Xms500m -XX:MaxPermSize=256m + -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar + target/FORK_DIRECTORY_${surefire.forkNumber} @@ -63,26 +70,6 @@ - - org.apache.httpcomponents - httpclient - 4.5.3 - test - - - httpcore - org.apache.httpcomponents - - - commons-logging - commons-logging - - - commons-codec - commons-codec - - - io.opentracing opentracing-mock @@ -113,18 +100,6 @@ 3.4.2 test - - com.squareup.okhttp3 - okhttp - 3.6.0 - test - - - okio - com.squareup.okio - - - org.eclipse.jetty jetty-server @@ -185,6 +160,10 @@ 1.11.132 test + + httpclient + org.apache.httpcomponents + aws-java-sdk-athena com.amazonaws @@ -571,6 +550,82 @@ + + com.squareup.okhttp3 + okhttp + 3.6.0 + test + + + okio + com.squareup.okio + + + + + org.apache.httpcomponents + httpclient + 4.5.3 + test + + + httpcore + org.apache.httpcomponents + + + commons-logging + commons-logging + + + commons-codec + commons-codec + + + + + org.elasticsearch.client + transport + 5.4.0 + test + + + elasticsearch + org.elasticsearch + + + transport-netty3-client + org.elasticsearch.plugin + + + transport-netty4-client + org.elasticsearch.plugin + + + reindex-client + org.elasticsearch.plugin + + + lang-mustache-client + org.elasticsearch.plugin + + + percolator-client + org.elasticsearch.plugin + + + + + org.apache.logging.log4j + log4j-api + 2.7 + test + + + org.apache.logging.log4j + log4j-core + 2.7 + test + 0.22.0 diff --git a/dd-java-agent/pom.xml b/dd-java-agent/pom.xml index 0042e959c4..66070cd43a 100644 --- a/dd-java-agent/pom.xml +++ b/dd-java-agent/pom.xml @@ -90,7 +90,10 @@ opentracing-okhttp3 ${ot.contrib.okhttp.version} - + + com.squareup.okhttp3 + okhttp + @@ -112,12 +115,33 @@ io.opentracing.contrib opentracing-apache-httpclient 0.0.1 + + + org.apache.httpcomponents + httpclient + + + + - org.apache.httpcomponents - httpclient - 4.5.3 - test + io.opentracing.contrib + opentracing-elasticsearch-client + 0.0.1 + + + org.apache.logging.log4j + log4j-core + + + org.elasticsearch.client + transport + + + org.apache.logging.log4j + log4j-api + + @@ -147,13 +171,7 @@ 3.4.2 test - - - com.squareup.okhttp3 - okhttp - 3.6.0 - test - + org.eclipse.jetty @@ -188,6 +206,48 @@ aws-java-sdk 1.11.132 test + + + org.apache.httpcomponents + httpclient + + + + + + + com.squareup.okhttp3 + okhttp + 3.6.0 + test + + + + + org.apache.httpcomponents + httpclient + 4.5.3 + test + + + + + org.elasticsearch.client + transport + 5.4.0 + test + + + org.apache.logging.log4j + log4j-api + 2.7 + test + + + org.apache.logging.log4j + log4j-core + 2.7 + test @@ -208,10 +268,17 @@ maven-surefire-plugin 2.20 - -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar *Test.java + + ElasticSearchInstrumentationTest.java + + 3 + false + -Xmx500m -Xms500m -XX:MaxPermSize=256m + -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar + target/FORK_DIRECTORY_${surefire.forkNumber} diff --git a/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java b/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java index d7dee776ca..f1bb4cac50 100644 --- a/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java +++ b/dd-java-agent/src/main/java/io/opentracing/contrib/agent/TraceAnnotationsManager.java @@ -41,7 +41,12 @@ public class TraceAnnotationsManager extends OpenTracingManager{ public static void initialize(Retransformer trans) throws Exception { transformer = trans; OpenTracingManager.initialize(trans); - loadRules(ClassLoader.getSystemClassLoader()); + OpenTracingManager.loadRules(ClassLoader.getSystemClassLoader()); + + String value = System.getProperty("javaagent.enableAnnotations","false"); + if("true".equalsIgnoreCase(value)){ + loadRules(ClassLoader.getSystemClassLoader()); + } } /** @@ -50,8 +55,6 @@ public class TraceAnnotationsManager extends OpenTracingManager{ * @param classLoader */ public static void loadRules(ClassLoader classLoader) { - OpenTracingManager.loadRules(classLoader); - Reflections reflections = new Reflections(new ConfigurationBuilder() .forPackages("/") .filterInputsBy(new FilterBuilder().include(".*\\.class")) diff --git a/dd-java-agent/src/main/resources/logback.xml b/dd-java-agent/src/main/resources/logback.xml new file mode 100644 index 0000000000..f8fbe556c0 --- /dev/null +++ b/dd-java-agent/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file diff --git a/dd-java-agent/src/main/resources/otarules.btm b/dd-java-agent/src/main/resources/otarules.btm index e812100043..949e1706ed 100644 --- a/dd-java-agent/src/main/resources/otarules.btm +++ b/dd-java-agent/src/main/resources/otarules.btm @@ -14,7 +14,6 @@ DO ENDRULE # -------------------------------------------------------- - # Instrument AWS client RULE AWS SDK Client instrumentation 1 CLASS ^com.amazonaws.client.builder.AwsClientBuilder @@ -39,8 +38,8 @@ IF $this.requestHandlers != null AND $this.requestHandlers.get(0).getClass().get DO $this.requestHandlers.add(0, requestTracerHandler); ENDRULE -# -------------------------------------------------------- +# -------------------------------------------------------- # Instrument Apache HTTP Client RULE Apache HTTP Client instrumentation CLASS org.apache.http.impl.client.HttpClientBuilder @@ -56,3 +55,55 @@ IF TRUE DO return tracingClientExec; ENDRULE + +# -------------------------------------------------------- +# Instrument Elasticsearch client +RULE Elasticsearch Client instrumentation 1 +CLASS org.elasticsearch.client.RestClientBuilder +METHOD build() +BIND + callback:io.opentracing.contrib.elasticsearch.TracingHttpClientConfigCallback = new io.opentracing.contrib.elasticsearch.TracingHttpClientConfigCallback(); +AT ENTRY +IF TRUE +DO + $this.setHttpClientConfigCallback(callback); +ENDRULE + + +RULE Elasticsearch Client instrumentation 2 +CLASS org.elasticsearch.client.transport.TransportClient +METHOD doExecute +HELPER io.opentracing.contrib.agent.OpenTracingHelper +BIND + span:io.opentracing.Span = null; +# decorator:io.opentracing.contrib.elasticsearch.SpanDecorator = io.opentracing.contrib.elasticsearch.SpanDecorator; +AT ENTRY +IF currentSpan() == null +DO + span = getTracer().buildSpan($2.getClass().getSimpleName()) + .asChildOf() + .withTag(io.opentracing.tag.Tags.SPAN_KIND.getKey(), io.opentracing.tag.Tags.SPAN_KIND_CLIENT) + .start(); +# decorator.onRequest(span); + $3 = new io.opentracing.contrib.elasticsearch.TracingResponseListener($3, span); +ENDRULE + + +RULE Elasticsearch Client instrumentation 3 +CLASS org.elasticsearch.client.transport.TransportClient +METHOD doExecute +HELPER io.opentracing.contrib.agent.OpenTracingHelper +BIND + span:io.opentracing.Span = null; +# decorator:io.opentracing.contrib.elasticsearch.SpanDecorator = io.opentracing.contrib.elasticsearch.SpanDecorator; +AT ENTRY +IF currentSpan() != null +DO + span = getTracer().buildSpan($2.getClass().getSimpleName()) + .asChildOf(currentSpan()) + .withTag(io.opentracing.tag.Tags.SPAN_KIND.getKey(), io.opentracing.tag.Tags.SPAN_KIND_CLIENT) + .start(); +# decorator.onRequest(span); + $3 = new io.opentracing.contrib.elasticsearch.TracingResponseListener($3, span); +ENDRULE +# -------------------------------------------------------- diff --git a/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ApacheHTTPClientTest.java b/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ApacheHTTPClientTest.java index 48e28875bc..b99f6057d5 100644 --- a/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ApacheHTTPClientTest.java +++ b/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ApacheHTTPClientTest.java @@ -43,7 +43,6 @@ public class ApacheHTTPClientTest { while ((line = rd.readLine()) != null) { result.append(line); } - System.out.println(result); assertThat(tracer.finishedSpans().size()).isEqualTo(2); } diff --git a/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ElasticSearchInstrumentationTest.java b/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ElasticSearchInstrumentationTest.java new file mode 100644 index 0000000000..92015579ba --- /dev/null +++ b/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ElasticSearchInstrumentationTest.java @@ -0,0 +1,116 @@ +//package com.datadoghq.trace.instrument; +// +//import io.opentracing.Tracer; +//import io.opentracing.contrib.spanmanager.DefaultSpanManager; +//import io.opentracing.mock.MockTracer; +//import io.opentracing.util.GlobalTracer; +//import org.elasticsearch.action.index.IndexRequest; +//import org.elasticsearch.action.index.IndexResponse; +//import org.elasticsearch.client.transport.TransportClient; +//import org.elasticsearch.common.settings.Settings; +//import org.elasticsearch.common.transport.InetSocketTransportAddress; +//import org.elasticsearch.node.InternalSettingsPreparer; +//import org.elasticsearch.node.Node; +//import org.elasticsearch.plugins.Plugin; +//import org.elasticsearch.transport.Netty3Plugin; +//import org.elasticsearch.transport.client.PreBuiltTransportClient; +//import org.junit.*; +// +//import java.io.IOException; +//import java.net.InetAddress; +//import java.util.Collection; +//import java.util.Collections; +//import java.util.Date; +// +//import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +//import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; +// +///** +// * Created by gpolaert on 5/23/17. +// */ +//public class ElasticSearchInstrumentationTest { +// +// +// private static final int HTTP_PORT = 9205; +// private static final String HTTP_TRANSPORT_PORT = "9305"; +// private static final String ES_WORKING_DIR = "target/es"; +// private static String clusterName = "cluster-name"; +// private static Node node; +// private static MockTracer tracer; +// +// @BeforeClass +// public static void startElasticsearch() throws Exception { +// +// tracer = new MockTracer(); +// GlobalTracer.register(tracer); +// +// +// Settings settings = Settings.builder() +// .put("path.home", ES_WORKING_DIR) +// .put("path.data", ES_WORKING_DIR + "/data") +// .put("path.logs", ES_WORKING_DIR + "/logs") +// .put("transport.type", "netty3") +// .put("http.type", "netty3") +// .put("cluster.name", clusterName) +// .put("http.port", HTTP_PORT) +// .put("transport.tcp.port", HTTP_TRANSPORT_PORT) +// .put("network.host", "127.0.0.1") +// .build(); +// Collection plugins = Collections.singletonList(Netty3Plugin.class); +// node = new PluginConfigurableNode(settings, plugins); +// node.start(); +// +// } +// +// @AfterClass +// public static void stopElasticsearch() throws Exception { +// node.close(); +// } +// +// @Before +// public void setUp() { +// DefaultSpanManager.getInstance().activate(tracer.buildSpan("parent").start()); +// } +// +// +// @After +// public void tearDown() { +// DefaultSpanManager.getInstance().current().close(); +// } +// +// @Test +// public void Test() throws IOException { +// +// Settings settings = Settings.builder() +// .put("cluster.name", clusterName).build(); +// +// +// TransportClient client = new PreBuiltTransportClient(settings) +// .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), +// Integer.parseInt(HTTP_TRANSPORT_PORT))); +// +// IndexRequest indexRequest = new IndexRequest("twitter").type("tweet").id("1"). +// source(jsonBuilder() +// .startObject() +// .field("user", "kimchy") +// .field("postDate", new Date()) +// .field("message", "trying out Elasticsearch") +// .endObject() +// ); +// +// IndexResponse indexResponse = client.index(indexRequest).actionGet(); +// +// +// client.close(); +// DefaultSpanManager.getInstance().current().close(); +// assertThat(tracer.finishedSpans().size()).isEqualTo(2); +// } +// +// +// private static class PluginConfigurableNode extends Node { +// public PluginConfigurableNode(Settings settings, Collection> classpathPlugins) { +// super(InternalSettingsPreparer.prepareEnvironment(settings, null), classpathPlugins); +// } +// } +// +//} diff --git a/dd-java-agent/src/test/java/io/opentracing/contrib/agent/TraceAnnotationsManagerTest.java b/dd-java-agent/src/test/java/io/opentracing/contrib/agent/TraceAnnotationsManagerTest.java index 296cfdbfce..a6d367bf82 100644 --- a/dd-java-agent/src/test/java/io/opentracing/contrib/agent/TraceAnnotationsManagerTest.java +++ b/dd-java-agent/src/test/java/io/opentracing/contrib/agent/TraceAnnotationsManagerTest.java @@ -15,6 +15,7 @@ public class TraceAnnotationsManagerTest { @Before public void beforeTest() throws Exception { GlobalTracer.register(tracer); + TraceAnnotationsManager.loadRules(ClassLoader.getSystemClassLoader()); } @Test diff --git a/dd-trace/src/test/resources/logback.xml b/dd-trace/src/test/resources/logback.xml new file mode 100644 index 0000000000..f8fbe556c0 --- /dev/null +++ b/dd-trace/src/test/resources/logback.xml @@ -0,0 +1,16 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file