From 20df3aa18e3f13bbc15cb2b1b160c5d61dd228de Mon Sep 17 00:00:00 2001 From: Tyler Benson Date: Thu, 25 Apr 2019 16:14:51 -0700 Subject: [PATCH] Add HttpAsyncClient to Elasticsearch for verification. --- .../agent/decorator/HttpClientDecorator.java | 3 ++- .../elasticsearch/rest-5/rest-5.gradle | 4 +--- .../groovy/Elasticsearch6RestClientTest.groovy | 17 ++++++++++++++++- .../groovy/Elasticsearch5RestClientTest.groovy | 17 ++++++++++++++++- .../elasticsearch/rest-6.4/rest-6.4.gradle | 6 +++--- .../groovy/Elasticsearch6RestClientTest.groovy | 17 ++++++++++++++++- .../groovy/Elasticsearch6RestClientTest.groovy | 17 ++++++++++++++++- .../transport-2/transport-2.gradle | 1 + .../transport-5.3/transport-5.3.gradle | 2 ++ .../transport-5/transport-5.gradle | 7 ++----- .../transport-6/transport-6.gradle | 6 ++---- 11 files changed, 77 insertions(+), 20 deletions(-) diff --git a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/decorator/HttpClientDecorator.java b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/decorator/HttpClientDecorator.java index ab3e25d022..9e8562ad32 100644 --- a/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/decorator/HttpClientDecorator.java +++ b/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/decorator/HttpClientDecorator.java @@ -34,7 +34,8 @@ public abstract class HttpClientDecorator extends ClientDecor Tags.HTTP_METHOD.set(span, method(request)); Tags.HTTP_URL.set(span, url(request)); Tags.PEER_HOSTNAME.set(span, hostname(request)); - Tags.PEER_PORT.set(span, port(request)); + final Integer port = port(request); + Tags.PEER_PORT.set(span, port != null && port > 0 ? port : null); if (Config.get().isHttpClientSplitByDomain()) { span.setTag(DDTags.SERVICE_NAME, hostname(request)); diff --git a/dd-java-agent/instrumentation/elasticsearch/rest-5/rest-5.gradle b/dd-java-agent/instrumentation/elasticsearch/rest-5/rest-5.gradle index 6cb7286cea..002f2ca18d 100644 --- a/dd-java-agent/instrumentation/elasticsearch/rest-5/rest-5.gradle +++ b/dd-java-agent/instrumentation/elasticsearch/rest-5/rest-5.gradle @@ -38,10 +38,8 @@ dependencies { implementation deps.autoservice testCompile project(':dd-java-agent:testing') - // Include httpclient instrumentation for testing because it is a dependency for elasticsearch-rest-client. - // It doesn't actually work though. They use HttpAsyncClient, which isn't currently instrumented. - // TODO: add Apache's HttpAsyncClient instrumentation when that is complete. testCompile project(':dd-java-agent:instrumentation:apache-httpclient-4') + testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4') testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' diff --git a/dd-java-agent/instrumentation/elasticsearch/rest-5/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy b/dd-java-agent/instrumentation/elasticsearch/rest-5/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy index 661c563a62..06b2c4e30e 100644 --- a/dd-java-agent/instrumentation/elasticsearch/rest-5/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy +++ b/dd-java-agent/instrumentation/elasticsearch/rest-5/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy @@ -78,7 +78,7 @@ class Elasticsearch6RestClientTest extends AgentTestRunner { result.status == "green" assertTraces(1) { - trace(0, 1) { + trace(0, 2) { span(0) { serviceName "elasticsearch" resourceName "GET _cluster/health" @@ -96,6 +96,21 @@ class Elasticsearch6RestClientTest extends AgentTestRunner { defaultTags() } } + span(1) { + serviceName "elasticsearch" + resourceName "GET _cluster/health" + operationName "http.request" + spanType DDSpanTypes.HTTP_CLIENT + childOf span(0) + tags { + "$Tags.COMPONENT.key" "apache-httpasyncclient" + "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT + "$Tags.HTTP_METHOD.key" "GET" + "$Tags.HTTP_URL.key" "_cluster/health" + "$Tags.HTTP_STATUS.key" 200 + defaultTags() + } + } } } } diff --git a/dd-java-agent/instrumentation/elasticsearch/rest-5/src/test/groovy/Elasticsearch5RestClientTest.groovy b/dd-java-agent/instrumentation/elasticsearch/rest-5/src/test/groovy/Elasticsearch5RestClientTest.groovy index 5d297c357a..927eb1ff57 100644 --- a/dd-java-agent/instrumentation/elasticsearch/rest-5/src/test/groovy/Elasticsearch5RestClientTest.groovy +++ b/dd-java-agent/instrumentation/elasticsearch/rest-5/src/test/groovy/Elasticsearch5RestClientTest.groovy @@ -83,7 +83,7 @@ class Elasticsearch5RestClientTest extends AgentTestRunner { result.status == "green" assertTraces(1) { - trace(0, 1) { + trace(0, 2) { span(0) { serviceName "elasticsearch" resourceName "GET _cluster/health" @@ -101,6 +101,21 @@ class Elasticsearch5RestClientTest extends AgentTestRunner { defaultTags() } } + span(1) { + serviceName "elasticsearch" + resourceName "GET _cluster/health" + operationName "http.request" + spanType DDSpanTypes.HTTP_CLIENT + childOf span(0) + tags { + "$Tags.COMPONENT.key" "apache-httpasyncclient" + "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT + "$Tags.HTTP_METHOD.key" "GET" + "$Tags.HTTP_URL.key" "_cluster/health" + "$Tags.HTTP_STATUS.key" 200 + defaultTags() + } + } } } } diff --git a/dd-java-agent/instrumentation/elasticsearch/rest-6.4/rest-6.4.gradle b/dd-java-agent/instrumentation/elasticsearch/rest-6.4/rest-6.4.gradle index 57e24be1d9..d9cc973e25 100644 --- a/dd-java-agent/instrumentation/elasticsearch/rest-6.4/rest-6.4.gradle +++ b/dd-java-agent/instrumentation/elasticsearch/rest-6.4/rest-6.4.gradle @@ -39,10 +39,10 @@ dependencies { implementation deps.autoservice testCompile project(':dd-java-agent:testing') - // Include httpclient instrumentation for testing because it is a dependency for elasticsearch-rest-client. - // It doesn't actually work though. They use HttpAsyncClient, which isn't currently instrumented. - // TODO: add Apache's HttpAsyncClient instrumentation when that is complete. testCompile project(':dd-java-agent:instrumentation:apache-httpclient-4') + testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4') + // Netty is used, but it adds complexity to the tests since we're using embedded ES. + //testCompile project(':dd-java-agent:instrumentation:netty-4.1') testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' diff --git a/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy b/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy index 7967171399..0176c2c542 100644 --- a/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy +++ b/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy @@ -82,7 +82,7 @@ class Elasticsearch6RestClientTest extends AgentTestRunner { result.status == "green" assertTraces(1) { - trace(0, 1) { + trace(0, 2) { span(0) { serviceName "elasticsearch" resourceName "GET _cluster/health" @@ -100,6 +100,21 @@ class Elasticsearch6RestClientTest extends AgentTestRunner { defaultTags() } } + span(1) { + serviceName "elasticsearch" + resourceName "GET _cluster/health" + operationName "http.request" + spanType DDSpanTypes.HTTP_CLIENT + childOf span(0) + tags { + "$Tags.COMPONENT.key" "apache-httpasyncclient" + "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT + "$Tags.HTTP_METHOD.key" "GET" + "$Tags.HTTP_URL.key" "_cluster/health" + "$Tags.HTTP_STATUS.key" 200 + defaultTags() + } + } } } } diff --git a/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy b/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy index 661c563a62..06b2c4e30e 100644 --- a/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy +++ b/dd-java-agent/instrumentation/elasticsearch/rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy @@ -78,7 +78,7 @@ class Elasticsearch6RestClientTest extends AgentTestRunner { result.status == "green" assertTraces(1) { - trace(0, 1) { + trace(0, 2) { span(0) { serviceName "elasticsearch" resourceName "GET _cluster/health" @@ -96,6 +96,21 @@ class Elasticsearch6RestClientTest extends AgentTestRunner { defaultTags() } } + span(1) { + serviceName "elasticsearch" + resourceName "GET _cluster/health" + operationName "http.request" + spanType DDSpanTypes.HTTP_CLIENT + childOf span(0) + tags { + "$Tags.COMPONENT.key" "apache-httpasyncclient" + "$Tags.SPAN_KIND.key" Tags.SPAN_KIND_CLIENT + "$Tags.HTTP_METHOD.key" "GET" + "$Tags.HTTP_URL.key" "_cluster/health" + "$Tags.HTTP_STATUS.key" 200 + defaultTags() + } + } } } } diff --git a/dd-java-agent/instrumentation/elasticsearch/transport-2/transport-2.gradle b/dd-java-agent/instrumentation/elasticsearch/transport-2/transport-2.gradle index c5ab3b9c88..d03188c48b 100644 --- a/dd-java-agent/instrumentation/elasticsearch/transport-2/transport-2.gradle +++ b/dd-java-agent/instrumentation/elasticsearch/transport-2/transport-2.gradle @@ -36,6 +36,7 @@ dependencies { // Ensure no cross interference testCompile project(':dd-java-agent:instrumentation:elasticsearch:rest-5') testCompile project(':dd-java-agent:instrumentation:elasticsearch:transport-5') + testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4') testCompile group: 'org.elasticsearch', name: 'elasticsearch', version: '2.0.0' diff --git a/dd-java-agent/instrumentation/elasticsearch/transport-5.3/transport-5.3.gradle b/dd-java-agent/instrumentation/elasticsearch/transport-5.3/transport-5.3.gradle index 8ba24cf665..9843a6335a 100644 --- a/dd-java-agent/instrumentation/elasticsearch/transport-5.3/transport-5.3.gradle +++ b/dd-java-agent/instrumentation/elasticsearch/transport-5.3/transport-5.3.gradle @@ -40,6 +40,8 @@ dependencies { implementation deps.autoservice testCompile project(':dd-java-agent:testing') + testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4') + testCompile project(':dd-java-agent:instrumentation:netty-4.1') testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' diff --git a/dd-java-agent/instrumentation/elasticsearch/transport-5/transport-5.gradle b/dd-java-agent/instrumentation/elasticsearch/transport-5/transport-5.gradle index 146a1d12cb..7abb2e80cd 100644 --- a/dd-java-agent/instrumentation/elasticsearch/transport-5/transport-5.gradle +++ b/dd-java-agent/instrumentation/elasticsearch/transport-5/transport-5.gradle @@ -42,11 +42,8 @@ dependencies { testCompile project(':dd-java-agent:testing') // Ensure no cross interference testCompile project(':dd-java-agent:instrumentation:elasticsearch:rest-5') - // Include httpclient instrumentation for testing because it is a dependency for elasticsearch-rest-client. - // It doesn't actually work though. They use HttpAsyncClient, which isn't currently instrumented. - // TODO: add HttpAsyncClient instrumentation when that is complete. - testCompile project(':dd-java-agent:instrumentation:apache-httpclient-4') - // TODO: add netty instrumentation when that is complete. + testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4') + testCompile project(':dd-java-agent:instrumentation:netty-4.1') testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' diff --git a/dd-java-agent/instrumentation/elasticsearch/transport-6/transport-6.gradle b/dd-java-agent/instrumentation/elasticsearch/transport-6/transport-6.gradle index 185d49faf5..ac4bd215a1 100644 --- a/dd-java-agent/instrumentation/elasticsearch/transport-6/transport-6.gradle +++ b/dd-java-agent/instrumentation/elasticsearch/transport-6/transport-6.gradle @@ -42,10 +42,8 @@ dependencies { testCompile project(':dd-java-agent:testing') // Ensure no cross interference testCompile project(':dd-java-agent:instrumentation:elasticsearch:rest-5') - // Include httpclient instrumentation for testing because it is a dependency for elasticsearch-rest-client. - // It doesn't actually work though. They use HttpAsyncClient, which isn't currently instrumented. - // TODO: add HttpAsyncClient instrumentation when that is complete. - testCompile project(':dd-java-agent:instrumentation:apache-httpclient-4') + testCompile project(':dd-java-agent:instrumentation:apache-httpasyncclient-4') + testCompile project(':dd-java-agent:instrumentation:netty-4.1') testCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '6.0.0' testCompile group: 'org.elasticsearch.client', name: 'transport', version: '6.0.0'