diff --git a/README.md b/README.md index 5e57354b37..d2f538b145 100644 --- a/README.md +++ b/README.md @@ -214,7 +214,7 @@ Because the automatic instrumentation runs in a different classpath than the ins | Library/Framework | Versions | |---------------------------------------------------------------------------------------------------------------------------------------|--------------------------------| | [Akka HTTP](https://doc.akka.io/docs/akka-http/current/index.html) | 10.0+ | -| [Apache HttpAsyncClient](https://hc.apache.org/index.html) | 4.0+ | +| [Apache HttpAsyncClient](https://hc.apache.org/index.html) | 4.1+ | | [Apache HttpClient](https://hc.apache.org/index.html) | 2.0+ | | [Armeria](https://armeria.dev) | 0.99.8+ | | [AsyncHttpClient](https://github.com/AsyncHttpClient/async-http-client) | 1.9+ (not including 2.x yet) | diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/apache-httpasyncclient-4.0-javaagent.gradle b/instrumentation/apache-httpasyncclient-4.0/javaagent/apache-httpasyncclient-4.0-javaagent.gradle deleted file mode 100644 index fb2fc2bed7..0000000000 --- a/instrumentation/apache-httpasyncclient-4.0/javaagent/apache-httpasyncclient-4.0-javaagent.gradle +++ /dev/null @@ -1,14 +0,0 @@ -apply from: "$rootDir/gradle/instrumentation.gradle" - -muzzle { - pass { - group = "org.apache.httpcomponents" - module = "httpasyncclient" - versions = "[4.0,)" - assertInverse = true - } -} - -dependencies { - library group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.0' -} \ No newline at end of file diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java b/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java deleted file mode 100644 index 910f503ef0..0000000000 --- a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.apachehttpasyncclient; - -import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; -import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.Map; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.implementation.bytecode.assign.Assigner; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.http.Header; -import org.apache.http.HttpRequest; - -/** - * Early versions don't copy headers over on redirect. This instrumentation copies our headers over - * manually. Inspired by - * https://github.com/elastic/apm-agent-java/blob/master/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpAsyncClientRedirectInstrumentation.java - */ -public class ApacheHttpClientRedirectInstrumentation implements TypeInstrumentation { - - @Override - public ElementMatcher classLoaderOptimization() { - return hasClassesNamed("org.apache.http.client.RedirectStrategy"); - } - - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("org.apache.http.client.RedirectStrategy")); - } - - @Override - public Map, String> transformers() { - return singletonMap( - isMethod() - .and(named("getRedirect")) - .and(takesArgument(0, named("org.apache.http.HttpRequest"))), - ApacheHttpClientRedirectInstrumentation.class.getName() + "$ClientRedirectAdvice"); - } - - public static class ClientRedirectAdvice { - @Advice.OnMethodExit(suppress = Throwable.class) - private static void onAfterExecute( - @Advice.Argument(0) HttpRequest original, - @Advice.Return(typing = Assigner.Typing.DYNAMIC) HttpRequest redirect) { - if (redirect == null) { - return; - } - // TODO this only handles W3C headers - // Apache HttpClient 4.0.1+ copies headers from original to redirect only - // if redirect headers are empty. Because we add headers - // "traceparent" and "tracestate" to redirect: it means redirect headers never - // will be empty. So in case if not-instrumented redirect had no headers, - // we just copy all not set headers from original to redirect (doing same - // thing as apache httpclient does). - if (!redirect.headerIterator().hasNext()) { - // redirect didn't have other headers besides tracing, so we need to do copy - // (same work as Apache HttpClient 4.0.1+ does w/o instrumentation) - redirect.setHeaders(original.getAllHeaders()); - } else { - for (Header header : original.getAllHeaders()) { - String name = header.getName().toLowerCase(); - if (name.equals("traceparent") || name.equals("tracestate")) { - if (!redirect.containsHeader(header.getName())) { - redirect.setHeader(header.getName(), header.getValue()); - } - } - } - } - } - } -} diff --git a/instrumentation/apache-httpasyncclient-4.1/javaagent/apache-httpasyncclient-4.1-javaagent.gradle b/instrumentation/apache-httpasyncclient-4.1/javaagent/apache-httpasyncclient-4.1-javaagent.gradle new file mode 100644 index 0000000000..3da8a85628 --- /dev/null +++ b/instrumentation/apache-httpasyncclient-4.1/javaagent/apache-httpasyncclient-4.1-javaagent.gradle @@ -0,0 +1,16 @@ +apply from: "$rootDir/gradle/instrumentation.gradle" + +muzzle { + pass { + group = "org.apache.httpcomponents" + module = "httpasyncclient" + // 4.0 and 4.0.1 don't copy over the traceparent (etc) http headers on redirect + versions = "[4.1,)" + // TODO implement a muzzle check so that 4.0.x (at least 4.0 and 4.0.1) do not get applied + // and then bring back assertInverse + } +} + +dependencies { + library group: 'org.apache.httpcomponents', name: 'httpasyncclient', version: '4.1' +} diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentation.java diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentationModule.java b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentationModule.java similarity index 78% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentationModule.java rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentationModule.java index 3f3bc668a5..8e866b882c 100644 --- a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentationModule.java +++ b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientInstrumentationModule.java @@ -15,12 +15,11 @@ import java.util.List; @AutoService(InstrumentationModule.class) public class ApacheHttpAsyncClientInstrumentationModule extends InstrumentationModule { public ApacheHttpAsyncClientInstrumentationModule() { - super("apache-httpasyncclient", "apache-httpasyncclient-4.0"); + super("apache-httpasyncclient", "apache-httpasyncclient-4.1"); } @Override public List typeInstrumentations() { - return asList( - new ApacheHttpAsyncClientInstrumentation(), new ApacheHttpClientRedirectInstrumentation()); + return asList(new ApacheHttpAsyncClientInstrumentation()); } } diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientTracer.java b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientTracer.java similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientTracer.java rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/ApacheHttpAsyncClientTracer.java diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/HttpHeadersInjectAdapter.java b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/HttpHeadersInjectAdapter.java similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/HttpHeadersInjectAdapter.java rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachehttpasyncclient/HttpHeadersInjectAdapter.java diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/ApacheHttpAsyncClientNullCallbackTest.groovy b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/ApacheHttpAsyncClientNullCallbackTest.groovy similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/ApacheHttpAsyncClientNullCallbackTest.groovy rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/ApacheHttpAsyncClientNullCallbackTest.groovy diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/ApacheHttpAsyncClientTest.groovy b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/ApacheHttpAsyncClientTest.groovy similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/ApacheHttpAsyncClientTest.groovy rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/ApacheHttpAsyncClientTest.groovy diff --git a/instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/HttpUriRequest.groovy b/instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/HttpUriRequest.groovy similarity index 100% rename from instrumentation/apache-httpasyncclient-4.0/javaagent/src/test/groovy/HttpUriRequest.groovy rename to instrumentation/apache-httpasyncclient-4.1/javaagent/src/test/groovy/HttpUriRequest.groovy diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/elasticsearch-rest-5.0-javaagent.gradle b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/elasticsearch-rest-5.0-javaagent.gradle index af8de2da86..f9eb1cb6dc 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/elasticsearch-rest-5.0-javaagent.gradle +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/elasticsearch-rest-5.0-javaagent.gradle @@ -26,7 +26,7 @@ dependencies { implementation project(':instrumentation:elasticsearch:elasticsearch-rest-common:javaagent') testImplementation project(':instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent') - testImplementation project(':instrumentation:apache-httpasyncclient-4.0:javaagent') + testImplementation project(':instrumentation:apache-httpasyncclient-4.1:javaagent') testImplementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testImplementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/elasticsearch-rest-6.4-javaagent.gradle b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/elasticsearch-rest-6.4-javaagent.gradle index 0c29e6189e..814e074e88 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/elasticsearch-rest-6.4-javaagent.gradle +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/elasticsearch-rest-6.4-javaagent.gradle @@ -26,7 +26,7 @@ dependencies { implementation project(':instrumentation:elasticsearch:elasticsearch-rest-common:javaagent') testImplementation project(':instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent') - testImplementation project(':instrumentation:apache-httpasyncclient-4.0:javaagent') + testImplementation project(':instrumentation:apache-httpasyncclient-4.1:javaagent') //TODO: review the following claim, we are not using embedded ES anymore // Netty is used, but it adds complexity to the tests since we're using embedded ES. //testImplementation project(':instrumentation:netty:netty-4.1:javaagent') diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/elasticsearch-transport-5.0-javaagent.gradle b/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/elasticsearch-transport-5.0-javaagent.gradle index 691fca2355..0c52a34b06 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/elasticsearch-transport-5.0-javaagent.gradle +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.0/javaagent/elasticsearch-transport-5.0-javaagent.gradle @@ -22,7 +22,7 @@ dependencies { // Ensure no cross interference testImplementation project(':instrumentation:elasticsearch:elasticsearch-rest-5.0:javaagent') - testImplementation project(':instrumentation:apache-httpasyncclient-4.0:javaagent') + testImplementation project(':instrumentation:apache-httpasyncclient-4.1:javaagent') testImplementation project(':instrumentation:netty:netty-4.1:javaagent') testImplementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/elasticsearch-transport-5.3-javaagent.gradle b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/elasticsearch-transport-5.3-javaagent.gradle index a05efed095..7dcd87043f 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/elasticsearch-transport-5.3-javaagent.gradle +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/javaagent/elasticsearch-transport-5.3-javaagent.gradle @@ -20,7 +20,7 @@ dependencies { implementation project(':instrumentation:elasticsearch:elasticsearch-transport-common:javaagent') - testImplementation project(':instrumentation:apache-httpasyncclient-4.0:javaagent') + testImplementation project(':instrumentation:apache-httpasyncclient-4.1:javaagent') testImplementation project(':instrumentation:netty:netty-4.1:javaagent') testImplementation project(':instrumentation:spring:spring-data-1.8:javaagent') diff --git a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/elasticsearch-transport-6.0-javaagent.gradle b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/elasticsearch-transport-6.0-javaagent.gradle index 7a8e2b4e9f..7f4b3d2614 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/elasticsearch-transport-6.0-javaagent.gradle +++ b/instrumentation/elasticsearch/elasticsearch-transport-6.0/javaagent/elasticsearch-transport-6.0-javaagent.gradle @@ -30,7 +30,7 @@ dependencies { // Ensure no cross interference testImplementation project(':instrumentation:elasticsearch:elasticsearch-rest-5.0:javaagent') - testImplementation project(':instrumentation:apache-httpasyncclient-4.0:javaagent') + testImplementation project(':instrumentation:apache-httpasyncclient-4.1:javaagent') testImplementation project(':instrumentation:netty:netty-4.1:javaagent') testLibrary group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '6.0.0' diff --git a/settings.gradle b/settings.gradle index 614b74f76e..21e3d2931b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -56,7 +56,7 @@ include ':smoke-tests' include ':instrumentation:akka-actor-2.5:javaagent' include ':instrumentation:akka-http-10.0:javaagent' include ':instrumentation:apache-camel-2.20:javaagent' -include ':instrumentation:apache-httpasyncclient-4.0:javaagent' +include ':instrumentation:apache-httpasyncclient-4.1:javaagent' include ':instrumentation:apache-httpclient:apache-httpclient-2.0:javaagent' include ':instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent' include ':instrumentation:armeria-1.0:javaagent'