From ca32835ff7f20f256d1043cb84a43808a1351139 Mon Sep 17 00:00:00 2001 From: Guillaume Polaert Date: Tue, 23 May 2017 17:40:18 +0200 Subject: [PATCH] Adding ES instrumentation --- dd-java-agent/pom.xml | 490 ++++++++++-------- dd-java-agent/src/main/resources/otarules.btm | 56 +- .../ElasticSearchInstrumentationTest.java | 116 +++++ 3 files changed, 436 insertions(+), 226 deletions(-) create mode 100644 dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ElasticSearchInstrumentationTest.java diff --git a/dd-java-agent/pom.xml b/dd-java-agent/pom.xml index 51f9d5878c..be689e8001 100644 --- a/dd-java-agent/pom.xml +++ b/dd-java-agent/pom.xml @@ -1,244 +1,286 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - - com.datadoghq - dd-trace-java - 1.0-SNAPSHOT - + + com.datadoghq + dd-trace-java + 1.0-SNAPSHOT + - dd-java-agent - jar - dd-java-agent + dd-java-agent + jar + dd-java-agent - - 1.0-SNAPSHOT - 0.0.12 - 0.0.8 - 0.0.1 - 0.0.4 - 0.22.0 - 1.8 - + + 1.0-SNAPSHOT + 0.0.12 + 0.0.8 + 0.0.1 + 0.0.4 + 0.22.0 + 1.8 + - + - - - com.datadoghq - dd-trace - ${ot.dd-trace.version} - + + + com.datadoghq + dd-trace + ${ot.dd-trace.version} + - - - io.opentracing.contrib - opentracing-agent - ${ot.agent.version} - - - io.opentracing.contrib - opentracing-agent-rules-java-okhttp - ${ot.agent.version} - - - io.opentracing.contrib - opentracing-agent-rules-java-web-servlet-filter - ${ot.agent.version} - + + + io.opentracing.contrib + opentracing-agent + ${ot.agent.version} + + + io.opentracing.contrib + opentracing-agent-rules-java-okhttp + ${ot.agent.version} + + + io.opentracing.contrib + opentracing-agent-rules-java-web-servlet-filter + ${ot.agent.version} + - - - org.reflections - reflections - 0.9.11 - + + + org.reflections + reflections + 0.9.11 + - - - io.opentracing.contrib - opentracing-web-servlet-filter - ${ot.contrib.webservlet.version} - - - io.opentracing.contrib - opentracing-mongo-driver - ${ot.contrib.mongo.version} - - - org.mongodb - mongodb-driver-async - - - org.mongodb - mongo-java-driver - - - - - - io.opentracing.contrib - opentracing-jdbc - 0.0.1 - + + + io.opentracing.contrib + opentracing-web-servlet-filter + ${ot.contrib.webservlet.version} + + + io.opentracing.contrib + opentracing-mongo-driver + ${ot.contrib.mongo.version} + + + org.mongodb + mongodb-driver-async + + + org.mongodb + mongo-java-driver + + + + + + io.opentracing.contrib + opentracing-jdbc + 0.0.1 + - - - io.opentracing.contrib - opentracing-okhttp3 - ${ot.contrib.okhttp.version} - + + + io.opentracing.contrib + opentracing-okhttp3 + ${ot.contrib.okhttp.version} + - - + + - - - io.opentracing.contrib - opentracing-aws-sdk - 0.0.1 - - - com.amazonaws - aws-java-sdk - - - + + + io.opentracing.contrib + opentracing-aws-sdk + 0.0.1 + + + com.amazonaws + aws-java-sdk + + + - - - io.opentracing - opentracing-mock - ${opentracing.version} - test - - - junit - junit - 4.12 - test - - - org.assertj - assertj-core - 3.6.2 - test - + + + io.opentracing.contrib + opentracing-elasticsearch-client + 0.0.1 + + + + + + + - - - org.mongodb - mongo-java-driver - 3.4.2 - test - - - - com.squareup.okhttp3 - okhttp - 3.6.0 - test - - - - org.eclipse.jetty - jetty-server - 9.4.1.v20170120 - test - - - org.eclipse.jetty - jetty-servlet - 9.4.1.v20170120 - test - + + + io.opentracing + opentracing-mock + ${opentracing.version} + test + + + junit + junit + 4.12 + test + + + org.assertj + assertj-core + 3.6.2 + test + - - - org.apache.tomcat.embed - tomcat-embed-core - 8.0.41 - test - - - org.apache.tomcat.embed - tomcat-embed-jasper - 8.0.41 - test - + + + org.mongodb + mongo-java-driver + 3.4.2 + test + + + + com.squareup.okhttp3 + okhttp + 3.6.0 + test + + + + org.eclipse.jetty + jetty-server + 9.4.1.v20170120 + test + + + org.eclipse.jetty + jetty-servlet + 9.4.1.v20170120 + test + - - - com.amazonaws - aws-java-sdk - 1.11.132 - test - + + + org.apache.tomcat.embed + tomcat-embed-core + 8.0.41 + test + + + org.apache.tomcat.embed + tomcat-embed-jasper + 8.0.41 + test + - - - ${project.artifactId} - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.1 - - ${java.version} - ${java.version} - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.20 - - -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar - - *Test.java - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - - package - - shade - - - - - - - - - - - otarules.btm - - - - io.opentracing.contrib.agent.AnnotationsTracingAgent - io.opentracing.contrib.agent.AnnotationsTracingAgent - true - true - ./${project.artifactId}.jar - - - - - - - - - + + + com.amazonaws + aws-java-sdk + 1.11.132 + 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 + + + io.opentracing.contrib + opentracing-spanmanager + 0.0.5 + test + + + + + ${project.artifactId} + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + + -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar + + + *Test.java + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + package + + shade + + + + + + + + + + + otarules.btm + + + + io.opentracing.contrib.agent.AnnotationsTracingAgent + io.opentracing.contrib.agent.AnnotationsTracingAgent + + true + true + ./${project.artifactId}.jar + + + + + + + + + \ 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 0518c505ff..dd02e3dc1e 100644 --- a/dd-java-agent/src/main/resources/otarules.btm +++ b/dd-java-agent/src/main/resources/otarules.btm @@ -16,8 +16,6 @@ ENDRULE # -------------------------------------------------------- - - # -------------------------------------------------------- # Instrument AWS client RULE AWS SDK Client instrumentation 1 @@ -44,3 +42,57 @@ DO $this.requestHandlers.add(0, requestTracerHandler); 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/ElasticSearchInstrumentationTest.java b/dd-java-agent/src/test/java/com/datadoghq/trace/instrument/ElasticSearchInstrumentationTest.java new file mode 100644 index 0000000000..cb3462e2c2 --- /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); + } + } + +}