Fixing ES

This commit is contained in:
Guillaume Polaert 2017-06-15 14:30:16 +02:00
parent e632705140
commit e5887e24dc
5 changed files with 114 additions and 35 deletions

View File

@ -201,7 +201,7 @@
<!-- <reuseForks>false</reuseForks> --> <!-- <reuseForks>false</reuseForks> -->
<argLine> <argLine>
-javaagent:${M2_REPO}/com/datadoghq/dd-java-agent/${project.version}/dd-java-agent-${project.version}.jar -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
</argLine> </argLine>
<!-- <workingDirectory>target/FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory> --> <!-- <workingDirectory>target/FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory> -->
</configuration> </configuration>

View File

@ -1,23 +1,104 @@
//package com.datadoghq.trace.instrument; package com.datadoghq.trace.instrument;
//
//import io.opentracing.contrib.elasticsearch.TracingPreBuiltTransportClient; import com.datadoghq.trace.DDTracer;
//import org.elasticsearch.client.transport.TransportClient; import com.datadoghq.trace.writer.ListWriter;
//import org.elasticsearch.common.settings.Settings; import io.opentracing.util.GlobalTracer;
//import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.elasticsearch.action.index.IndexResponse;
//import org.junit.Test; import org.elasticsearch.client.transport.TransportClient;
// import org.elasticsearch.common.settings.Settings;
//import static org.assertj.core.api.Assertions.assertThat; import org.elasticsearch.common.transport.InetSocketTransportAddress;
// import org.elasticsearch.node.InternalSettingsPreparer;
//public class ElasticsearchIntegrationTest { import org.elasticsearch.node.Node;
// import org.elasticsearch.node.NodeValidationException;
// import org.elasticsearch.plugins.Plugin;
// @Test import org.elasticsearch.transport.Netty4Plugin;
// public void test() { import org.elasticsearch.transport.client.PreBuiltTransportClient;
// import org.junit.AfterClass;
// import org.junit.BeforeClass;
// TransportClient client = new PreBuiltTransportClient(Settings.EMPTY); import org.junit.Test;
//
//// client.get 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<Class<? extends Plugin>> classpathPlugins) {
super(InternalSettingsPreparer.prepareEnvironment(settings, null), classpathPlugins);
}
}
}

View File

@ -8,9 +8,7 @@ writer:
# DDAgentWriter: Spans are forwarding to a Datadog Agent # DDAgentWriter: Spans are forwarding to a Datadog Agent
# - Param 'host': the hostname where the DD Agent running (default: localhost) # - Param 'host': the hostname where the DD Agent running (default: localhost)
# - Param 'port': the port to reach the DD Agent (default: 8126) # - Param 'port': the port to reach the DD Agent (default: 8126)
type: DDAgentWriter type: ListWriter
host: localhost
port: 8126
# The sampler to use. # The sampler to use.
# Could be: AllSampler (default) or RateSampler # Could be: AllSampler (default) or RateSampler

View File

@ -3,7 +3,6 @@ package io.opentracing.contrib.agent.helper;
import io.opentracing.ActiveSpan; import io.opentracing.ActiveSpan;
import io.opentracing.Span; import io.opentracing.Span;
import io.opentracing.Tracer; import io.opentracing.Tracer;
import io.opentracing.contrib.elasticsearch.TracingPreBuiltTransportClient;
import io.opentracing.contrib.elasticsearch.TracingResponseListener; import io.opentracing.contrib.elasticsearch.TracingResponseListener;
import io.opentracing.tag.Tags; import io.opentracing.tag.Tags;
import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListener;
@ -33,6 +32,9 @@ public class ElasticsearchHelper extends DDTracingHelper<ActionListener> {
@Override @Override
protected ActionListener doPatch(ActionListener listener) throws Exception { 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"); Tracer.SpanBuilder spanBuilder = this.tracer.buildSpan(request.getClass().getSimpleName()).ignoreActiveSpan().withTag(Tags.SPAN_KIND.getKey(), "client");
ActiveSpan parentSpan = this.tracer.activeSpan(); ActiveSpan parentSpan = this.tracer.activeSpan();
@ -43,7 +45,8 @@ public class ElasticsearchHelper extends DDTracingHelper<ActionListener> {
Span span = spanBuilder.startManual(); Span span = spanBuilder.startManual();
Class<?> clazz = Class.forName("io.opentracing.contrib.elasticsearch.SpanDecorator"); 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); method.invoke(null, span);
ActionListener newListener = new TracingResponseListener(listener, span); ActionListener newListener = new TracingResponseListener(listener, span);

View File

@ -38,19 +38,16 @@ ENDRULE
# Instrument Elasticsearch Transport Client # Instrument Elasticsearch Transport Client
# ========================================== # ==========================================
RULE elasticsearch RULE elasticsearch
CLASS org.elasticsearch.transport.client.TransportClient INTERFACE org.elasticsearch.client.ElasticsearchClient
METHOD doExecute METHOD execute(org.elasticsearch.action.Action,org.elasticsearch.action.ActionRequest,org.elasticsearch.action.ActionListener)
HELPER io.opentracing.contrib.agent.helper.ElasticsearchHelper HELPER io.opentracing.contrib.agent.helper.ElasticsearchHelper
AT ENTRY AT ENTRY
IF TRUE IF $# == 3 AND NOT $3.getClass().getCanonicalName().equals("io.opentracing.contrib.elasticsearch.TracingResponseListener")
DO DO
registerArgs($1); registerArgs($1);
$3 = patch($3); $3 = patch($3);
ENDRULE ENDRULE
#PreBuiltTransportClient(Settings settings, Collection<Class<? extends Plugin>> plugins, HostFailureListener hostFailureListener)
# Instrument Cassandra client # Instrument Cassandra client
# =========================== # ===========================
RULE cassandra RULE cassandra