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