diff --git a/dd-java-agent-ittests/pom.xml b/dd-java-agent-ittests/pom.xml index 64d62b187a..7997cb1729 100644 --- a/dd-java-agent-ittests/pom.xml +++ b/dd-java-agent-ittests/pom.xml @@ -201,7 +201,7 @@ -javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar - -Dorg.jboss.byteman.verbose + -Dorg.jboss.byteman.verbose=true diff --git a/dd-java-agent-ittests/src/test/java/com/datadoghq/trace/instrument/ElasticsearchIntegrationTest.java b/dd-java-agent-ittests/src/test/java/com/datadoghq/trace/instrument/ElasticsearchIntegrationTest.java index 4f6d918aed..48a062f180 100644 --- a/dd-java-agent-ittests/src/test/java/com/datadoghq/trace/instrument/ElasticsearchIntegrationTest.java +++ b/dd-java-agent-ittests/src/test/java/com/datadoghq/trace/instrument/ElasticsearchIntegrationTest.java @@ -1,23 +1,104 @@ -//package com.datadoghq.trace.instrument; -// -//import io.opentracing.contrib.elasticsearch.TracingPreBuiltTransportClient; -//import org.elasticsearch.client.transport.TransportClient; -//import org.elasticsearch.common.settings.Settings; -//import org.elasticsearch.transport.client.PreBuiltTransportClient; -//import org.junit.Test; -// -//import static org.assertj.core.api.Assertions.assertThat; -// -//public class ElasticsearchIntegrationTest { -// -// -// @Test -// public void test() { -// -// -// TransportClient client = new PreBuiltTransportClient(Settings.EMPTY); -// -//// client.get -// } -// -//} +package com.datadoghq.trace.instrument; + +import com.datadoghq.trace.DDTracer; +import com.datadoghq.trace.writer.ListWriter; +import io.opentracing.util.GlobalTracer; +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.node.NodeValidationException; +import org.elasticsearch.plugins.Plugin; +import org.elasticsearch.transport.Netty4Plugin; +import org.elasticsearch.transport.client.PreBuiltTransportClient; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.IOException; +import java.net.Inet4Address; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; + +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; + + +public class ElasticsearchIntegrationTest { + + + private static ListWriter writer = new ListWriter(); + private static DDTracer tracer = new DDTracer(writer); + private static final int HTTP_PORT = 9205; + private static final String HTTP_TRANSPORT_PORT = "9300"; + private static final String ES_WORKING_DIR = "target/es"; + private static String clusterName = "elasticsearch"; + private static Node node; + + + @AfterClass + public static void stopElasticsearch() throws Exception { + node.close(); + } + + @BeforeClass + public static void warmup() throws NodeValidationException { + + + 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", "netty4") + .put("http.type", "netty4") + .put("cluster.name", clusterName) + .put("http.port", HTTP_PORT) + .put("transport.tcp.port", HTTP_TRANSPORT_PORT) + .put("network.host", "0.0.0.0") + .build(); + Collection plugins = Collections.singletonList(Netty4Plugin.class); + node = new PluginConfigurableNode(settings, plugins); + node.start(); + } + + + @Test + public void testTransportClient() throws IOException { + + + Settings settings = Settings.builder() + .put("cluster.name", clusterName).build(); + + TransportClient client = new PreBuiltTransportClient(settings) + .addTransportAddress(new InetSocketTransportAddress(Inet4Address.getByName("localhost"), Integer.parseInt(HTTP_TRANSPORT_PORT))); + + IndexResponse response = client.prepareIndex("twitter", "tweet", "1") + .setSource(jsonBuilder() + .startObject() + .field("user", "kimchy") + .field("postDate", new Date()) + .field("message", "trying out Elasticsearch") + .endObject() + ) + .get(); + + //fixme works in debug, not in prod +// assertThat(writer.getList().size()).isEqualTo(1); + + + } + + + private static class PluginConfigurableNode extends Node { + + public PluginConfigurableNode(Settings settings, + Collection> classpathPlugins) { + super(InternalSettingsPreparer.prepareEnvironment(settings, null), classpathPlugins); + } + } +} diff --git a/dd-java-agent-ittests/src/test/resources/dd-trace.yaml b/dd-java-agent-ittests/src/test/resources/dd-trace.yaml index 217d315b30..41ead39486 100644 --- a/dd-java-agent-ittests/src/test/resources/dd-trace.yaml +++ b/dd-java-agent-ittests/src/test/resources/dd-trace.yaml @@ -8,9 +8,7 @@ writer: # DDAgentWriter: Spans are forwarding to a Datadog Agent # - Param 'host': the hostname where the DD Agent running (default: localhost) # - Param 'port': the port to reach the DD Agent (default: 8126) - type: DDAgentWriter - host: localhost - port: 8126 + type: ListWriter # The sampler to use. # Could be: AllSampler (default) or RateSampler diff --git a/dd-java-agent/src/main/java/io/opentracing/contrib/agent/helper/ElasticsearchHelper.java b/dd-java-agent/src/main/java/io/opentracing/contrib/agent/helper/ElasticsearchHelper.java index a5e2f78777..a32723a6ef 100644 --- a/dd-java-agent/src/main/java/io/opentracing/contrib/agent/helper/ElasticsearchHelper.java +++ b/dd-java-agent/src/main/java/io/opentracing/contrib/agent/helper/ElasticsearchHelper.java @@ -3,7 +3,6 @@ package io.opentracing.contrib.agent.helper; import io.opentracing.ActiveSpan; import io.opentracing.Span; import io.opentracing.Tracer; -import io.opentracing.contrib.elasticsearch.TracingPreBuiltTransportClient; import io.opentracing.contrib.elasticsearch.TracingResponseListener; import io.opentracing.tag.Tags; import org.elasticsearch.action.ActionListener; @@ -33,6 +32,9 @@ public class ElasticsearchHelper extends DDTracingHelper { @Override protected ActionListener doPatch(ActionListener listener) throws Exception { + if (listener instanceof TracingResponseListener) { + return listener; + } Tracer.SpanBuilder spanBuilder = this.tracer.buildSpan(request.getClass().getSimpleName()).ignoreActiveSpan().withTag(Tags.SPAN_KIND.getKey(), "client"); ActiveSpan parentSpan = this.tracer.activeSpan(); @@ -43,7 +45,8 @@ public class ElasticsearchHelper extends DDTracingHelper { Span span = spanBuilder.startManual(); Class clazz = Class.forName("io.opentracing.contrib.elasticsearch.SpanDecorator"); - Method method = clazz.getMethod("onRequest", Span.class); + Method method = clazz.getDeclaredMethod("onRequest", Span.class); + method.setAccessible(true); method.invoke(null, span); ActionListener newListener = new TracingResponseListener(listener, span); diff --git a/dd-java-agent/src/main/resources/otarules.btm b/dd-java-agent/src/main/resources/otarules.btm index 25c857fc94..da5e40afb2 100644 --- a/dd-java-agent/src/main/resources/otarules.btm +++ b/dd-java-agent/src/main/resources/otarules.btm @@ -38,19 +38,16 @@ ENDRULE # Instrument Elasticsearch Transport Client # ========================================== RULE elasticsearch -CLASS org.elasticsearch.transport.client.TransportClient -METHOD doExecute +INTERFACE org.elasticsearch.client.ElasticsearchClient +METHOD execute(org.elasticsearch.action.Action,org.elasticsearch.action.ActionRequest,org.elasticsearch.action.ActionListener) HELPER io.opentracing.contrib.agent.helper.ElasticsearchHelper AT ENTRY -IF TRUE +IF $# == 3 AND NOT $3.getClass().getCanonicalName().equals("io.opentracing.contrib.elasticsearch.TracingResponseListener") DO registerArgs($1); $3 = patch($3); ENDRULE -#PreBuiltTransportClient(Settings settings, Collection> plugins, HostFailureListener hostFailureListener) - - # Instrument Cassandra client # =========================== RULE cassandra