diff --git a/agent-bootstrap/agent-bootstrap.gradle b/agent-bootstrap/agent-bootstrap.gradle index 0143f7b4be..4efa2ba41b 100644 --- a/agent-bootstrap/agent-bootstrap.gradle +++ b/agent-bootstrap/agent-bootstrap.gradle @@ -14,4 +14,6 @@ dependencies { compile deps.slf4j compile group: 'org.slf4j', name: 'slf4j-simple', version: versions.slf4j // ^ Generally a bad idea for libraries, but we're shadowing. + + testCompile project(':testing') } diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/BaseDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/BaseDecorator.java similarity index 98% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/BaseDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/BaseDecorator.java index 1a395febfc..2a3c209108 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/BaseDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/BaseDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.Tags; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/ClientDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ClientDecorator.java similarity index 93% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/ClientDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ClientDecorator.java index adadfb59fe..684f91a050 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/ClientDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ClientDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/DatabaseClientDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java similarity index 97% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/DatabaseClientDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java index 2343230cec..135b49f1aa 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/DatabaseClientDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/DatabaseClientDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.auto.config.Config; import io.opentelemetry.auto.instrumentation.api.MoreTags; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/HttpClientDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpClientDecorator.java similarity index 98% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/HttpClientDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpClientDecorator.java index b44dd7641c..9e4a96eb9c 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/HttpClientDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpClientDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.auto.config.Config; import io.opentelemetry.auto.instrumentation.api.MoreTags; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/HttpServerDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpServerDecorator.java similarity index 98% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/HttpServerDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpServerDecorator.java index 33366b758b..289da00da1 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/HttpServerDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpServerDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.auto.config.Config; import io.opentelemetry.auto.instrumentation.api.MoreTags; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/OrmClientDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/OrmClientDecorator.java similarity index 94% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/OrmClientDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/OrmClientDecorator.java index 18c5ac9427..612fbb1c81 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/OrmClientDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/OrmClientDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/ServerDecorator.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ServerDecorator.java similarity index 92% rename from agent-tooling/src/main/java/io/opentelemetry/auto/decorator/ServerDecorator.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ServerDecorator.java index 8e4488be7c..4c9bf66113 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/decorator/ServerDecorator.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ServerDecorator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; import io.opentelemetry.trace.Span; diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AdviceUtils.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/AdviceUtils.java similarity index 92% rename from instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AdviceUtils.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/AdviceUtils.java index 6837ffdfba..86f1719478 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AdviceUtils.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/AdviceUtils.java @@ -13,11 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.java.concurrent; +package io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent; import io.opentelemetry.OpenTelemetry; import io.opentelemetry.auto.bootstrap.ContextStore; -import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.instrumentation.api.SpanWithScope; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java similarity index 90% rename from instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java index 21711ab19a..ef8d7da6e8 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/ExecutorInstrumentationUtils.java @@ -13,15 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.java.concurrent; +package io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent; -import static io.opentelemetry.auto.instrumentation.java.concurrent.AdviceUtils.TRACER; +import static io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils.TRACER; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.WeakMap; -import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.CallableWrapper; -import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.RunnableWrapper; -import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.trace.Span; import java.util.concurrent.Executor; import lombok.extern.slf4j.Slf4j; diff --git a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/HeadersInjectAdapter.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/GenericRunnable.java similarity index 57% rename from instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/HeadersInjectAdapter.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/GenericRunnable.java index 959d198912..53e808ad7c 100644 --- a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/HeadersInjectAdapter.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/java/concurrent/GenericRunnable.java @@ -13,17 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.playws1; +package io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent; -import io.opentelemetry.context.propagation.HttpTextFormat; -import play.shaded.ahc.org.asynchttpclient.Request; - -public class HeadersInjectAdapter implements HttpTextFormat.Setter { - - public static final HeadersInjectAdapter SETTER = new HeadersInjectAdapter(); +/** Used by ThreadPoolExecutorInstrumentation to check executor support */ +public class GenericRunnable implements Runnable { @Override - public void put(final Request carrier, final String key, final String value) { - carrier.getHeaders().add(key, value); - } + public void run() {} } diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DBInfo.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/jdbc/DBInfo.java similarity index 94% rename from instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DBInfo.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/jdbc/DBInfo.java index 9728a14822..2d6484349f 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DBInfo.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/jdbc/DBInfo.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.jdbc; +package io.opentelemetry.auto.bootstrap.instrumentation.jdbc; import lombok.Builder; import lombok.Data; diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCConnectionUrlParser.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java similarity index 99% rename from instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCConnectionUrlParser.java rename to agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java index 96cf1e618b..282c912d7c 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCConnectionUrlParser.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/bootstrap/instrumentation/jdbc/JDBCConnectionUrlParser.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.jdbc; +package io.opentelemetry.auto.bootstrap.instrumentation.jdbc; -import static io.opentelemetry.auto.instrumentation.jdbc.DBInfo.DEFAULT; +import static io.opentelemetry.auto.bootstrap.instrumentation.jdbc.DBInfo.DEFAULT; import io.opentelemetry.auto.bootstrap.ExceptionLogger; import java.io.UnsupportedEncodingException; diff --git a/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java b/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java index 1b5adab602..ec529a5726 100644 --- a/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java +++ b/agent-bootstrap/src/main/java/io/opentelemetry/auto/config/Config.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.SortedSet; +import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; import lombok.Getter; import lombok.ToString; @@ -68,6 +69,8 @@ public class Config { public static final String HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN = "trace.http.client.split-by-domain"; public static final String DB_CLIENT_HOST_SPLIT_BY_INSTANCE = "trace.db.client.split-by-instance"; public static final String SCOPE_DEPTH_LIMIT = "trace.scope.depth.limit"; + public static final String SPAN_DURATION_ABOVE_AVERAGE_STACKTRACE_MILLIS = + "trace.span.duration-above-average.stacktrace.millis"; public static final String RUNTIME_CONTEXT_FIELD_INJECTION = "trace.runtime.context.field.injection"; @@ -89,6 +92,8 @@ public class Config { private static final boolean DEFAULT_HTTP_CLIENT_SPLIT_BY_DOMAIN = false; private static final boolean DEFAULT_DB_CLIENT_HOST_SPLIT_BY_INSTANCE = false; private static final int DEFAULT_SCOPE_DEPTH_LIMIT = 100; + private static final int DEFAULT_SPAN_DURATION_ABOVE_AVERAGE_STACKTRACE_MILLIS = + (int) TimeUnit.SECONDS.toMillis(1); public static final boolean DEFAULT_LOG_INJECTION_ENABLED = false; public static final String DEFAULT_EXPERIMENTAL_LOG_CAPTURE_THRESHOLD = null; @@ -112,6 +117,7 @@ public class Config { @Getter private final boolean httpClientSplitByDomain; @Getter private final boolean dbClientSplitByInstance; @Getter private final Integer scopeDepthLimit; + @Getter private final long spanDurationAboveAverageStacktraceNanos; @Getter private final boolean runtimeContextFieldInjection; @Getter private final boolean logInjectionEnabled; @@ -182,6 +188,13 @@ public class Config { scopeDepthLimit = getIntegerSettingFromEnvironment(SCOPE_DEPTH_LIMIT, DEFAULT_SCOPE_DEPTH_LIMIT); + spanDurationAboveAverageStacktraceNanos = + TimeUnit.MILLISECONDS.toNanos( + getIntegerSettingFromEnvironment( + SPAN_DURATION_ABOVE_AVERAGE_STACKTRACE_MILLIS, + DEFAULT_SPAN_DURATION_ABOVE_AVERAGE_STACKTRACE_MILLIS) + .longValue()); + runtimeContextFieldInjection = getBooleanSettingFromEnvironment( RUNTIME_CONTEXT_FIELD_INJECTION, DEFAULT_RUNTIME_CONTEXT_FIELD_INJECTION); @@ -244,6 +257,15 @@ public class Config { scopeDepthLimit = getPropertyIntegerValue(properties, SCOPE_DEPTH_LIMIT, parent.scopeDepthLimit); + // do we care about the integer downcast here? + spanDurationAboveAverageStacktraceNanos = + TimeUnit.MILLISECONDS.toNanos( + getPropertyIntegerValue( + properties, + SPAN_DURATION_ABOVE_AVERAGE_STACKTRACE_MILLIS, + (int) + TimeUnit.NANOSECONDS.toMillis(parent.spanDurationAboveAverageStacktraceNanos))); + runtimeContextFieldInjection = getPropertyBooleanValue( properties, RUNTIME_CONTEXT_FIELD_INJECTION, parent.runtimeContextFieldInjection); diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/BaseDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy similarity index 98% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/BaseDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy index 5cdd157114..05ac261626 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/BaseDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/BaseDecoratorTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/ClientDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy similarity index 96% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/ClientDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy index a91daafd07..aa8a58123c 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/ClientDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ClientDecoratorTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/DatabaseClientDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy similarity index 84% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/DatabaseClientDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy index bbe99e7617..4f80b7853d 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/DatabaseClientDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/DatabaseClientDecoratorTest.groovy @@ -13,11 +13,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.config.Config import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.Tags + +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import io.opentelemetry.trace.Span import static io.opentelemetry.auto.test.utils.ConfigUtils.withConfigOverride diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/HttpClientDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy similarity index 98% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/HttpClientDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy index 1abdd14c70..229e1d3a4d 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/HttpClientDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpClientDecoratorTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.config.Config import io.opentelemetry.auto.instrumentation.api.MoreTags diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/HttpServerDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy similarity index 99% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/HttpServerDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy index d0bdfe658e..1748a34a2f 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/HttpServerDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.config.Config import io.opentelemetry.auto.instrumentation.api.MoreTags diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/OrmClientDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/OrmClientDecoratorTest.groovy similarity index 97% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/OrmClientDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/OrmClientDecoratorTest.groovy index 28eb923fd6..67583b3d37 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/OrmClientDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/OrmClientDecoratorTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.trace.Span diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/SampleJavaClass.java b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/SampleJavaClass.java similarity index 93% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/SampleJavaClass.java rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/SampleJavaClass.java index 9c5d44d748..1149a4e667 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/SampleJavaClass.java +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/SampleJavaClass.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator; +package io.opentelemetry.auto.bootstrap.instrumentation.decorator; /** * Used by {@link BaseDecoratorTest}. Groovy with Java 10+ doesn't seem to treat it properly as an diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/ServerDecoratorTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy similarity index 95% rename from agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/ServerDecoratorTest.groovy rename to agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy index cecdda1dfe..9de1d2ac93 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/decorator/ServerDecoratorTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/bootstrap/instrumentation/decorator/ServerDecoratorTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.decorator +package io.opentelemetry.auto.bootstrap.instrumentation.decorator import io.opentelemetry.auto.instrumentation.api.MoreTags diff --git a/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/config/ConfigTest.groovy b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/config/ConfigTest.groovy index fd5c096266..465759a558 100644 --- a/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/config/ConfigTest.groovy +++ b/agent-bootstrap/src/test/groovy/io/opentelemetry/auto/config/ConfigTest.groovy @@ -15,10 +15,10 @@ */ package io.opentelemetry.auto.config +import io.opentelemetry.auto.util.test.AgentSpecification import org.junit.Rule import org.junit.contrib.java.lang.system.EnvironmentVariables import org.junit.contrib.java.lang.system.RestoreSystemProperties -import spock.lang.Specification import static io.opentelemetry.auto.config.Config.CONFIGURATION_FILE import static io.opentelemetry.auto.config.Config.DB_CLIENT_HOST_SPLIT_BY_INSTANCE @@ -30,7 +30,7 @@ import static io.opentelemetry.auto.config.Config.RUNTIME_CONTEXT_FIELD_INJECTIO import static io.opentelemetry.auto.config.Config.TRACE_ENABLED import static io.opentelemetry.auto.config.Config.TRACE_METHODS -class ConfigTest extends Specification { +class ConfigTest extends AgentSpecification { @Rule public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties() @Rule diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/AgentInstaller.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/AgentInstaller.java index 6a05baeeab..f05e9587ee 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/AgentInstaller.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/AgentInstaller.java @@ -16,13 +16,11 @@ package io.opentelemetry.auto.tooling; import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.skipClassLoader; -import static io.opentelemetry.auto.tooling.matcher.AdditionalLibraryIgnoresMatcher.additionalLibraryIgnoresMatcher; import static io.opentelemetry.auto.tooling.matcher.GlobalIgnoresMatcher.globalIgnoresMatcher; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.none; -import static net.bytebuddy.matcher.ElementMatchers.not; import io.opentelemetry.OpenTelemetry; import io.opentelemetry.auto.config.Config; @@ -106,18 +104,10 @@ public class AgentInstaller { // https://github.com/raphw/byte-buddy/issues/558 // .with(AgentBuilder.LambdaInstrumentationStrategy.ENABLED) .ignore(any(), skipClassLoader()); - if (skipAdditionalLibraryMatcher) { - // Ignore classes matched by globalIgnoresMatcher but not matched by - // additionalLibraryIgnoresMatcher. - // Note: globalIgnoresMatcher includes additionalLibraryIgnoresMatcher internally for - // efficiency purposes. - // Note2: this is expected to be used by tests only. - ignoredAgentBuilder = - ignoredAgentBuilder.or( - globalIgnoresMatcher().and(not(additionalLibraryIgnoresMatcher()))); - } else { - ignoredAgentBuilder = ignoredAgentBuilder.or(globalIgnoresMatcher()); - } + + ignoredAgentBuilder = + ignoredAgentBuilder.or(globalIgnoresMatcher(skipAdditionalLibraryMatcher)); + ignoredAgentBuilder = ignoredAgentBuilder.or(matchesConfiguredExcludes()); AgentBuilder agentBuilder = ignoredAgentBuilder; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/ClassLoaderMatcher.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/ClassLoaderMatcher.java index 9ac238dc5a..be1768d30e 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/ClassLoaderMatcher.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/ClassLoaderMatcher.java @@ -17,12 +17,14 @@ package io.opentelemetry.auto.tooling; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import io.opentelemetry.auto.bootstrap.PatchLogger; import lombok.extern.slf4j.Slf4j; import net.bytebuddy.matcher.ElementMatcher; @Slf4j public final class ClassLoaderMatcher { public static final ClassLoader BOOTSTRAP_CLASSLOADER = null; + public static final int CACHE_MAX_SIZE = 25; // limit number of cached responses for each matcher. public static final int CACHE_CONCURRENCY = Math.max(8, Runtime.getRuntime().availableProcessors()); @@ -35,14 +37,24 @@ public final class ClassLoaderMatcher { return SkipClassLoaderMatcher.INSTANCE; } - public static ElementMatcher.Junction.AbstractBase classLoaderHasNoResources( - final String... resources) { - return new ClassLoaderHasNoResourceMatcher(resources); + /** + * NOTICE: Does not match the bootstrap classpath. Don't use with classes expected to be on the + * bootstrap. + * + * @param classNames list of names to match. returns true if empty. + * @return true if class is available as a resource and not the bootstrap classloader. + */ + public static ElementMatcher.Junction.AbstractBase hasClassesNamed( + final String... classNames) { + return new ClassLoaderHasClassesNamedMatcher(classNames); } private static class SkipClassLoaderMatcher extends ElementMatcher.Junction.AbstractBase { public static final SkipClassLoaderMatcher INSTANCE = new SkipClassLoaderMatcher(); + /* Cache of classloader-instance -> (true|false). True = skip instrumentation. False = safe to instrument. */ + private static final Cache skipCache = + CacheBuilder.newBuilder().weakKeys().concurrencyLevel(CACHE_CONCURRENCY).build(); private static final String AGENT_CLASSLOADER_NAME = "io.opentelemetry.auto.bootstrap.AgentClassLoader"; @@ -54,7 +66,21 @@ public final class ClassLoaderMatcher { // Don't skip bootstrap loader return false; } - return shouldSkipClass(cl); + Boolean v = skipCache.getIfPresent(cl); + if (v != null) { + return v; + } + // when ClassloadingInstrumentation is active, checking delegatesToBootstrap() below is not + // required, because ClassloadingInstrumentation forces all class loaders to load all of the + // classes in Constants.BOOTSTRAP_PACKAGE_PREFIXES directly from the bootstrap class loader + // + // however, at this time we don't want to introduce the concept of a required instrumentation, + // and we don't want to introduce the concept of the tooling code depending on whether or not + // a particular instrumentation is active (mainly because this particular use case doesn't + // seem to justify introducing either of these new concepts) + v = shouldSkipClass(cl) || !delegatesToBootstrap(cl); + skipCache.put(cl, v); + return v; } private static boolean shouldSkipClass(final ClassLoader loader) { @@ -70,40 +96,73 @@ public final class ClassLoaderMatcher { } return false; } + + /** + * TODO: this turns out to be useless with OSGi: {@code + * org.eclipse.osgi.internal.loader.BundleLoader#isRequestFromVM} returns {@code true} when + * class loading is issued from this check and {@code false} for 'real' class loads. We should + * come up with some sort of hack to avoid this problem. + */ + private static boolean delegatesToBootstrap(final ClassLoader loader) { + boolean delegates = true; + if (!loadsExpectedClass(loader, PatchLogger.class)) { + log.debug("loader {} failed to delegate bootstrap agent class", loader); + delegates = false; + } + return delegates; + } + + private static boolean loadsExpectedClass( + final ClassLoader loader, final Class expectedClass) { + try { + return loader.loadClass(expectedClass.getName()) == expectedClass; + } catch (final ClassNotFoundException e) { + return false; + } + } } - private static class ClassLoaderHasNoResourceMatcher + private static class ClassLoaderHasClassesNamedMatcher extends ElementMatcher.Junction.AbstractBase { + private final Cache cache = - CacheBuilder.newBuilder().weakKeys().concurrencyLevel(CACHE_CONCURRENCY).build(); + CacheBuilder.newBuilder() + .weakKeys() + .maximumSize(CACHE_MAX_SIZE) + .concurrencyLevel(CACHE_CONCURRENCY) + .build(); private final String[] resources; - private ClassLoaderHasNoResourceMatcher(final String... resources) { - this.resources = resources; + private ClassLoaderHasClassesNamedMatcher(final String... classNames) { + resources = classNames; + for (int i = 0; i < resources.length; i++) { + resources[i] = resources[i].replace(".", "/") + ".class"; + } } - private boolean hasNoResources(final ClassLoader cl) { + private boolean hasResources(final ClassLoader cl) { for (final String resource : resources) { if (cl.getResource(resource) == null) { - return true; + return false; } } - return false; + return true; } @Override public boolean matches(final ClassLoader cl) { - if (cl == null) { + if (cl == BOOTSTRAP_CLASSLOADER) { + // Can't match the bootstrap classloader. return false; } - Boolean v = cache.getIfPresent(cl); - if (v != null) { - return v; + final Boolean cached; + if ((cached = cache.getIfPresent(cl)) != null) { + return cached; } - v = hasNoResources(cl); - cache.put(cl, v); - return v; + final boolean value = hasResources(cl); + cache.put(cl, value); + return value; } } } diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/HelperInjector.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/HelperInjector.java index 619ced81c1..e6da10841f 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/HelperInjector.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/HelperInjector.java @@ -22,6 +22,7 @@ import io.opentelemetry.auto.bootstrap.WeakMap; import java.io.File; import java.io.IOException; import java.lang.ref.WeakReference; +import java.nio.file.Files; import java.security.SecureClassLoader; import java.util.Arrays; import java.util.Collection; @@ -46,7 +47,14 @@ import net.bytebuddy.utility.JavaModule; public class HelperInjector implements Transformer { // Need this because we can't put null into the injectedClassLoaders map. private static final ClassLoader BOOTSTRAP_CLASSLOADER_PLACEHOLDER = - new SecureClassLoader(null) {}; + new SecureClassLoader(null) { + @Override + public String toString() { + return ""; + } + }; + + private final String requestingName; private final Set helperClassNames; private final Map dynamicTypeMap = new LinkedHashMap<>(); @@ -63,21 +71,26 @@ public class HelperInjector implements Transformer { * order provided. This is important if there is interdependency between helper classes that * requires them to be injected in a specific order. */ - public HelperInjector(final String... helperClassNames) { + public HelperInjector(final String requestingName, final String... helperClassNames) { + this.requestingName = requestingName; + this.helperClassNames = new LinkedHashSet<>(Arrays.asList(helperClassNames)); } - public HelperInjector(final Map helperMap) { + public HelperInjector(final String requestingName, final Map helperMap) { + this.requestingName = requestingName; + helperClassNames = helperMap.keySet(); dynamicTypeMap.putAll(helperMap); } - public static HelperInjector forDynamicTypes(final Collection> helpers) { + public static HelperInjector forDynamicTypes( + final String requestingName, final Collection> helpers) { final Map bytes = new HashMap<>(helpers.size()); for (final DynamicType.Unloaded helper : helpers) { bytes.put(helper.getTypeDescription().getName(), helper.getBytes()); } - return new HelperInjector(bytes); + return new HelperInjector(requestingName, bytes); } private Map getHelperMap() throws IOException { @@ -116,14 +129,9 @@ public class HelperInjector implements Transformer { final Map classnameToBytes = getHelperMap(); final Map> classes; if (classLoader == BOOTSTRAP_CLASSLOADER_PLACEHOLDER) { - classes = - ClassInjector.UsingInstrumentation.of( - new File(System.getProperty("java.io.tmpdir")), - ClassInjector.UsingInstrumentation.Target.BOOTSTRAP, - AgentInstaller.getInstrumentation()) - .injectRaw(classnameToBytes); + classes = injectBootstrapClassLoader(classnameToBytes); } else { - classes = new ClassInjector.UsingReflection(classLoader).injectRaw(classnameToBytes); + classes = injectClassLoader(classLoader, classnameToBytes); } // All agent helper classes are in the unnamed module @@ -134,16 +142,11 @@ public class HelperInjector implements Transformer { helperModules.add(new WeakReference<>(javaModule.unwrap())); } } catch (final Exception e) { - final String classLoaderType = - classLoader == BOOTSTRAP_CLASSLOADER_PLACEHOLDER - ? "" - : classLoader.getClass().getName(); - log.error( - "Error preparing helpers for {}. Failed to inject helper classes into instance {} of type {}", + "Error preparing helpers while processing {} for {}. Failed to inject helper classes into instance {}", typeDescription, + requestingName, classLoader, - classLoaderType, e); throw new RuntimeException(e); } @@ -156,6 +159,31 @@ public class HelperInjector implements Transformer { return builder; } + private Map> injectBootstrapClassLoader( + final Map classnameToBytes) throws IOException { + // Mar 2020: Since we're proactively cleaning up tempDirs, we cannot share dirs per thread. + // If this proves expensive, we could do a per-process tempDir with + // a reference count -- but for now, starting simple. + + // Failures to create a tempDir are propagated as IOException and handled by transform + File tempDir = createTempDir(); + try { + return ClassInjector.UsingInstrumentation.of( + tempDir, + ClassInjector.UsingInstrumentation.Target.BOOTSTRAP, + AgentInstaller.getInstrumentation()) + .injectRaw(classnameToBytes); + } finally { + // Delete fails silently + deleteTempDir(tempDir); + } + } + + private Map> injectClassLoader( + final ClassLoader classLoader, final Map classnameToBytes) { + return new ClassInjector.UsingReflection(classLoader).injectRaw(classnameToBytes); + } + private void ensureModuleCanReadHelperModules(final JavaModule target) { if (JavaModule.isSupported() && target != JavaModule.UNSUPPORTED && target.isNamed()) { for (final WeakReference helperModuleReference : helperModules) { @@ -177,4 +205,18 @@ public class HelperInjector implements Transformer { } } } + + private static final File createTempDir() throws IOException { + return Files.createTempDirectory("datadog-temp-jars").toFile(); + } + + private static final void deleteTempDir(final File file) { + // Not using Files.delete for deleting the directory because failures + // create Exceptions which may prove expensive. Instead using the + // older File API which simply returns a boolean. + boolean deleted = file.delete(); + if (!deleted) { + file.deleteOnExit(); + } + } } diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/Instrumenter.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/Instrumenter.java index b22c3ee5d1..6dd029a2a9 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/Instrumenter.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/Instrumenter.java @@ -120,7 +120,9 @@ public interface Instrumenter { AgentBuilder.Identified.Extendable agentBuilder) { final String[] helperClassNames = helperClassNames(); if (helperClassNames.length > 0) { - agentBuilder = agentBuilder.transform(new HelperInjector(helperClassNames)); + agentBuilder = + agentBuilder.transform( + new HelperInjector(this.getClass().getSimpleName(), helperClassNames)); } return agentBuilder; } diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/context/FieldBackedProvider.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/context/FieldBackedProvider.java index 4210959e4a..82a1aa84d6 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/context/FieldBackedProvider.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/context/FieldBackedProvider.java @@ -337,8 +337,10 @@ public class FieldBackedProvider implements InstrumentationContextProvider { /** Get transformer that forces helper injection onto bootstrap classloader. */ private AgentBuilder.Transformer bootstrapHelperInjector( final Collection> helpers) { + // TODO: Better to pass through the context of the Instrumenter return new AgentBuilder.Transformer() { - final HelperInjector injector = HelperInjector.forDynamicTypes(helpers); + final HelperInjector injector = + HelperInjector.forDynamicTypes(this.getClass().getSimpleName(), helpers); @Override public DynamicType.Builder transform( diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/AdditionalLibraryIgnoresMatcher.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/AdditionalLibraryIgnoresMatcher.java index b8b53ee95b..b989ffe202 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/AdditionalLibraryIgnoresMatcher.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/AdditionalLibraryIgnoresMatcher.java @@ -43,35 +43,28 @@ public class AdditionalLibraryIgnoresMatcher final String name = target.getActualName(); if (name.startsWith("com.beust.jcommander.") - || name.startsWith("com.carrotsearch.hppc.") - || name.startsWith("com.couchbase.client.deps.") || name.startsWith("com.fasterxml.classmate.") - || name.startsWith("com.fasterxml.jackson.") || name.startsWith("com.github.mustachejava.") || name.startsWith("com.jayway.jsonpath.") - || name.startsWith("com.lightbend.lagom") + || name.startsWith("com.lightbend.lagom.") || name.startsWith("javax.el.") || name.startsWith("net.sf.cglib.") - || name.startsWith("org.apache.lucene") - || name.startsWith("org.apache.tartarus") - || name.startsWith("org.json.simple") - || name.startsWith("org.objectweb.asm.") - || name.startsWith("org.yaml.snakeyaml")) { + || name.startsWith("org.apache.lucene.") + || name.startsWith("org.apache.tartarus.") + || name.startsWith("org.json.simple.") + || name.startsWith("org.yaml.snakeyaml.")) { return true; } if (name.startsWith("org.springframework.")) { if (name.startsWith("org.springframework.aop.") - || name.startsWith("org.springframework.asm.") || name.startsWith("org.springframework.cache.") || name.startsWith("org.springframework.dao.") || name.startsWith("org.springframework.ejb.") || name.startsWith("org.springframework.expression.") || name.startsWith("org.springframework.format.") - || name.startsWith("org.springframework.instrument.") || name.startsWith("org.springframework.jca.") || name.startsWith("org.springframework.jdbc.") - || name.startsWith("org.springframework.jms.") || name.startsWith("org.springframework.jmx.") || name.startsWith("org.springframework.jndi.") || name.startsWith("org.springframework.lang.") @@ -79,19 +72,20 @@ public class AdditionalLibraryIgnoresMatcher || name.startsWith("org.springframework.objenesis.") || name.startsWith("org.springframework.orm.") || name.startsWith("org.springframework.remoting.") - || name.startsWith("org.springframework.scheduling.annotation") || name.startsWith("org.springframework.scripting.") || name.startsWith("org.springframework.stereotype.") || name.startsWith("org.springframework.transaction.") || name.startsWith("org.springframework.ui.") - || name.startsWith("org.springframework.util.") || name.startsWith("org.springframework.validation.")) { return true; } if (name.startsWith("org.springframework.data.")) { - if (name.equals( - "org.springframework.data.repository.core.support.RepositoryFactorySupport")) { + if (name.equals("org.springframework.data.repository.core.support.RepositoryFactorySupport") + || name.startsWith( + "org.springframework.data.convert.ClassGeneratingEntityInstantiator$") + || name.equals( + "org.springframework.data.jpa.repository.config.InspectionClassLoader")) { return false; } return true; @@ -116,7 +110,12 @@ public class AdditionalLibraryIgnoresMatcher if (name.startsWith("org.springframework.boot.")) { // More runnables to deal with if (name.startsWith("org.springframework.boot.autoconfigure.BackgroundPreinitializer$") - || name.startsWith("org.springframework.boot.web.embedded.netty.NettyWebServer$")) { + || name.startsWith("org.springframework.boot.autoconfigure.condition.OnClassCondition$") + || name.startsWith("org.springframework.boot.web.embedded.netty.NettyWebServer$") + || name.startsWith( + "org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer$") + || name.equals( + "org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedWebappClassLoader")) { return false; } return true; @@ -134,14 +133,25 @@ public class AdditionalLibraryIgnoresMatcher if (name.startsWith("org.springframework.context.")) { // More runnables to deal with - if (name.startsWith("org.springframework.context.support.AbstractApplicationContext$")) { + if (name.startsWith("org.springframework.context.support.AbstractApplicationContext$") + || name.equals("org.springframework.context.support.ContextTypeMatchClassLoader")) { return false; } return true; } if (name.startsWith("org.springframework.core.")) { - if (name.startsWith("org.springframework.core.task.")) { + if (name.startsWith("org.springframework.core.task.") + || name.equals("org.springframework.core.DecoratingClassLoader") + || name.equals("org.springframework.core.OverridingClassLoader")) { + return false; + } + return true; + } + + if (name.startsWith("org.springframework.instrument.")) { + if (name.equals("org.springframework.instrument.classloading.SimpleThrowawayClassLoader") + || name.equals("org.springframework.instrument.classloading.ShadowingClassLoader")) { return false; } return true; @@ -155,9 +165,24 @@ public class AdditionalLibraryIgnoresMatcher return true; } + if (name.startsWith("org.springframework.jms.")) { + if (name.startsWith("org.springframework.jms.listener.")) { + return false; + } + return true; + } + + if (name.startsWith("org.springframework.util.")) { + if (name.startsWith("org.springframework.util.concurrent.")) { + return false; + } + return true; + } + if (name.startsWith("org.springframework.web.")) { if (name.startsWith("org.springframework.web.servlet.") - || name.startsWith("org.springframework.web.reactive.")) { + || name.startsWith("org.springframework.web.reactive.") + || name.startsWith("org.springframework.web.context.request.async.")) { return false; } return true; @@ -199,8 +224,12 @@ public class AdditionalLibraryIgnoresMatcher return true; } - if (name.startsWith("com.datastax.driver.")) { - if (name.startsWith("com.datastax.driver.core.Cluster$")) { + if (name.startsWith("com.couchbase.client.deps.")) { + // Couchbase library includes some packaged dependencies, unfortunately some of them are + // instrumented by java-concurrent instrumentation + if (name.startsWith("com.couchbase.client.deps.io.netty.") + || name.startsWith("com.couchbase.client.deps.org.LatencyUtils.") + || name.startsWith("com.couchbase.client.deps.com.lmax.disruptor.")) { return false; } return true; @@ -227,7 +256,9 @@ public class AdditionalLibraryIgnoresMatcher } if (name.startsWith("com.google.inject.")) { // We instrument Runnable there - if (name.startsWith("com.google.inject.internal.AbstractBindingProcessor$")) { + if (name.startsWith("com.google.inject.internal.AbstractBindingProcessor$") + || name.startsWith("com.google.inject.internal.BytecodeGen$") + || name.startsWith("com.google.inject.internal.cglib.core.internal.$LoadingCache$")) { return false; } // We instrument Callable there @@ -237,7 +268,7 @@ public class AdditionalLibraryIgnoresMatcher return true; } if (name.startsWith("com.google.api.")) { - if (name.equals("com.google.api.client.http.HttpRequest")) { + if (name.startsWith("com.google.api.client.http.HttpRequest")) { return false; } return true; @@ -248,8 +279,24 @@ public class AdditionalLibraryIgnoresMatcher || name.startsWith("org.h2.jdbc.") || name.startsWith("org.h2.jdbcx.") // Some runnables that get instrumented + || name.equals("org.h2.util.Task") || name.equals("org.h2.store.FileLock") - || name.equals("org.h2.engine.DatabaseCloser")) { + || name.equals("org.h2.engine.DatabaseCloser") + || name.equals("org.h2.engine.OnExitDatabaseCloser")) { + return false; + } + return true; + } + + if (name.startsWith("com.carrotsearch.hppc.")) { + if (name.startsWith("com.carrotsearch.hppc.HashOrderMixing$")) { + return false; + } + return true; + } + + if (name.startsWith("com.fasterxml.jackson.")) { + if (name.equals("com.fasterxml.jackson.module.afterburner.util.MyClassLoader")) { return false; } return true; diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/GlobalIgnoresMatcher.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/GlobalIgnoresMatcher.java index 61a51878f8..f1794009a6 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/GlobalIgnoresMatcher.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/matcher/GlobalIgnoresMatcher.java @@ -41,12 +41,18 @@ public class GlobalIgnoresMatcher private static final Pattern COM_MCHANGE_PROXY = Pattern.compile("com\\.mchange\\.v2\\.c3p0\\..*Proxy"); - public static ElementMatcher.Junction globalIgnoresMatcher() { - return new GlobalIgnoresMatcher<>(); + public static ElementMatcher.Junction globalIgnoresMatcher( + final boolean skipAdditionalLibraryMatcher) { + return new GlobalIgnoresMatcher<>(skipAdditionalLibraryMatcher); } private final ElementMatcher additionalLibraryIgnoreMatcher = AdditionalLibraryIgnoresMatcher.additionalLibraryIgnoresMatcher(); + private final boolean skipAdditionalLibraryMatcher; + + private GlobalIgnoresMatcher(final boolean skipAdditionalLibraryMatcher) { + this.skipAdditionalLibraryMatcher = skipAdditionalLibraryMatcher; + } /** * Be very careful about the types of matchers used in this section as they are called on every @@ -146,7 +152,8 @@ public class GlobalIgnoresMatcher || name.contains("CGLIB$$") || name.contains("javassist") || name.contains(".asm.") - || name.contains("$__sisu")) { + || name.contains("$__sisu") + || name.startsWith("org.springframework.core.$Proxy")) { return true; } @@ -154,7 +161,7 @@ public class GlobalIgnoresMatcher return true; } - if (additionalLibraryIgnoreMatcher.matches(target)) { + if (!skipAdditionalLibraryMatcher && additionalLibraryIgnoreMatcher.matches(target)) { return true; } diff --git a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/muzzle/MuzzleVersionScanPlugin.java b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/muzzle/MuzzleVersionScanPlugin.java index e8dbd3192c..ee2cb61d45 100644 --- a/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/muzzle/MuzzleVersionScanPlugin.java +++ b/agent-tooling/src/main/java/io/opentelemetry/auto/tooling/muzzle/MuzzleVersionScanPlugin.java @@ -117,7 +117,9 @@ public class MuzzleVersionScanPlugin { // verify helper injector works final String[] helperClassNames = defaultInstrumenter.helperClassNames(); if (helperClassNames.length > 0) { - new HelperInjector(createHelperMap(defaultInstrumenter)) + new HelperInjector( + MuzzleVersionScanPlugin.class.getSimpleName(), + createHelperMap(defaultInstrumenter)) .transform(null, null, userClassLoader, null); } } catch (final Exception e) { diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/test/HelperInjectionTest.groovy b/agent-tooling/src/test/groovy/io/opentelemetry/auto/test/HelperInjectionTest.groovy index 0b2d18589f..bac51ea8ab 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/test/HelperInjectionTest.groovy +++ b/agent-tooling/src/test/groovy/io/opentelemetry/auto/test/HelperInjectionTest.groovy @@ -39,7 +39,7 @@ class HelperInjectionTest extends AgentSpecification { def "helpers injected to non-delegating classloader"() { setup: String helperClassName = HelperInjectionTest.getPackage().getName() + '.HelperClass' - HelperInjector injector = new HelperInjector(helperClassName) + HelperInjector injector = new HelperInjector("test", helperClassName) AtomicReference emptyLoader = new AtomicReference<>(new URLClassLoader(new URL[0], (ClassLoader) null)) when: @@ -71,7 +71,7 @@ class HelperInjectionTest extends AgentSpecification { ByteBuddyAgent.install() AgentInstaller.installBytebuddyAgent(ByteBuddyAgent.getInstrumentation()) String helperClassName = HelperInjectionTest.getPackage().getName() + '.HelperClass' - HelperInjector injector = new HelperInjector(helperClassName) + HelperInjector injector = new HelperInjector("test", helperClassName) URLClassLoader bootstrapChild = new URLClassLoader(new URL[0], (ClassLoader) null) when: diff --git a/agent-tooling/src/test/groovy/io/opentelemetry/auto/tooling/CleanerTest.groovy b/agent-tooling/src/test/groovy/io/opentelemetry/auto/tooling/CleanerTest.groovy index f29cc6b1f7..11e0f854da 100644 --- a/agent-tooling/src/test/groovy/io/opentelemetry/auto/tooling/CleanerTest.groovy +++ b/agent-tooling/src/test/groovy/io/opentelemetry/auto/tooling/CleanerTest.groovy @@ -18,6 +18,7 @@ package io.opentelemetry.auto.tooling import io.opentelemetry.auto.common.exec.CommonTaskExecutor import io.opentelemetry.auto.util.gc.GCUtils import io.opentelemetry.auto.util.test.AgentSpecification +import spock.lang.Retry import spock.lang.Subject import java.lang.ref.WeakReference @@ -26,6 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger import static java.util.concurrent.TimeUnit.MILLISECONDS +@Retry class CleanerTest extends AgentSpecification { @Subject diff --git a/gradle/instrumentation.gradle b/gradle/instrumentation.gradle index a757661713..4720adfdf2 100644 --- a/gradle/instrumentation.gradle +++ b/gradle/instrumentation.gradle @@ -47,6 +47,12 @@ afterEvaluate { annotationProcessor deps.autoservice implementation deps.autoservice + // Include instrumentations instrumenting core JDK classes tp ensure interoperability with other instrumentation + testCompile project(':instrumentation:java-concurrent') + // FIXME: we should enable this, but currently this fails tests for google http client + //testCompile project(':instrumentation:http-url-connection') + testCompile project(':instrumentation:java-class-loader') + testCompile project(':testing') testAnnotationProcessor deps.autoservice testImplementation deps.autoservice diff --git a/instrumentation/akka-http-10.0/akka-http-10.0.gradle b/instrumentation/akka-http-10.0/akka-http-10.0.gradle index 272566a890..4d0f3a9379 100644 --- a/instrumentation/akka-http-10.0/akka-http-10.0.gradle +++ b/instrumentation/akka-http-10.0/akka-http-10.0.gradle @@ -78,25 +78,18 @@ dependencies { testCompile group: 'com.typesafe.akka', name: 'akka-http_2.11', version: '10.0.0' testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.6.0' - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:trace-annotation') lagomTestCompile project(':instrumentation:akka-http-10.0') - lagomTestCompile project(':instrumentation:trace-annotation') - lagomTestCompile project(':instrumentation:java-concurrent') lagomTestCompile group: 'com.lightbend.lagom', name: 'lagom-javadsl-testkit_2.11', version: '1.4.0' // There are some internal API changes in 10.1 that we would like to test separately for version101TestCompile group: 'com.typesafe.akka', name: 'akka-http_2.11', version: '10.1.0' version101TestCompile group: 'com.typesafe.akka', name: 'akka-stream_2.11', version: '2.5.11' - version101TestCompile project(':instrumentation:java-concurrent') - version101TestCompile project(':instrumentation:trace-annotation') latestDepTestCompile group: 'com.typesafe.akka', name: 'akka-http_2.11', version: '+' latestDepTestCompile group: 'com.typesafe.akka', name: 'akka-stream_2.11', version: '+' - latestDepTestCompile project(':instrumentation:java-concurrent') - latestDepTestCompile project(':instrumentation:trace-annotation') } test.dependsOn lagomTest diff --git a/instrumentation/akka-http-10.0/src/lagomTest/groovy/LagomTest.groovy b/instrumentation/akka-http-10.0/src/lagomTest/groovy/LagomTest.groovy index 57c77cd9a6..b23e47a7e7 100644 --- a/instrumentation/akka-http-10.0/src/lagomTest/groovy/LagomTest.groovy +++ b/instrumentation/akka-http-10.0/src/lagomTest/groovy/LagomTest.groovy @@ -17,7 +17,7 @@ import akka.NotUsed import akka.stream.javadsl.Source import akka.stream.testkit.TestSubscriber.Probe import akka.stream.testkit.javadsl.TestSink -import io.opentelemetry.auto.decorator.HttpServerDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientDecorator.java b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientDecorator.java index df39b05dfc..4398633d4c 100644 --- a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientDecorator.java +++ b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientDecorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.akkahttp; import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientInstrumentation.java b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientInstrumentation.java index 041ee25470..e7f87135f1 100644 --- a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientInstrumentation.java +++ b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpClientInstrumentation.java @@ -59,9 +59,6 @@ public final class AkkaHttpClientInstrumentation extends Instrumenter.Default { return new String[] { AkkaHttpClientInstrumentation.class.getName() + "$OnCompleteHandler", AkkaHttpClientInstrumentation.class.getName() + "$AkkaHttpHeaders", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".AkkaHttpClientDecorator", }; } diff --git a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerDecorator.java b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerDecorator.java index ce385d85af..4625ca03be 100644 --- a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerDecorator.java +++ b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerDecorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.akkahttp; import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java index 72535c50e6..29fe65bb17 100644 --- a/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java +++ b/instrumentation/akka-http-10.0/src/main/java/io/opentelemetry/auto/instrumentation/akkahttp/AkkaHttpServerInstrumentation.java @@ -65,9 +65,6 @@ public final class AkkaHttpServerInstrumentation extends Instrumenter.Default { AkkaHttpServerInstrumentation.class.getName() + "$AsyncWrapper$1", AkkaHttpServerInstrumentation.class.getName() + "$AsyncWrapper$2", packageName + ".AkkaHttpServerHeaders", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".AkkaHttpServerDecorator", }; } diff --git a/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy b/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy index 2e54a52117..03b469ecb1 100644 --- a/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy +++ b/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy @@ -19,7 +19,7 @@ import akka.http.javadsl.model.HttpMethods import akka.http.javadsl.model.HttpRequest import akka.http.javadsl.model.headers.RawHeader import akka.stream.ActorMaterializer -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.akkahttp.AkkaHttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes @@ -29,7 +29,7 @@ import spock.lang.Shared import static io.opentelemetry.trace.Span.Kind.CLIENT -class AkkaHttpClientInstrumentationTest extends HttpClientTest { +class AkkaHttpClientInstrumentationTest extends HttpClientTest { @Shared ActorSystem system = ActorSystem.create() @@ -55,8 +55,8 @@ class AkkaHttpClientInstrumentationTest extends HttpClientTest { +abstract class AkkaHttpServerInstrumentationTest extends HttpServerTest { @Override - AkkaHttpServerDecorator decorator() { - return AkkaHttpServerDecorator.DECORATE + String component() { + return AkkaHttpServerDecorator.DECORATE.getComponentName() } @Override @@ -61,7 +61,7 @@ abstract class AkkaHttpServerInstrumentationTest extends HttpServerTest classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/apache/http/nio/client/HttpAsyncClient.class")); + return hasClassesNamed("org.apache.http.nio.client.HttpAsyncClient"); } @Override @@ -72,9 +71,6 @@ public class ApacheHttpAsyncClientInstrumentation extends Instrumenter.Default { packageName + ".HttpHeadersInjectAdapter", getClass().getName() + "$DelegatingRequestProducer", getClass().getName() + "$TraceContinuedFutureCallback", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".ApacheHttpAsyncClientDecorator" }; } diff --git a/instrumentation/apache-httpasyncclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java b/instrumentation/apache-httpasyncclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java index 6e43053812..709ddd8d3a 100644 --- a/instrumentation/apache-httpasyncclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java +++ b/instrumentation/apache-httpasyncclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpasyncclient/ApacheHttpClientRedirectInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.apachehttpasyncclient; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.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.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -49,7 +48,7 @@ public class ApacheHttpClientRedirectInstrumentation extends Instrumenter.Defaul @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/apache/http/client/RedirectStrategy.class")); + return hasClassesNamed("org.apache.http.client.RedirectStrategy"); } @Override diff --git a/instrumentation/apache-httpasyncclient-4.0/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy b/instrumentation/apache-httpasyncclient-4.0/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy index fba8d081c1..0bff53f6f4 100644 --- a/instrumentation/apache-httpasyncclient-4.0/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy +++ b/instrumentation/apache-httpasyncclient-4.0/src/test/groovy/ApacheHttpAsyncClientCallbackTest.groovy @@ -24,7 +24,7 @@ import spock.lang.Shared import java.util.concurrent.CompletableFuture -class ApacheHttpAsyncClientCallbackTest extends HttpClientTest { +class ApacheHttpAsyncClientCallbackTest extends HttpClientTest { @AutoCleanup @Shared @@ -66,8 +66,8 @@ class ApacheHttpAsyncClientCallbackTest extends HttpClientTest { +class ApacheHttpAsyncClientNullCallbackTest extends HttpClientTest { @AutoCleanup @Shared @@ -51,8 +51,8 @@ class ApacheHttpAsyncClientNullCallbackTest extends HttpClientTest { +class ApacheHttpAsyncClientTest extends HttpClientTest { @AutoCleanup @Shared @@ -72,8 +72,8 @@ class ApacheHttpAsyncClientTest extends HttpClientTest { - public static final ApacheHttpClientDecorator DECORATE = new ApacheHttpClientDecorator(); +public class CommonsHttpClientDecorator extends HttpClientDecorator { + public static final CommonsHttpClientDecorator DECORATE = new CommonsHttpClientDecorator(); public static final Tracer TRACER = - OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto.apache-httpclient-3.0"); + OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto.apache-httpclient-2.0"); @Override protected String getComponentName() { @@ -42,13 +42,12 @@ public class ApacheHttpClientDecorator extends HttpClientDecorator java.net.URI + return new URI(httpMethod.getURI().toString()); } catch (final URIException e) { - return null; + throw new URISyntaxException("", e.getMessage()); } - return new URI(uri.toString()); } @Override diff --git a/instrumentation/apache-httpclient/apache-httpclient-3.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/v3_0/ApacheHttpClientInstrumentation.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/src/main/java/io/opentelemetry/auto/instrumentation/commonshttpclient/CommonsHttpClientInstrumentation.java similarity index 68% rename from instrumentation/apache-httpclient/apache-httpclient-3.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/v3_0/ApacheHttpClientInstrumentation.java rename to instrumentation/apache-httpclient/apache-httpclient-2.0/src/main/java/io/opentelemetry/auto/instrumentation/commonshttpclient/CommonsHttpClientInstrumentation.java index 00f24f173e..1d7a54b3a6 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-3.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/v3_0/ApacheHttpClientInstrumentation.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/src/main/java/io/opentelemetry/auto/instrumentation/commonshttpclient/CommonsHttpClientInstrumentation.java @@ -13,18 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.apachehttpclient.v3_0; +package io.opentelemetry.auto.instrumentation.commonshttpclient; -import static io.opentelemetry.auto.instrumentation.apachehttpclient.v3_0.ApacheHttpClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.apachehttpclient.v3_0.ApacheHttpClientDecorator.TRACER; -import static io.opentelemetry.auto.instrumentation.apachehttpclient.v3_0.HttpHeadersInjectAdapter.SETTER; +import static io.opentelemetry.auto.instrumentation.commonshttpclient.CommonsHttpClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.commonshttpclient.CommonsHttpClientDecorator.TRACER; +import static io.opentelemetry.auto.instrumentation.commonshttpclient.HttpHeadersInjectAdapter.SETTER; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isAbstract; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -43,10 +42,16 @@ import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethod; @AutoService(Instrumenter.class) -public class ApacheHttpClientInstrumentation extends Instrumenter.Default { +public class CommonsHttpClientInstrumentation extends Instrumenter.Default { - public ApacheHttpClientInstrumentation() { - super("httpclient", "apache-httpclient", "apache-http-client"); + public CommonsHttpClientInstrumentation() { + super("apache-httpclient"); + } + + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("org.apache.commons.httpclient.HttpClient"); } @Override @@ -57,34 +62,29 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - packageName + ".HttpHeadersInjectAdapter", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - packageName + ".ApacheHttpClientDecorator" + packageName + ".CommonsHttpClientDecorator", packageName + ".HttpHeadersInjectAdapter", }; } @Override public Map, String> transformers() { + return singletonMap( isMethod() .and(named("executeMethod")) - .and(not(isAbstract())) .and(takesArguments(3)) - .and(takesArgument(0, named("org.apache.commons.httpclient.HostConfiguration"))) - .and(takesArgument(1, named("org.apache.commons.httpclient.HttpMethod"))) - .and(takesArgument(2, named("org.apache.commons.httpclient.HttpState"))), - ApacheHttpClientInstrumentation.class.getName() + "$ExecuteAdvice"); + .and(takesArgument(1, named("org.apache.commons.httpclient.HttpMethod"))), + CommonsHttpClientInstrumentation.class.getName() + "$ExecAdvice"); } - public static class ExecuteAdvice { + public static class ExecAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static SpanWithScope methodEnter(@Advice.Argument(1) final HttpMethod httpMethod) { final int callDepth = CallDepthThreadLocalMap.incrementCallDepth(HttpClient.class); if (callDepth > 0) { return null; } + final Span span = TRACER .spanBuilder(DECORATE.spanNameForRequest(httpMethod)) @@ -94,13 +94,8 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default { DECORATE.afterStart(span); DECORATE.onRequest(span, httpMethod); + TRACER.getHttpTextFormat().inject(span.getContext(), httpMethod, SETTER); - final boolean awsClientCall = - httpMethod.getRequestHeaders("amz-sdk-invocation-id").length > 0; - // AWS calls are often signed, so we can't add headers without breaking the signature. - if (!awsClientCall) { - TRACER.getHttpTextFormat().inject(span.getContext(), httpMethod, SETTER); - } return new SpanWithScope(span, scope); } diff --git a/instrumentation/apache-httpclient/apache-httpclient-3.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/v3_0/HttpHeadersInjectAdapter.java b/instrumentation/apache-httpclient/apache-httpclient-2.0/src/main/java/io/opentelemetry/auto/instrumentation/commonshttpclient/HttpHeadersInjectAdapter.java similarity index 85% rename from instrumentation/apache-httpclient/apache-httpclient-3.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/v3_0/HttpHeadersInjectAdapter.java rename to instrumentation/apache-httpclient/apache-httpclient-2.0/src/main/java/io/opentelemetry/auto/instrumentation/commonshttpclient/HttpHeadersInjectAdapter.java index b5f797a2e8..565aec347d 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-3.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/v3_0/HttpHeadersInjectAdapter.java +++ b/instrumentation/apache-httpclient/apache-httpclient-2.0/src/main/java/io/opentelemetry/auto/instrumentation/commonshttpclient/HttpHeadersInjectAdapter.java @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.apachehttpclient.v3_0; +package io.opentelemetry.auto.instrumentation.commonshttpclient; import io.opentelemetry.context.propagation.HttpTextFormat; +import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpMethod; public class HttpHeadersInjectAdapter implements HttpTextFormat.Setter { @@ -24,6 +25,6 @@ public class HttpHeadersInjectAdapter implements HttpTextFormat.Setter headers, Closure callback) { + HttpMethod httpMethod + + switch (method) { + case "GET": + httpMethod = new GetMethod(uri.toString()) + break + case "PUT": + httpMethod = new PutMethod(uri.toString()) + break + case "POST": + httpMethod = new PostMethod(uri.toString()) + break + case "HEAD": + httpMethod = new HeadMethod(uri.toString()) + break + case "DELETE": + httpMethod = new DeleteMethod(uri.toString()) + break + case "OPTIONS": + httpMethod = new OptionsMethod(uri.toString()) + break + case "TRACE": + httpMethod = new TraceMethod(uri.toString()) + break + default: + throw new RuntimeException("Unsupported method: " + method) + } + + headers.each { httpMethod.setRequestHeader(it.key, it.value) } + + try { + client.executeMethod(httpMethod) + callback?.call() + return httpMethod.getStatusCode() + } finally { + httpMethod.releaseConnection() + } + } + + @Override + String component() { + return CommonsHttpClientDecorator.DECORATE.getComponentName() + } + + @Override + boolean testRedirects() { + // Generates 4 spans + false + } +} diff --git a/instrumentation/apache-httpclient/apache-httpclient-3.0/src/test/groovy/ApacheHttpClientTest.groovy b/instrumentation/apache-httpclient/apache-httpclient-3.0/src/test/groovy/ApacheHttpClientTest.groovy deleted file mode 100644 index f00ebc4c88..0000000000 --- a/instrumentation/apache-httpclient/apache-httpclient-3.0/src/test/groovy/ApacheHttpClientTest.groovy +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2020, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import io.opentelemetry.auto.instrumentation.apachehttpclient.v3_0.ApacheHttpClientDecorator -import io.opentelemetry.auto.test.base.HttpClientTest -import org.apache.commons.httpclient.HostConfiguration -import org.apache.commons.httpclient.HttpClient -import org.apache.commons.httpclient.HttpMethod -import org.apache.commons.httpclient.HttpState -import org.apache.commons.httpclient.methods.GetMethod -import org.apache.commons.httpclient.methods.HeadMethod -import org.apache.commons.httpclient.methods.PostMethod -import org.apache.commons.httpclient.methods.PutMethod -import spock.lang.Shared - -import java.util.concurrent.ExecutionException - -abstract class ApacheHttpClientTest extends HttpClientTest { - @Shared - def client = new HttpClient() - - @Override - ApacheHttpClientDecorator decorator() { - return ApacheHttpClientDecorator.DECORATE - } - - @Override - int doRequest(String method, URI uri, Map headers, Closure callback) { - def httpMethod - switch (method) { - case "GET": - httpMethod = new GetMethod(uri.toString()) - break - case "POST": - httpMethod = new PostMethod(uri.toString()) - break - case "PUT": - httpMethod = new PutMethod(uri.toString()) - break - case "HEAD": - httpMethod = new HeadMethod(uri.toString()) - break - default: - throw new IllegalStateException("Unexpected http method: " + method) - } - - headers.entrySet().each { - httpMethod.addRequestHeader(it.key, it.value) - } - - def statusCode = executeRequest(httpMethod, uri) - callback?.call() - httpMethod.releaseConnection() - - return statusCode - } - - abstract int executeRequest(HttpMethod request, URI uri) - - @Override - boolean testCircularRedirects() { - // only creates 1 server request instead of 2 server requests before throwing exception like others - false - } - - @Override - Integer statusOnRedirectError() { - return 302 - } - - def "basic #method request with circular redirects"() { - given: - def uri = server.address.resolve("/circular-redirect") - - when: - doRequest(method, uri) - - then: - def ex = thrown(Exception) - def thrownException = ex instanceof ExecutionException ? ex.cause : ex - - and: - assertTraces(1) { - trace(0, 2) { - clientSpan(it, 0, null, method, false, false, uri, statusOnRedirectError(), thrownException) - serverSpan(it, 1, span(0)) - } - } - - where: - method = "GET" - } -} - - -class ApacheClientHttpMethod extends ApacheHttpClientTest { - @Override - int executeRequest(HttpMethod httpMethod, URI uri) { - client.executeMethod(httpMethod) - } -} - -class ApacheClientHostConfiguration extends ApacheHttpClientTest { - @Override - int executeRequest(HttpMethod httpMethod, URI uri) { - client.executeMethod(new HostConfiguration(), httpMethod) - } -} - -class ApacheClientHttpState extends ApacheHttpClientTest { - @Override - int executeRequest(HttpMethod httpMethod, URI uri) { - client.executeMethod(new HostConfiguration(), httpMethod, new HttpState()) - } -} diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientDecorator.java b/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientDecorator.java index 31b3cc9b91..2994638440 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientDecorator.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.apachehttpclient; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import org.apache.http.HttpResponse; diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java b/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java index 7c774025fe..4a4ae569f9 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/src/main/java/io/opentelemetry/auto/instrumentation/apachehttpclient/ApacheHttpClientInstrumentation.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.apachehttpclient; import static io.opentelemetry.auto.instrumentation.apachehttpclient.ApacheHttpClientDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.apachehttpclient.ApacheHttpClientDecorator.TRACER; import static io.opentelemetry.auto.instrumentation.apachehttpclient.HttpHeadersInjectAdapter.SETTER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -60,7 +60,7 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/apache/http/client/HttpClient.class")); + return hasClassesNamed("org.apache.http.client.HttpClient"); } @Override @@ -71,14 +71,11 @@ public class ApacheHttpClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - getClass().getName() + "$HelperMethods", - packageName + ".HttpHeadersInjectAdapter", - getClass().getName() + "$WrappingStatusSettingResponseHandler", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".ApacheHttpClientDecorator", + packageName + ".HttpHeadersInjectAdapter", packageName + ".HostAndRequestAsHttpUriRequest", + getClass().getName() + "$HelperMethods", + getClass().getName() + "$WrappingStatusSettingResponseHandler", }; } diff --git a/instrumentation/apache-httpclient/apache-httpclient-4.0/src/test/groovy/ApacheHttpClientResponseHandlerTest.groovy b/instrumentation/apache-httpclient/apache-httpclient-4.0/src/test/groovy/ApacheHttpClientResponseHandlerTest.groovy index 35a197ea3c..4bde0f72fb 100644 --- a/instrumentation/apache-httpclient/apache-httpclient-4.0/src/test/groovy/ApacheHttpClientResponseHandlerTest.groovy +++ b/instrumentation/apache-httpclient/apache-httpclient-4.0/src/test/groovy/ApacheHttpClientResponseHandlerTest.groovy @@ -21,7 +21,7 @@ import org.apache.http.impl.client.DefaultHttpClient import org.apache.http.message.BasicHeader import spock.lang.Shared -class ApacheHttpClientResponseHandlerTest extends HttpClientTest { +class ApacheHttpClientResponseHandlerTest extends HttpClientTest { @Shared def client = new DefaultHttpClient() @@ -50,7 +50,7 @@ class ApacheHttpClientResponseHandlerTest extends HttpClientTest extends HttpClientTest { +abstract class ApacheHttpClientTest extends HttpClientTest { @Shared def client = new DefaultHttpClient() @Override - ApacheHttpClientDecorator decorator() { - return ApacheHttpClientDecorator.DECORATE + String component() { + return ApacheHttpClientDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSClientInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSClientInstrumentation.java index 21fb4d7f52..7afde8fce9 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSClientInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSClientInstrumentation.java @@ -52,9 +52,6 @@ public final class AWSClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".AwsSdkClientDecorator", packageName + ".RequestMeta", packageName + ".TracingRequestHandler", diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSHttpClientInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSHttpClientInstrumentation.java index cb2802b876..14027411ab 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSHttpClientInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AWSHttpClientInstrumentation.java @@ -56,9 +56,7 @@ public class AWSHttpClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - packageName + ".OnErrorDecorator", - packageName + ".RequestMeta", + packageName + ".OnErrorDecorator", packageName + ".RequestMeta", }; } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AwsSdkClientDecorator.java b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AwsSdkClientDecorator.java index 51a1c9b656..658d90e0d3 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AwsSdkClientDecorator.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/AwsSdkClientDecorator.java @@ -20,7 +20,7 @@ import com.amazonaws.AmazonWebServiceResponse; import com.amazonaws.Request; import com.amazonaws.Response; import io.opentelemetry.auto.bootstrap.ContextStore; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import java.net.URI; diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/OnErrorDecorator.java b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/OnErrorDecorator.java index 3644a6f8aa..cc6a1bcbca 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/OnErrorDecorator.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/OnErrorDecorator.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.aws.v0; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; public class OnErrorDecorator extends BaseDecorator { public static final OnErrorDecorator DECORATE = new OnErrorDecorator(); diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/RequestInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/RequestInstrumentation.java index e368b0f81e..c61ecd684e 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/RequestInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/main/java/io/opentelemetry/auto/instrumentation/aws/v0/RequestInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.aws.v0; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.amazonaws.AmazonWebServiceRequest; @@ -45,7 +44,7 @@ public final class RequestInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/amazonaws/AmazonWebServiceRequest.class")); + return hasClassesNamed("com.amazonaws.AmazonWebServiceRequest"); } @Override diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/test/groovy/AWSClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/src/test/groovy/AWSClientTest.groovy index 896a3e1b71..05848b3f70 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/test/groovy/AWSClientTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/test/groovy/AWSClientTest.groovy @@ -43,7 +43,7 @@ import com.amazonaws.services.s3.AmazonS3ClientBuilder import com.amazonaws.services.sqs.AmazonSQSClientBuilder import com.amazonaws.services.sqs.model.CreateQueueRequest import com.amazonaws.services.sqs.model.SendMessageRequest -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/src/test_before_1_11_106/groovy/AWSClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/src/test_before_1_11_106/groovy/AWSClientTest.groovy index bca7eeed3d..5ab6ca411d 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/src/test_before_1_11_106/groovy/AWSClientTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/src/test_before_1_11_106/groovy/AWSClientTest.groovy @@ -30,7 +30,7 @@ import com.amazonaws.services.rds.AmazonRDSClient import com.amazonaws.services.rds.model.DeleteOptionGroupRequest import com.amazonaws.services.s3.AmazonS3Client import com.amazonaws.services.s3.S3ClientOptions -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/aws-sdk-2.2.gradle b/instrumentation/aws-sdk/aws-sdk-2.2/aws-sdk-2.2.gradle index 45c4428a9c..107b515fde 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/aws-sdk-2.2.gradle +++ b/instrumentation/aws-sdk/aws-sdk-2.2/aws-sdk-2.2.gradle @@ -25,8 +25,6 @@ dependencies { testCompile project(':instrumentation:apache-httpclient:apache-httpclient-4.0') // Also include netty instrumentation because it is used by aws async client testCompile project(':instrumentation:netty:netty-4.1') - // Needed by netty async instrumentation - testCompile project(':instrumentation:java-concurrent') testCompile group: 'software.amazon.awssdk', name: 'apache-client', version: '2.2.0' testCompile group: 'software.amazon.awssdk', name: 's3', version: '2.2.0' testCompile group: 'software.amazon.awssdk', name: 'rds', version: '2.2.0' @@ -37,7 +35,6 @@ dependencies { latestDepTestCompile project(':instrumentation:apache-httpclient:apache-httpclient-4.0') latestDepTestCompile project(':instrumentation:netty:netty-4.1') - latestDepTestCompile project(':instrumentation:java-concurrent') latestDepTestCompile group: 'software.amazon.awssdk', name: 'apache-client', version: '+' latestDepTestCompile group: 'software.amazon.awssdk', name: 's3', version: '+' diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AbstractAwsClientInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AbstractAwsClientInstrumentation.java index 9fcb87145e..42e9d8323c 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AbstractAwsClientInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AbstractAwsClientInstrumentation.java @@ -27,9 +27,6 @@ public abstract class AbstractAwsClientInstrumentation extends Instrumenter.Defa @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".AwsSdkClientDecorator", packageName + ".TracingExecutionInterceptor", packageName + ".TracingExecutionInterceptor$ScopeHolder" diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsClientInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsClientInstrumentation.java index 2cd7f1cc34..aa7e603079 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsClientInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsClientInstrumentation.java @@ -15,6 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.aws.v2; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -35,6 +36,12 @@ import software.amazon.awssdk.core.client.builder.SdkClientBuilder; @AutoService(Instrumenter.class) public final class AwsClientInstrumentation extends AbstractAwsClientInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("software.amazon.awssdk.core.client.builder.SdkClientBuilder"); + } + @Override public ElementMatcher typeMatcher() { return nameStartsWith("software.amazon.awssdk.") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsHttpClientInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsHttpClientInstrumentation.java index e309ea57df..2c334a7a42 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsHttpClientInstrumentation.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java/io/opentelemetry/auto/instrumentation/aws/v2/AwsHttpClientInstrumentation.java @@ -16,6 +16,7 @@ package io.opentelemetry.auto.instrumentation.aws.v2; import static io.opentelemetry.auto.instrumentation.aws.v2.TracingExecutionInterceptor.ScopeHolder.CURRENT; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -40,6 +41,13 @@ import software.amazon.awssdk.core.internal.http.pipeline.stages.MakeAsyncHttpRe @AutoService(Instrumenter.class) public final class AwsHttpClientInstrumentation extends AbstractAwsClientInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed( + "software.amazon.awssdk.core.internal.http.pipeline.stages.MakeHttpRequestStage"); + } + @Override public ElementMatcher typeMatcher() { return nameStartsWith("software.amazon.awssdk.") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/AwsSdkClientDecorator.java b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/AwsSdkClientDecorator.java index 6f3aa0dc6e..24b855007e 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/AwsSdkClientDecorator.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/AwsSdkClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.aws.v2; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/TracingExecutionInterceptor.java b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/TracingExecutionInterceptor.java index 4a72955c61..a708c44245 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/TracingExecutionInterceptor.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/src/main/java8/io/opentelemetry/auto/instrumentation/aws/v2/TracingExecutionInterceptor.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.aws.v2; -import static io.opentelemetry.auto.decorator.HttpClientDecorator.DEFAULT_SPAN_NAME; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator.DEFAULT_SPAN_NAME; import static io.opentelemetry.auto.instrumentation.aws.v2.AwsSdkClientDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.aws.v2.AwsSdkClientDecorator.TRACER; import static io.opentelemetry.trace.Span.Kind.CLIENT; diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/src/test/groovy/AwsClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/src/test/groovy/AwsClientTest.groovy index 3d174567a8..39f7155eb9 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/src/test/groovy/AwsClientTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/src/test/groovy/AwsClientTest.groovy @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientDecorator.java b/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientDecorator.java index 11af1f5c57..fbc5b617cd 100644 --- a/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientDecorator.java +++ b/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientDecorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.datastax.cassandra; import com.datastax.driver.core.Host; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Session; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java b/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java index 67cae01178..0a4f0a8619 100644 --- a/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java +++ b/instrumentation/cassandra-3.0/src/main/java/io/opentelemetry/auto/instrumentation/datastax/cassandra/CassandraClientInstrumentation.java @@ -47,9 +47,6 @@ public class CassandraClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".CassandraClientDecorator", packageName + ".TracingSession", packageName + ".TracingSession$1", diff --git a/instrumentation/cdi-testing/cdi-testing.gradle b/instrumentation/cdi-testing/cdi-testing.gradle index eb86a04bf2..e8e644b1e9 100644 --- a/instrumentation/cdi-testing/cdi-testing.gradle +++ b/instrumentation/cdi-testing/cdi-testing.gradle @@ -8,8 +8,6 @@ testSets { } dependencies { - testCompile project(':instrumentation:java-concurrent') - testCompile group: 'org.jboss.weld', name: 'weld-core', version: '2.3.0.Final' testCompile group: 'org.jboss.weld.se', name: 'weld-se', version: '2.3.0.Final' testCompile group: 'org.jboss.weld.se', name: 'weld-se-core', version: '2.3.0.Final' diff --git a/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseBucketInstrumentation.java b/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseBucketInstrumentation.java index 00d725916e..db8c9c3e76 100644 --- a/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseBucketInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseBucketInstrumentation.java @@ -51,9 +51,6 @@ public class CouchbaseBucketInstrumentation extends Instrumenter.Default { public String[] helperClassNames() { return new String[] { "rx.__OpenTelemetryTracingUtil", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.rxjava.SpanFinishingSubscription", "io.opentelemetry.auto.instrumentation.rxjava.TracedSubscriber", "io.opentelemetry.auto.instrumentation.rxjava.TracedOnSubscribe", @@ -81,7 +78,7 @@ public class CouchbaseBucketInstrumentation extends Instrumenter.Default { return CallDepthThreadLocalMap.incrementCallDepth(CouchbaseCluster.class); } - @Advice.OnMethodExit(onThrowable = Throwable.class) + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void subscribeResult( @Advice.Enter final int callDepth, @Advice.Origin final Method method, diff --git a/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClientDecorator.java b/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClientDecorator.java index 77f18cb041..ab7f080649 100644 --- a/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClientDecorator.java +++ b/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClientDecorator.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.couchbase.client; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; class CouchbaseClientDecorator extends DatabaseClientDecorator { diff --git a/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClusterInstrumentation.java b/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClusterInstrumentation.java index 80d26bfe76..1033e2283b 100644 --- a/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClusterInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.0/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseClusterInstrumentation.java @@ -51,9 +51,6 @@ public class CouchbaseClusterInstrumentation extends Instrumenter.Default { public String[] helperClassNames() { return new String[] { "rx.__OpenTelemetryTracingUtil", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.rxjava.SpanFinishingSubscription", "io.opentelemetry.auto.instrumentation.rxjava.TracedSubscriber", "io.opentelemetry.auto.instrumentation.rxjava.TracedOnSubscribe", @@ -76,7 +73,7 @@ public class CouchbaseClusterInstrumentation extends Instrumenter.Default { return CallDepthThreadLocalMap.incrementCallDepth(CouchbaseCluster.class); } - @Advice.OnMethodExit(onThrowable = Throwable.class) + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void subscribeResult( @Advice.Enter final int callDepth, @Advice.Origin final Method method, diff --git a/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseAsyncClientTest.groovy b/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseAsyncClientTest.groovy index 50a765fdbc..5547398b81 100644 --- a/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseAsyncClientTest.groovy +++ b/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseAsyncClientTest.groovy @@ -19,6 +19,7 @@ import com.couchbase.client.java.document.JsonDocument import com.couchbase.client.java.document.json.JsonObject import com.couchbase.client.java.env.CouchbaseEnvironment import com.couchbase.client.java.query.N1qlQuery +import spock.lang.Retry import spock.lang.Unroll import spock.util.concurrent.BlockingVariable import util.AbstractCouchbaseTest @@ -28,6 +29,7 @@ import java.util.concurrent.TimeUnit import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace +@Retry @Unroll class CouchbaseAsyncClientTest extends AbstractCouchbaseTest { static final int TIMEOUT = 10 diff --git a/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseClientTest.groovy b/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseClientTest.groovy index 5cec40686d..f4a2879728 100644 --- a/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseClientTest.groovy +++ b/instrumentation/couchbase/couchbase-2.0/src/test/groovy/CouchbaseClientTest.groovy @@ -20,12 +20,14 @@ import com.couchbase.client.java.document.JsonDocument import com.couchbase.client.java.document.json.JsonObject import com.couchbase.client.java.env.CouchbaseEnvironment import com.couchbase.client.java.query.N1qlQuery +import spock.lang.Retry import spock.lang.Unroll import util.AbstractCouchbaseTest import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace +@Retry @Unroll class CouchbaseClientTest extends AbstractCouchbaseTest { def "test hasBucket #type"() { diff --git a/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy b/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy index 22a827f02e..2528ac121e 100644 --- a/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy +++ b/instrumentation/couchbase/couchbase-2.0/src/test/groovy/springdata/CouchbaseSpringTemplateTest.groovy @@ -29,7 +29,7 @@ import util.AbstractCouchbaseTest import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace -@Retry(count = 5, delay = 1) +@Retry(count = 10, delay = 5) @Unroll class CouchbaseSpringTemplateTest extends AbstractCouchbaseTest { diff --git a/instrumentation/couchbase/couchbase-2.6/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java b/instrumentation/couchbase/couchbase-2.6/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java index d198d72089..f0fcfeb439 100644 --- a/instrumentation/couchbase/couchbase-2.6/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java +++ b/instrumentation/couchbase/couchbase-2.6/src/main/java/io/opentelemetry/auto/instrumentation/couchbase/client/CouchbaseNetworkInstrumentation.java @@ -15,13 +15,12 @@ */ package io.opentelemetry.auto.instrumentation.couchbase.client; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -48,9 +47,7 @@ public class CouchbaseNetworkInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not( - classLoaderHasNoResources( - "com/couchbase/client/core/endpoint/AbstractGenericHandler.class")); + return hasClassesNamed("com.couchbase.client.core.endpoint.AbstractGenericHandler"); } @Override diff --git a/instrumentation/dropwizard-testing/dropwizard-testing.gradle b/instrumentation/dropwizard-testing/dropwizard-testing.gradle index 27133f30b5..fbef74cc8f 100644 --- a/instrumentation/dropwizard-testing/dropwizard-testing.gradle +++ b/instrumentation/dropwizard-testing/dropwizard-testing.gradle @@ -9,7 +9,6 @@ apply from: "${rootDir}/gradle/instrumentation.gradle" //} dependencies { - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:jaxrs:jaxrs-2.0') testCompile project(':instrumentation:servlet:request-3.0') diff --git a/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy b/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy index 9213d60c38..bc1c65711f 100644 --- a/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy +++ b/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy @@ -23,12 +23,12 @@ import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags import io.opentelemetry.auto.instrumentation.jaxrs2.JaxRsAnnotationsDecorator -import io.opentelemetry.auto.instrumentation.servlet3.Servlet3Decorator import io.opentelemetry.auto.test.asserts.TraceAssert import io.opentelemetry.auto.test.base.HttpServerTest import io.opentelemetry.auto.test.utils.PortUtils import io.opentelemetry.sdk.trace.SpanData import org.eclipse.jetty.servlet.ServletHandler +import spock.lang.Retry import javax.ws.rs.GET import javax.ws.rs.Path @@ -45,7 +45,9 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCC import static io.opentelemetry.trace.Span.Kind.INTERNAL import static io.opentelemetry.trace.Span.Kind.SERVER -class DropwizardTest extends HttpServerTest { +// Work around for: address already in use +@Retry +class DropwizardTest extends HttpServerTest { @Override DropwizardTestSupport startServer(int port) { @@ -72,13 +74,8 @@ class DropwizardTest extends HttpServerTest classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("io/dropwizard/views/ViewRenderer.class")); + return hasClassesNamed("io.dropwizard.views.ViewRenderer"); } @Override @@ -61,9 +60,7 @@ public final class DropwizardViewInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", getClass().getName() + "$RenderAdvice" - }; + return new String[] {getClass().getName() + "$RenderAdvice"}; } @Override diff --git a/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java b/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java index 499745862e..cfef8c3458 100644 --- a/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java +++ b/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchRestClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.elasticsearch; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.auto.instrumentation.api.Tags; diff --git a/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchTransportClientDecorator.java b/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchTransportClientDecorator.java index c07c99ceef..3edb8fc399 100644 --- a/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchTransportClientDecorator.java +++ b/instrumentation/elasticsearch/elasticsearch-common/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch/ElasticsearchTransportClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.elasticsearch; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy index 520fde288e..573c8b82a7 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ import groovy.json.JsonSlurper -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5RestClientInstrumentation.java b/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5RestClientInstrumentation.java index 028fb3235e..2bb62421fb 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5RestClientInstrumentation.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5RestClientInstrumentation.java @@ -45,9 +45,6 @@ public class Elasticsearch5RestClientInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.elasticsearch.ElasticsearchRestClientDecorator", packageName + ".RestResponseListener", }; diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/test/groovy/Elasticsearch5RestClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/test/groovy/Elasticsearch5RestClientTest.groovy index 2c6198e191..4d3a947371 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/test/groovy/Elasticsearch5RestClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/src/test/groovy/Elasticsearch5RestClientTest.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ import groovy.json.JsonSlurper -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy index 4e89c0c224..14f4fb48cf 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/latestDepTest/groovy/Elasticsearch6RestClientTest.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ import groovy.json.JsonSlurper -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6_4/Elasticsearch6RestClientInstrumentation.java b/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6_4/Elasticsearch6RestClientInstrumentation.java index 021e42cfa1..2c29298f6f 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6_4/Elasticsearch6RestClientInstrumentation.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6_4/Elasticsearch6RestClientInstrumentation.java @@ -46,9 +46,6 @@ public class Elasticsearch6RestClientInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.elasticsearch.ElasticsearchRestClientDecorator", packageName + ".RestResponseListener", }; diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy index 520fde288e..573c8b82a7 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/src/test/groovy/Elasticsearch6RestClientTest.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ import groovy.json.JsonSlurper -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/Elasticsearch2NodeClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/Elasticsearch2NodeClientTest.groovy index f213a13d59..49caf4fdfe 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/Elasticsearch2NodeClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/Elasticsearch2NodeClientTest.groovy @@ -177,15 +177,7 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner { result.index == indexName and: - assertTraces(6) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(5) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -236,23 +228,7 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner { } } } - trace(3, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - "elasticsearch.request.indices" indexName - } - } - } - trace(4, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -268,8 +244,23 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner { "elasticsearch.request.write.type" indexType } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + "elasticsearch.request.indices" indexName + } + } } - trace(5, 1) { + trace(4, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy index f8a78f5d54..662dbd9f73 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy @@ -83,13 +83,8 @@ class Elasticsearch2SpringRepositoryTest extends AgentTestRunner { repo.index(doc) == doc and: - def excludes = { - // sometimes PutMappingAction is present and sometimes it is not - // (only seems to happen with Elasticsearch 2.x, later versions seem to always have PutMappingAction) - it[0].attributes[MoreTags.RESOURCE_NAME].stringValue == "PutMappingAction" - } - assertTracesWithFilter(2, excludes) { - trace(0, 1) { + assertTraces(2) { + trace(0, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -105,6 +100,21 @@ class Elasticsearch2SpringRepositoryTest extends AgentTestRunner { "elasticsearch.request.write.type" "doc" } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + "elasticsearch.request.indices" indexName + } + } } trace(1, 1) { span(0) { diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy index ea190e0daa..182cd0bfce 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/latestDepTest/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy @@ -145,15 +145,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { template.queryForList(query, Doc) == [new Doc()] and: - assertTraces(7) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(6) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -202,10 +194,26 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { } } } - trace(3, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "IndexAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "IndexAction" + "elasticsearch.request" "IndexRequest" + "elasticsearch.request.indices" indexName + "elasticsearch.request.write.type" indexType + } + } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) tags { "$MoreTags.SERVICE_NAME" "elasticsearch" "$MoreTags.RESOURCE_NAME" "PutMappingAction" @@ -219,23 +227,6 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { } } trace(4, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "IndexAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "IndexAction" - "elasticsearch.request" "IndexRequest" - "elasticsearch.request.indices" indexName - "elasticsearch.request.write.type" indexType - } - } - } - trace(5, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -254,7 +245,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { } } } - trace(6, 1) { + trace(5, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -298,7 +289,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { .withId("b") .build()) template.refresh(indexName) - TEST_WRITER.waitForTraces(6) + TEST_WRITER.waitForTraces(5) TEST_WRITER.clear() and: diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch2/Elasticsearch2TransportClientInstrumentation.java b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch2/Elasticsearch2TransportClientInstrumentation.java index 29f95ab62e..ab99beb082 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch2/Elasticsearch2TransportClientInstrumentation.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch2/Elasticsearch2TransportClientInstrumentation.java @@ -59,9 +59,6 @@ public class Elasticsearch2TransportClientInstrumentation extends Instrumenter.D "com.google.common.base.Joiner$1", "com.google.common.base.Joiner$2", "com.google.common.base.Joiner$MapJoiner", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.elasticsearch.ElasticsearchTransportClientDecorator", packageName + ".TransportActionListener", }; diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/Elasticsearch2NodeClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/Elasticsearch2NodeClientTest.groovy index 7411dd981e..240c4328c3 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/Elasticsearch2NodeClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/Elasticsearch2NodeClientTest.groovy @@ -177,15 +177,7 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner { result.index == indexName and: - assertTraces(6) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(5) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -239,23 +231,7 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner { } } } - trace(3, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - "elasticsearch.request.indices" indexName - } - } - } - trace(4, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -274,8 +250,23 @@ class Elasticsearch2NodeClientTest extends AgentTestRunner { "elasticsearch.request.write.type" indexType } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + "elasticsearch.request.indices" indexName + } + } } - trace(5, 1) { + trace(4, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy index 087a4eccd3..d9a4376303 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringRepositoryTest.groovy @@ -83,13 +83,8 @@ class Elasticsearch2SpringRepositoryTest extends AgentTestRunner { repo.index(doc) == doc and: - def excludes = { - // sometimes PutMappingAction is present and sometimes it is not - // (only seems to happen with Elasticsearch 2.x, later versions seem to always have PutMappingAction) - it[0].attributes[MoreTags.RESOURCE_NAME].stringValue == "PutMappingAction" - } - assertTracesWithFilter(2, excludes) { - trace(0, 1) { + assertTraces(2) { + trace(0, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -108,6 +103,21 @@ class Elasticsearch2SpringRepositoryTest extends AgentTestRunner { "elasticsearch.request.write.type" "doc" } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + "elasticsearch.request.indices" indexName + } + } } trace(1, 1) { span(0) { diff --git a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy index a600cad187..53d157d229 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-2.0/src/test/groovy/springdata/Elasticsearch2SpringTemplateTest.groovy @@ -145,15 +145,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { template.queryForList(query, Doc) == [new Doc()] and: - assertTraces(7) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(6) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -202,23 +194,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { } } } - trace(3, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - "elasticsearch.request.indices" indexName - } - } - } - trace(4, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -237,8 +213,23 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { "elasticsearch.request.write.type" indexType } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + "elasticsearch.request.indices" indexName + } + } } - trace(5, 1) { + trace(4, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -257,7 +248,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { } } } - trace(6, 1) { + trace(5, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -300,7 +291,7 @@ class Elasticsearch2SpringTemplateTest extends AgentTestRunner { .withId("b") .build()) template.refresh(indexName) - TEST_WRITER.waitForTraces(6) + TEST_WRITER.waitForTraces(5) TEST_WRITER.clear() and: diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5TransportClientInstrumentation.java b/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5TransportClientInstrumentation.java index ead506d347..67c41dde7b 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5TransportClientInstrumentation.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5/Elasticsearch5TransportClientInstrumentation.java @@ -59,9 +59,6 @@ public class Elasticsearch5TransportClientInstrumentation extends Instrumenter.D "com.google.common.base.Joiner$1", "com.google.common.base.Joiner$2", "com.google.common.base.Joiner$MapJoiner", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.elasticsearch.ElasticsearchTransportClientDecorator", packageName + ".TransportActionListener", }; diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/test/groovy/Elasticsearch5NodeClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/test/groovy/Elasticsearch5NodeClientTest.groovy index dfe6bbb32b..4dbda6cf5f 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/test/groovy/Elasticsearch5NodeClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.0/src/test/groovy/Elasticsearch5NodeClientTest.groovy @@ -184,15 +184,7 @@ class Elasticsearch5NodeClientTest extends AgentTestRunner { result.index == indexName and: - assertTraces(6) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(5) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -243,22 +235,7 @@ class Elasticsearch5NodeClientTest extends AgentTestRunner { } } } - trace(3, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - } - } - } - trace(4, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -278,8 +255,22 @@ class Elasticsearch5NodeClientTest extends AgentTestRunner { "elasticsearch.shard.replication.failed" 0 } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + } + } } - trace(5, 1) { + trace(4, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5_3/Elasticsearch53TransportClientInstrumentation.java b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5_3/Elasticsearch53TransportClientInstrumentation.java index 50ca527f3c..7a8ab40756 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5_3/Elasticsearch53TransportClientInstrumentation.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch5_3/Elasticsearch53TransportClientInstrumentation.java @@ -60,9 +60,6 @@ public class Elasticsearch53TransportClientInstrumentation extends Instrumenter. "com.google.common.base.Joiner$1", "com.google.common.base.Joiner$2", "com.google.common.base.Joiner$MapJoiner", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.elasticsearch.ElasticsearchTransportClientDecorator", packageName + ".TransportActionListener", }; diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/Elasticsearch53NodeClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/Elasticsearch53NodeClientTest.groovy index c541e3062c..86ba0961ef 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/Elasticsearch53NodeClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/Elasticsearch53NodeClientTest.groovy @@ -184,15 +184,7 @@ class Elasticsearch53NodeClientTest extends AgentTestRunner { result.index == indexName and: - assertTraces(6) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(5) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -243,22 +235,7 @@ class Elasticsearch53NodeClientTest extends AgentTestRunner { } } } - trace(3, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - } - } - } - trace(4, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -279,8 +256,22 @@ class Elasticsearch53NodeClientTest extends AgentTestRunner { "elasticsearch.shard.replication.failed" 0 } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + } + } } - trace(5, 1) { + trace(4, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy index 78ce485706..af8fd22495 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringRepositoryTest.groovy @@ -126,8 +126,8 @@ class Elasticsearch53SpringRepositoryTest extends AgentTestRunner { repo.index(doc) == doc and: - assertTraces(2) { - trace(0, 3) { + assertTraces(1) { + trace(0, 4) { sortSpans { sort(spans) } @@ -161,6 +161,20 @@ class Elasticsearch53SpringRepositoryTest extends AgentTestRunner { } } span(2) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(1) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + } + } + span(3) { operationName "elasticsearch.query" spanKind CLIENT childOf(span(0)) @@ -179,21 +193,6 @@ class Elasticsearch53SpringRepositoryTest extends AgentTestRunner { } } } - trace(1, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - } - } - } } TEST_WRITER.clear() diff --git a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringTemplateTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringTemplateTest.groovy index 80cad05d5b..8de51a5beb 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringTemplateTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-5.3/src/test/groovy/springdata/Elasticsearch53SpringTemplateTest.groovy @@ -164,18 +164,7 @@ class Elasticsearch53SpringTemplateTest extends AgentTestRunner { template.queryForList(query, Doc) == [new Doc()] and: - def excludes = { - trace -> IGNORED_ACTIONS.contains(trace[0].attributes[MoreTags.RESOURCE_NAME].stringValue) - } - assertTracesWithFilter(7, excludes) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[3][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[3] - traces[3] = traces[4] - traces[4] = tmp - } - } + assertTraces(6) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -224,22 +213,7 @@ class Elasticsearch53SpringTemplateTest extends AgentTestRunner { } } } - trace(3, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - } - } - } - trace(4, 1) { + trace(3, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -260,8 +234,22 @@ class Elasticsearch53SpringTemplateTest extends AgentTestRunner { "elasticsearch.shard.replication.total" 2 } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + } + } } - trace(5, 1) { + trace(4, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -280,7 +268,7 @@ class Elasticsearch53SpringTemplateTest extends AgentTestRunner { } } } - trace(6, 1) { + trace(5, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -324,7 +312,7 @@ class Elasticsearch53SpringTemplateTest extends AgentTestRunner { .withId("b") .build()) template.refresh(indexName) - TEST_WRITER.waitForTraces(6) + TEST_WRITER.waitForTraces(5) TEST_WRITER.clear() and: diff --git a/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6/Elasticsearch6TransportClientInstrumentation.java b/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6/Elasticsearch6TransportClientInstrumentation.java index 6522186fd1..6e85ed2ba4 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6/Elasticsearch6TransportClientInstrumentation.java +++ b/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/main/java/io/opentelemetry/auto/instrumentation/elasticsearch6/Elasticsearch6TransportClientInstrumentation.java @@ -63,9 +63,6 @@ public class Elasticsearch6TransportClientInstrumentation extends Instrumenter.D "com.google.common.base.Joiner$1", "com.google.common.base.Joiner$2", "com.google.common.base.Joiner$MapJoiner", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.elasticsearch.ElasticsearchTransportClientDecorator", packageName + ".TransportActionListener", }; diff --git a/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/test/groovy/Elasticsearch6NodeClientTest.groovy b/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/test/groovy/Elasticsearch6NodeClientTest.groovy index 567991100e..40f5e209f4 100644 --- a/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/test/groovy/Elasticsearch6NodeClientTest.groovy +++ b/instrumentation/elasticsearch/elasticsearch-transport-6.0/src/test/groovy/Elasticsearch6NodeClientTest.groovy @@ -180,15 +180,7 @@ class Elasticsearch6NodeClientTest extends AgentTestRunner { result.index == indexName and: - assertTraces(5) { - sortTraces { - // IndexAction and PutMappingAction run in separate threads and so their order is not always the same - if (traces[2][0].attributes[MoreTags.RESOURCE_NAME].stringValue == "IndexAction") { - def tmp = traces[2] - traces[2] = traces[3] - traces[3] = tmp - } - } + assertTraces(4) { trace(0, 1) { span(0) { operationName "elasticsearch.query" @@ -224,22 +216,7 @@ class Elasticsearch6NodeClientTest extends AgentTestRunner { } } } - trace(2, 1) { - span(0) { - operationName "elasticsearch.query" - spanKind CLIENT - tags { - "$MoreTags.SERVICE_NAME" "elasticsearch" - "$MoreTags.RESOURCE_NAME" "PutMappingAction" - "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH - "$Tags.COMPONENT" "elasticsearch-java" - "$Tags.DB_TYPE" "elasticsearch" - "elasticsearch.action" "PutMappingAction" - "elasticsearch.request" "PutMappingRequest" - } - } - } - trace(3, 1) { + trace(2, 2) { span(0) { operationName "elasticsearch.query" spanKind CLIENT @@ -260,8 +237,22 @@ class Elasticsearch6NodeClientTest extends AgentTestRunner { "elasticsearch.shard.replication.failed" 0 } } + span(1) { + operationName "elasticsearch.query" + spanKind CLIENT + childOf span(0) + tags { + "$MoreTags.SERVICE_NAME" "elasticsearch" + "$MoreTags.RESOURCE_NAME" "PutMappingAction" + "$MoreTags.SPAN_TYPE" SpanTypes.ELASTICSEARCH + "$Tags.COMPONENT" "elasticsearch-java" + "$Tags.DB_TYPE" "elasticsearch" + "elasticsearch.action" "PutMappingAction" + "elasticsearch.request" "PutMappingRequest" + } + } } - trace(4, 1) { + trace(3, 1) { span(0) { operationName "elasticsearch.query" spanKind CLIENT diff --git a/instrumentation/finatra-2.9/finatra-2.9.gradle b/instrumentation/finatra-2.9/finatra-2.9.gradle index 6af0c27101..99b6fcd3fd 100644 --- a/instrumentation/finatra-2.9/finatra-2.9.gradle +++ b/instrumentation/finatra-2.9/finatra-2.9.gradle @@ -33,18 +33,15 @@ dependencies { compileOnly group: 'com.twitter', name: 'finatra-http_2.11', version: '2.9.0' testCompile project(':instrumentation:netty:netty-4.1') - testCompile project(':instrumentation:java-concurrent') testCompile group: 'com.twitter', name: 'finatra-http_2.11', version: '19.12.0' testCompile(group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.10') { force = true } - // Required for older versions of finatra on JDKs >= 11 testCompile group: 'com.sun.activation', name: 'javax.activation', version: '1.2.0' latestDepTestCompile project(':instrumentation:netty:netty-4.1') - latestDepTestCompile project(':instrumentation:java-concurrent') latestDepTestCompile group: 'com.twitter', name: 'finatra-http_2.11', version: '+' } diff --git a/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraDecorator.java b/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraDecorator.java index c6b20970ff..8ca2076673 100644 --- a/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraDecorator.java +++ b/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraDecorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.finatra; import com.twitter.finagle.http.Request; import com.twitter.finagle.http.Response; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraInstrumentation.java b/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraInstrumentation.java index 6137507450..3b9ade502b 100644 --- a/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraInstrumentation.java +++ b/instrumentation/finatra-2.9/src/main/java/io/opentelemetry/auto/instrumentation/finatra/FinatraInstrumentation.java @@ -17,13 +17,12 @@ package io.opentelemetry.auto.instrumentation.finatra; import static io.opentelemetry.auto.instrumentation.finatra.FinatraDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.finatra.FinatraDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -57,18 +56,14 @@ public class FinatraInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", - packageName + ".FinatraDecorator", - FinatraInstrumentation.class.getName() + "$Listener" + packageName + ".FinatraDecorator", FinatraInstrumentation.class.getName() + "$Listener" }; } @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/twitter/finatra/http/internal/routing/Route.class")); + return hasClassesNamed("com.twitter.finatra.http.internal.routing.Route"); } @Override @@ -110,7 +105,7 @@ public class FinatraInstrumentation extends Instrumenter.Default { return new SpanWithScope(span, TRACER.withSpan(span)); } - @Advice.OnMethodExit(onThrowable = Throwable.class) + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void setupCallback( @Advice.Enter final SpanWithScope spanWithScope, @Advice.Thrown final Throwable throwable, diff --git a/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy b/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy index 32ade8d64c..c29515aab2 100644 --- a/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy +++ b/instrumentation/finatra-2.9/src/test/groovy/FinatraServerTest.groovy @@ -34,7 +34,7 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCC import static io.opentelemetry.trace.Span.Kind.INTERNAL import static io.opentelemetry.trace.Span.Kind.SERVER -class FinatraServerTest extends HttpServerTest { +class FinatraServerTest extends HttpServerTest { private static final Duration TIMEOUT = Duration.fromSeconds(5) private static final long STARTUP_TIMEOUT = 40 * 1000 @@ -76,8 +76,8 @@ class FinatraServerTest extends HttpServerTest { } @Override - FinatraDecorator decorator() { - return FinatraDecorator.DECORATE + String component() { + return FinatraDecorator.DECORATE.getComponentName() } @Override @@ -120,7 +120,7 @@ class FinatraServerTest extends HttpServerTest { tags { "$MoreTags.RESOURCE_NAME" "$method ${endpoint == PATH_PARAM ? "/path/:id/param" : endpoint.resolvePath(address).path}" "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" serverDecorator.getComponentName() + "$Tags.COMPONENT" component "$MoreTags.NET_PEER_PORT" Long "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional "$Tags.HTTP_URL" { it == "${endpoint.resolve(address)}" || it == "${endpoint.resolveWithoutFragment(address)}" } diff --git a/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeDecorator.java b/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeDecorator.java index 44d5225600..ac966b9177 100644 --- a/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeDecorator.java +++ b/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.geode; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; import org.apache.geode.cache.Region; diff --git a/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeInstrumentation.java b/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeInstrumentation.java index 1973a8c448..8c707bb566 100644 --- a/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeInstrumentation.java +++ b/instrumentation/geode-1.4/src/main/java/io/opentelemetry/auto/instrumentation/geode/GeodeInstrumentation.java @@ -53,9 +53,6 @@ public class GeodeInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".GeodeDecorator", }; } diff --git a/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientDecorator.java b/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientDecorator.java index 459d2dc114..eddc67b43e 100644 --- a/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientDecorator.java +++ b/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientDecorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.googlehttpclient; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java b/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java index 2a0d3c4e3e..21dcc799f9 100644 --- a/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java +++ b/instrumentation/google-http-client-1.19/src/main/java/io/opentelemetry/auto/instrumentation/googlehttpclient/GoogleHttpClientInstrumentation.java @@ -65,13 +65,8 @@ public class GoogleHttpClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".GoogleHttpClientDecorator", packageName + ".RequestState", - getClass().getName() + "$GoogleHttpClientAdvice", - getClass().getName() + "$GoogleHttpClientAsyncAdvice", packageName + ".HeadersInjectAdapter" }; } diff --git a/instrumentation/google-http-client-1.19/src/test/groovy/AbstractGoogleHttpClientTest.groovy b/instrumentation/google-http-client-1.19/src/test/groovy/AbstractGoogleHttpClientTest.groovy index dae9d2eecc..8ff2e3dfa9 100644 --- a/instrumentation/google-http-client-1.19/src/test/groovy/AbstractGoogleHttpClientTest.groovy +++ b/instrumentation/google-http-client-1.19/src/test/groovy/AbstractGoogleHttpClientTest.groovy @@ -26,7 +26,7 @@ import spock.lang.Shared import static io.opentelemetry.trace.Span.Kind.CLIENT -abstract class AbstractGoogleHttpClientTest extends HttpClientTest { +abstract class AbstractGoogleHttpClientTest extends HttpClientTest { @Shared def requestFactory = new NetHttpTransport().createRequestFactory() @@ -52,8 +52,8 @@ abstract class AbstractGoogleHttpClientTest extends HttpClientTest { +class GrizzlyTest extends HttpServerTest { static { System.setProperty("ota.integration.grizzly.enabled", "true") @@ -52,8 +52,8 @@ class GrizzlyTest extends HttpServerTest { } @Override - GrizzlyDecorator decorator() { - return GrizzlyDecorator.DECORATE + String component() { + return GrizzlyDecorator.DECORATE.getComponentName() } static class SimpleExceptionMapper implements ExceptionMapper { diff --git a/instrumentation/grpc-1.5/grpc-1.5.gradle b/instrumentation/grpc-1.5/grpc-1.5.gradle index ff9b39408d..3ea843c3f3 100644 --- a/instrumentation/grpc-1.5/grpc-1.5.gradle +++ b/instrumentation/grpc-1.5/grpc-1.5.gradle @@ -47,6 +47,7 @@ dependencies { testCompile group: 'io.grpc', name: 'grpc-netty', version: grpcVersion testCompile group: 'io.grpc', name: 'grpc-protobuf', version: grpcVersion testCompile group: 'io.grpc', name: 'grpc-stub', version: grpcVersion + testCompile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.3.2' latestDepTestCompile sourceSets.test.output // include the protobuf generated classes latestDepTestCompile group: 'io.grpc', name: 'grpc-netty', version: '+' diff --git a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientBuilderInstrumentation.java b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientBuilderInstrumentation.java index 56ab6081c6..cd3f1a6e32 100644 --- a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientBuilderInstrumentation.java +++ b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientBuilderInstrumentation.java @@ -51,14 +51,12 @@ public class GrpcClientBuilderInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.instrumentation.grpc.client.GrpcInjectAdapter", - "io.opentelemetry.auto.instrumentation.grpc.client.TracingClientInterceptor", - "io.opentelemetry.auto.instrumentation.grpc.client.TracingClientInterceptor$TracingClientCall", - "io.opentelemetry.auto.instrumentation.grpc.client.TracingClientInterceptor$TracingClientCallListener", - "io.opentelemetry.auto.instrumentation.grpc.common.GrpcHelper", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".GrpcClientDecorator", + packageName + ".GrpcInjectAdapter", + packageName + ".TracingClientInterceptor", + packageName + ".TracingClientInterceptor$TracingClientCall", + packageName + ".TracingClientInterceptor$TracingClientCallListener", + "io.opentelemetry.auto.instrumentation.grpc.common.GrpcHelper", }; } diff --git a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java index 732015b839..31fef09580 100644 --- a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java +++ b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/client/GrpcClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.grpc.client; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Status; diff --git a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerBuilderInstrumentation.java b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerBuilderInstrumentation.java index 46556bf0b1..a26c6bc4ad 100644 --- a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerBuilderInstrumentation.java +++ b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerBuilderInstrumentation.java @@ -44,14 +44,12 @@ public class GrpcServerBuilderInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.instrumentation.grpc.server.TracingServerInterceptor", - "io.opentelemetry.auto.instrumentation.grpc.server.TracingServerInterceptor$TracingServerCall", - "io.opentelemetry.auto.instrumentation.grpc.server.TracingServerInterceptor$TracingServerCallListener", - "io.opentelemetry.auto.instrumentation.grpc.common.GrpcHelper", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", packageName + ".GrpcServerDecorator", - packageName + ".GrpcExtractAdapter" + packageName + ".GrpcExtractAdapter", + packageName + ".TracingServerInterceptor", + packageName + ".TracingServerInterceptor$TracingServerCall", + packageName + ".TracingServerInterceptor$TracingServerCallListener", + "io.opentelemetry.auto.instrumentation.grpc.common.GrpcHelper", }; } diff --git a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java index ecba0fd59e..51a549e2c5 100644 --- a/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java +++ b/instrumentation/grpc-1.5/src/main/java/io/opentelemetry/auto/instrumentation/grpc/server/GrpcServerDecorator.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.grpc.server; import io.grpc.Status; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ServerDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/grpc-1.5/src/test/groovy/GrpcStreamingTest.groovy b/instrumentation/grpc-1.5/src/test/groovy/GrpcStreamingTest.groovy index c8278a46b0..10876810fe 100644 --- a/instrumentation/grpc-1.5/src/test/groovy/GrpcStreamingTest.groovy +++ b/instrumentation/grpc-1.5/src/test/groovy/GrpcStreamingTest.groovy @@ -49,6 +49,7 @@ class GrpcStreamingTest extends AgentTestRunner { return new StreamObserver() { @Override void onNext(Helloworld.Response value) { + serverReceived << value.message (1..msgCount).each { @@ -107,6 +108,10 @@ class GrpcStreamingTest extends AgentTestRunner { then: error.get() == null + TEST_WRITER.waitForTraces(1) + error.get() == null + serverReceived == clientRange.collect { "call $it" } + clientReceived == serverRange.collect { clientRange.collect { "call $it" } }.flatten().sort() assertTraces(1) { trace(0, 2) { @@ -161,9 +166,6 @@ class GrpcStreamingTest extends AgentTestRunner { } } - serverReceived == clientRange.collect { "call $it" } - clientReceived == serverRange.collect { clientRange.collect { "call $it" } }.flatten().sort() - cleanup: channel?.shutdownNow()?.awaitTermination(10, TimeUnit.SECONDS) server?.shutdownNow()?.awaitTermination() diff --git a/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy b/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy index 338b43e8ec..0c44a06f55 100644 --- a/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy +++ b/instrumentation/grpc-1.5/src/test/groovy/GrpcTest.groovy @@ -23,6 +23,7 @@ import io.grpc.ServerBuilder import io.grpc.Status import io.grpc.StatusRuntimeException import io.grpc.stub.StreamObserver +import io.opentelemetry.auto.common.exec.CommonTaskExecutor import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags @@ -31,6 +32,8 @@ import io.opentelemetry.auto.test.utils.PortUtils import java.util.concurrent.TimeUnit +import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan +import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace import static io.opentelemetry.trace.Span.Kind.CLIENT import static io.opentelemetry.trace.Span.Kind.SERVER @@ -43,8 +46,19 @@ class GrpcTest extends AgentTestRunner { void sayHello( final Helloworld.Request req, final StreamObserver responseObserver) { final Helloworld.Response reply = Helloworld.Response.newBuilder().setMessage("Hello $req.name").build() - responseObserver.onNext(reply) - responseObserver.onCompleted() + CommonTaskExecutor.INSTANCE.execute { + println "==================================" + println "==================================" + println "VALID????????? " + testTracer.getCurrentSpan().getContext().isValid() + println "==================================" + println "==================================" + if (!testTracer.getCurrentSpan().getContext().isValid()) { + responseObserver.onError(new IllegalStateException("no active span")) + } else { + responseObserver.onNext(reply) + responseObserver.onCompleted() + } + } } } def port = PortUtils.randomOpenPort() @@ -61,17 +75,20 @@ class GrpcTest extends AgentTestRunner { GreeterGrpc.GreeterBlockingStub client = GreeterGrpc.newBlockingStub(channel) when: - def response = client.sayHello(Helloworld.Request.newBuilder().setName(name).build()) + def response = runUnderTrace("parent") { + client.sayHello(Helloworld.Request.newBuilder().setName(name).build()) + } then: response.message == "Hello $name" assertTraces(1) { - trace(0, 2) { - span(0) { + trace(0, 3) { + basicSpan(it, 0, "parent") + span(1) { operationName "example.Greeter/SayHello" spanKind CLIENT - parent() + childOf span(0) errored false event(0) { eventName "message" @@ -89,10 +106,10 @@ class GrpcTest extends AgentTestRunner { "status.code" "OK" } } - span(1) { + span(2) { operationName "example.Greeter/SayHello" spanKind SERVER - childOf span(0) + childOf span(1) errored false event(0) { eventName "message" diff --git a/instrumentation/grpc-1.5/src/test/groovy/util/BlockingInterceptor.groovy b/instrumentation/grpc-1.5/src/test/groovy/util/BlockingInterceptor.groovy deleted file mode 100644 index 3444fc7f2a..0000000000 --- a/instrumentation/grpc-1.5/src/test/groovy/util/BlockingInterceptor.groovy +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2020, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package util - -import io.grpc.CallOptions -import io.grpc.Channel -import io.grpc.ClientCall -import io.grpc.ClientInterceptor -import io.grpc.ForwardingClientCall -import io.grpc.Metadata -import io.grpc.MethodDescriptor - -import java.util.concurrent.Phaser - -/** - * Interceptor that blocks client from returning until server trace is reported. - */ -class BlockingInterceptor implements ClientInterceptor { - private final Phaser phaser - - BlockingInterceptor(Phaser phaser) { - this.phaser = phaser - phaser.register() - } - - @Override - ClientCall interceptCall(MethodDescriptor method, CallOptions callOptions, Channel next) { - return new ForwardingClientCall.SimpleForwardingClientCall(next.newCall(method, callOptions)) { - @Override - void start(final ClientCall.Listener responseListener, final Metadata headers) { - super.start(new BlockingListener(responseListener, phaser), headers) - } - } - } -} diff --git a/instrumentation/hibernate/hibernate-3.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java b/instrumentation/hibernate/hibernate-3.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java index 843d258054..37af7761da 100644 --- a/instrumentation/hibernate/hibernate-3.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java +++ b/instrumentation/hibernate/hibernate-3.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v3_3/AbstractHibernateInstrumentation.java @@ -15,8 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.hibernate.core.v3_3; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; -import static net.bytebuddy.matcher.ElementMatchers.not; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import io.opentelemetry.auto.tooling.Instrumenter; import net.bytebuddy.matcher.ElementMatcher; @@ -32,17 +31,13 @@ public abstract class AbstractHibernateInstrumentation extends Instrumenter.Defa @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/hibernate/Session.class")); + return hasClassesNamed("org.hibernate.Session"); } @Override public String[] helperClassNames() { return new String[] { "io.opentelemetry.auto.instrumentation.hibernate.SessionMethodUtils", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", - "io.opentelemetry.auto.decorator.OrmClientDecorator", "io.opentelemetry.auto.instrumentation.hibernate.HibernateDecorator", packageName + ".AbstractHibernateInstrumentation$V3Advice", }; diff --git a/instrumentation/hibernate/hibernate-4.0/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java b/instrumentation/hibernate/hibernate-4.0/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java index a3749e4d69..c0a1134596 100644 --- a/instrumentation/hibernate/hibernate-4.0/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java +++ b/instrumentation/hibernate/hibernate-4.0/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_0/AbstractHibernateInstrumentation.java @@ -15,8 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.hibernate.core.v4_0; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; -import static net.bytebuddy.matcher.ElementMatchers.not; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import io.opentelemetry.auto.tooling.Instrumenter; import net.bytebuddy.matcher.ElementMatcher; @@ -31,17 +30,13 @@ public abstract class AbstractHibernateInstrumentation extends Instrumenter.Defa @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/hibernate/Session.class")); + return hasClassesNamed("org.hibernate.Session"); } @Override public String[] helperClassNames() { return new String[] { "io.opentelemetry.auto.instrumentation.hibernate.SessionMethodUtils", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", - "io.opentelemetry.auto.decorator.OrmClientDecorator", "io.opentelemetry.auto.instrumentation.hibernate.HibernateDecorator", packageName + ".AbstractHibernateInstrumentation$V4Advice", }; diff --git a/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java b/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java index 0d8526df2d..07678932e6 100644 --- a/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java +++ b/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/ProcedureCallInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.hibernate.core.v4_3; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.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.not; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; @@ -52,10 +51,6 @@ public class ProcedureCallInstrumentation extends Instrumenter.Default { public String[] helperClassNames() { return new String[] { "io.opentelemetry.auto.instrumentation.hibernate.SessionMethodUtils", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", - "io.opentelemetry.auto.decorator.OrmClientDecorator", "io.opentelemetry.auto.instrumentation.hibernate.HibernateDecorator", }; } @@ -63,7 +58,7 @@ public class ProcedureCallInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/hibernate/Session.class")); + return hasClassesNamed("org.hibernate.Session"); } @Override diff --git a/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java b/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java index 6a68e7528f..fc2e5e5759 100644 --- a/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java +++ b/instrumentation/hibernate/hibernate-4.3/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/core/v4_3/SessionInstrumentation.java @@ -15,13 +15,12 @@ */ package io.opentelemetry.auto.instrumentation.hibernate.core.v4_3; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.hasInterface; import static io.opentelemetry.auto.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.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; @@ -59,10 +58,6 @@ public class SessionInstrumentation extends Instrumenter.Default { public String[] helperClassNames() { return new String[] { "io.opentelemetry.auto.instrumentation.hibernate.SessionMethodUtils", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", - "io.opentelemetry.auto.decorator.OrmClientDecorator", "io.opentelemetry.auto.instrumentation.hibernate.HibernateDecorator", }; } @@ -70,7 +65,7 @@ public class SessionInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/hibernate/Session.class")); + return hasClassesNamed("org.hibernate.Session"); } @Override diff --git a/instrumentation/hibernate/hibernate-common/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/HibernateDecorator.java b/instrumentation/hibernate/hibernate-common/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/HibernateDecorator.java index 28f93869f6..adc97406e6 100644 --- a/instrumentation/hibernate/hibernate-common/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/HibernateDecorator.java +++ b/instrumentation/hibernate/hibernate-common/src/main/java/io/opentelemetry/auto/instrumentation/hibernate/HibernateDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.hibernate; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.OrmClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.OrmClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; import java.lang.annotation.Annotation; diff --git a/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionDecorator.java b/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionDecorator.java index a74542d35d..79e63d538c 100644 --- a/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionDecorator.java +++ b/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.http_url_connection; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.HttpURLConnection; import java.net.URI; diff --git a/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionInstrumentation.java b/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionInstrumentation.java index d4f6cec54a..ea1f9675d6 100644 --- a/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionInstrumentation.java +++ b/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/HttpUrlConnectionInstrumentation.java @@ -61,9 +61,6 @@ public class HttpUrlConnectionInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".HttpUrlConnectionDecorator", packageName + ".HeadersInjectAdapter", HttpUrlConnectionInstrumentation.class.getName() + "$HttpUrlState", diff --git a/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/UrlInstrumentation.java b/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/UrlInstrumentation.java index f91a562524..d74b99b3fc 100644 --- a/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/UrlInstrumentation.java +++ b/instrumentation/http-url-connection/src/main/java/io/opentelemetry/auto/instrumentation/http_url_connection/UrlInstrumentation.java @@ -65,9 +65,6 @@ public class UrlInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".HttpUrlConnectionDecorator", }; } diff --git a/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionResponseCodeOnlyTest.groovy b/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionResponseCodeOnlyTest.groovy index 91cf5782d5..28cb7eacb8 100644 --- a/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionResponseCodeOnlyTest.groovy +++ b/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionResponseCodeOnlyTest.groovy @@ -16,7 +16,7 @@ import io.opentelemetry.auto.instrumentation.http_url_connection.HttpUrlConnectionDecorator import io.opentelemetry.auto.test.base.HttpClientTest -class HttpUrlConnectionResponseCodeOnlyTest extends HttpClientTest { +class HttpUrlConnectionResponseCodeOnlyTest extends HttpClientTest { @Override int doRequest(String method, URI uri, Map headers, Closure callback) { @@ -33,8 +33,8 @@ class HttpUrlConnectionResponseCodeOnlyTest extends HttpClientTest { +class HttpUrlConnectionTest extends HttpClientTest { static final RESPONSE = "Hello." static final STATUS = 200 @@ -53,8 +53,8 @@ class HttpUrlConnectionTest extends HttpClientTest { } @Override - HttpUrlConnectionDecorator decorator() { - return HttpUrlConnectionDecorator.DECORATE + String component() { + return HttpUrlConnectionDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy b/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy index af413bc656..36db0717b0 100644 --- a/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy +++ b/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy @@ -16,7 +16,7 @@ import io.opentelemetry.auto.instrumentation.http_url_connection.HttpUrlConnectionDecorator import io.opentelemetry.auto.test.base.HttpClientTest -class HttpUrlConnectionUseCachesFalseTest extends HttpClientTest { +class HttpUrlConnectionUseCachesFalseTest extends HttpClientTest { @Override int doRequest(String method, URI uri, Map headers, Closure callback) { @@ -39,8 +39,8 @@ class HttpUrlConnectionUseCachesFalseTest extends HttpClientTest { +class SpringRestTemplateTest extends HttpClientTest { @Shared RestTemplate restTemplate = new RestTemplate() @@ -38,8 +38,8 @@ class SpringRestTemplateTest extends HttpClientTest } @Override - HttpUrlConnectionDecorator decorator() { - return HttpUrlConnectionDecorator.DECORATE + String component() { + return HttpUrlConnectionDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy b/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy index 79897c2efe..c099215e40 100644 --- a/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy +++ b/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy @@ -15,7 +15,7 @@ */ import io.opentelemetry.auto.bootstrap.AgentClassLoader import io.opentelemetry.auto.config.Config -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/hystrix-1.4/hystrix-1.4.gradle b/instrumentation/hystrix-1.4/hystrix-1.4.gradle index c11d8fedce..90440b86ac 100644 --- a/instrumentation/hystrix-1.4/hystrix-1.4.gradle +++ b/instrumentation/hystrix-1.4/hystrix-1.4.gradle @@ -21,7 +21,6 @@ dependencies { compileOnly group: 'com.netflix.hystrix', name: 'hystrix-core', version: '1.4.0' compileOnly group: 'io.reactivex', name: 'rxjava', version: '1.0.7' - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:trace-annotation') testCompile group: 'io.reactivex', name: 'rxjava', version: '1.0.7' diff --git a/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixDecorator.java b/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixDecorator.java index 0c40116d38..d828c6ca56 100644 --- a/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixDecorator.java +++ b/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.hystrix; import com.netflix.hystrix.HystrixInvokableInfo; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; diff --git a/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixInstrumentation.java b/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixInstrumentation.java index f9248cfd5d..176af24186 100644 --- a/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixInstrumentation.java +++ b/instrumentation/hystrix-1.4/src/main/java/io/opentelemetry/auto/instrumentation/hystrix/HystrixInstrumentation.java @@ -16,11 +16,10 @@ package io.opentelemetry.auto.instrumentation.hystrix; import static io.opentelemetry.auto.instrumentation.hystrix.HystrixDecorator.DECORATE; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.trace.Span.Kind.INTERNAL; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; @@ -48,7 +47,7 @@ public class HystrixInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/netflix/hystrix/HystrixCommand.class")); + return hasClassesNamed("com.netflix.hystrix.HystrixCommand"); } @Override @@ -62,7 +61,6 @@ public class HystrixInstrumentation extends Instrumenter.Default { public String[] helperClassNames() { return new String[] { "rx.__OpenTelemetryTracingUtil", - "io.opentelemetry.auto.decorator.BaseDecorator", "io.opentelemetry.auto.instrumentation.rxjava.SpanFinishingSubscription", "io.opentelemetry.auto.instrumentation.rxjava.TracedSubscriber", "io.opentelemetry.auto.instrumentation.rxjava.TracedOnSubscribe", diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AbstractExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AbstractExecutorInstrumentation.java index 40b0206456..cff0dd9a54 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AbstractExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AbstractExecutorInstrumentation.java @@ -148,11 +148,4 @@ public abstract class AbstractExecutorInstrumentation extends Instrumenter.Defau } return matcher.and(hasExecutorInterfaceMatcher); // Apply expensive matcher last. } - - @Override - public String[] helperClassNames() { - return new String[] { - AbstractExecutorInstrumentation.class.getPackage().getName() + ".ExecutorInstrumentationUtils" - }; - } } diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaExecutorInstrumentation.java index 5159b17c63..9fbd8aa896 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaExecutorInstrumentation.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.java.concurrent; -import static io.opentelemetry.auto.instrumentation.java.concurrent.AdviceUtils.TRACER; +import static io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils.TRACER; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.nameMatches; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -25,6 +25,7 @@ import akka.dispatch.forkjoin.ForkJoinTask; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.ExecutorInstrumentationUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; @@ -44,13 +45,6 @@ public final class AkkaExecutorInstrumentation extends AbstractExecutorInstrumen super(EXEC_NAME + ".akka_fork_join"); } - @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), packageName + ".ExecutorInstrumentationUtils", - }; - } - @Override public Map contextStore() { return singletonMap(AkkaForkJoinTaskInstrumentation.TASK_CLASS_NAME, State.class.getName()); diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaForkJoinTaskInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaForkJoinTaskInstrumentation.java index 6f4b47712d..3968cadec3 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaForkJoinTaskInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/AkkaForkJoinTaskInstrumentation.java @@ -15,6 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.java.concurrent; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -27,6 +28,7 @@ import akka.dispatch.forkjoin.ForkJoinTask; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.instrumentation.api.SpanWithScope; import io.opentelemetry.auto.tooling.Instrumenter; @@ -57,15 +59,14 @@ public final class AkkaForkJoinTaskInstrumentation extends Instrumenter.Default } @Override - public ElementMatcher typeMatcher() { - return extendsClass(named(TASK_CLASS_NAME)); + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed(TASK_CLASS_NAME); } @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), - }; + public ElementMatcher typeMatcher() { + return extendsClass(named(TASK_CLASS_NAME)); } @Override diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/RunnableCallableInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/CallableInstrumentation.java similarity index 71% rename from instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/RunnableCallableInstrumentation.java rename to instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/CallableInstrumentation.java index 8fd6856050..d935c76a2f 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/RunnableCallableInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/CallableInstrumentation.java @@ -23,6 +23,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.instrumentation.api.SpanWithScope; import io.opentelemetry.auto.tooling.Instrumenter; @@ -39,28 +40,20 @@ import net.bytebuddy.matcher.ElementMatcher; /** Instrument {@link Runnable} and {@link Callable} */ @Slf4j @AutoService(Instrumenter.class) -public final class RunnableCallableInstrumentation extends Instrumenter.Default { +public final class CallableInstrumentation extends Instrumenter.Default { - public RunnableCallableInstrumentation() { + public CallableInstrumentation() { super(AbstractExecutorInstrumentation.EXEC_NAME); } @Override public ElementMatcher typeMatcher() { - return implementsInterface(named(Runnable.class.getName()).or(named(Callable.class.getName()))); - } - - @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), - }; + return implementsInterface(named(Callable.class.getName())); } @Override public Map contextStore() { final Map map = new HashMap<>(); - map.put(Runnable.class.getName(), State.class.getName()); map.put(Callable.class.getName(), State.class.getName()); return Collections.unmodifiableMap(map); } @@ -68,30 +61,12 @@ public final class RunnableCallableInstrumentation extends Instrumenter.Default @Override public Map, String> transformers() { final Map, String> transformers = new HashMap<>(); - transformers.put( - named("run").and(takesArguments(0)).and(isPublic()), - RunnableCallableInstrumentation.class.getName() + "$RunnableAdvice"); transformers.put( named("call").and(takesArguments(0)).and(isPublic()), - RunnableCallableInstrumentation.class.getName() + "$CallableAdvice"); + CallableInstrumentation.class.getName() + "$CallableAdvice"); return transformers; } - public static class RunnableAdvice { - - @Advice.OnMethodEnter(suppress = Throwable.class) - public static SpanWithScope enter(@Advice.This final Runnable thiz) { - final ContextStore contextStore = - InstrumentationContext.get(Runnable.class, State.class); - return AdviceUtils.startTaskScope(contextStore, thiz); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void exit(@Advice.Enter final SpanWithScope scope) { - AdviceUtils.endTaskScope(scope); - } - } - public static class CallableAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaExecutorInstrumentation.java index 9473d47637..c49b619ea2 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaExecutorInstrumentation.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.java.concurrent; -import static io.opentelemetry.auto.instrumentation.java.concurrent.AdviceUtils.TRACER; +import static io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils.TRACER; import static net.bytebuddy.matcher.ElementMatchers.nameMatches; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -24,6 +24,7 @@ import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.CallableWrapper; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.ExecutorInstrumentationUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.RunnableWrapper; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.tooling.Instrumenter; @@ -44,13 +45,6 @@ import net.bytebuddy.matcher.ElementMatcher; @AutoService(Instrumenter.class) public final class JavaExecutorInstrumentation extends AbstractExecutorInstrumentation { - @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), packageName + ".ExecutorInstrumentationUtils", - }; - } - @Override public Map contextStore() { final Map map = new HashMap<>(); diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaForkJoinTaskInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaForkJoinTaskInstrumentation.java index 0d10f597a4..b6076e9d05 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaForkJoinTaskInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/JavaForkJoinTaskInstrumentation.java @@ -25,6 +25,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.instrumentation.api.SpanWithScope; import io.opentelemetry.auto.tooling.Instrumenter; @@ -59,13 +60,6 @@ public final class JavaForkJoinTaskInstrumentation extends Instrumenter.Default return extendsClass(named(ForkJoinTask.class.getName())); } - @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), - }; - } - @Override public Map contextStore() { final Map map = new HashMap<>(); diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/NonStandardExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/NonStandardExecutorInstrumentation.java index 9e3f5074e1..77f2c8b0f3 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/NonStandardExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/NonStandardExecutorInstrumentation.java @@ -35,13 +35,6 @@ public final class NonStandardExecutorInstrumentation extends AbstractExecutorIn super(EXEC_NAME + ".other"); } - @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), packageName + ".ExecutorInstrumentationUtils", - }; - } - @Override public Map contextStore() { return singletonMap(Runnable.class.getName(), State.class.getName()); diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/RunnableInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/RunnableInstrumentation.java new file mode 100644 index 0000000000..fb30edb358 --- /dev/null +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/RunnableInstrumentation.java @@ -0,0 +1,83 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.opentelemetry.auto.instrumentation.java.concurrent; + +import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import com.google.auto.service.AutoService; +import io.opentelemetry.auto.bootstrap.ContextStore; +import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; +import io.opentelemetry.auto.instrumentation.api.SpanWithScope; +import io.opentelemetry.auto.tooling.Instrumenter; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +/** Instrument {@link Runnable} and {@Callable} */ +@Slf4j +@AutoService(Instrumenter.class) +public final class RunnableInstrumentation extends Instrumenter.Default { + + public RunnableInstrumentation() { + super(AbstractExecutorInstrumentation.EXEC_NAME); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named(Runnable.class.getName())); + } + + @Override + public Map contextStore() { + final Map map = new HashMap<>(); + map.put(Runnable.class.getName(), State.class.getName()); + return Collections.unmodifiableMap(map); + } + + @Override + public Map, String> transformers() { + final Map, String> transformers = new HashMap<>(); + transformers.put( + named("run").and(takesArguments(0)).and(isPublic()), + RunnableInstrumentation.class.getName() + "$RunnableAdvice"); + return transformers; + } + + public static class RunnableAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static SpanWithScope enter(@Advice.This final Runnable thiz) { + final ContextStore contextStore = + InstrumentationContext.get(Runnable.class, State.class); + return AdviceUtils.startTaskScope(contextStore, thiz); + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void exit(@Advice.Enter final SpanWithScope scope) { + AdviceUtils.endTaskScope(scope); + } + } +} diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaExecutorInstrumentation.java index bb79c93cdf..a794a0ef71 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaExecutorInstrumentation.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.java.concurrent; -import static io.opentelemetry.auto.instrumentation.java.concurrent.AdviceUtils.TRACER; +import static io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils.TRACER; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.nameMatches; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -24,6 +24,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.ExecutorInstrumentationUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; @@ -44,13 +45,6 @@ public final class ScalaExecutorInstrumentation extends AbstractExecutorInstrume super(EXEC_NAME + ".scala_fork_join"); } - @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), packageName + ".ExecutorInstrumentationUtils", - }; - } - @Override public Map contextStore() { return singletonMap(ScalaForkJoinTaskInstrumentation.TASK_CLASS_NAME, State.class.getName()); diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaForkJoinTaskInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaForkJoinTaskInstrumentation.java index 162046001d..084ae6bf9c 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaForkJoinTaskInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ScalaForkJoinTaskInstrumentation.java @@ -15,6 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.java.concurrent; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -25,6 +26,7 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.ContextStore; import io.opentelemetry.auto.bootstrap.InstrumentationContext; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.AdviceUtils; import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.State; import io.opentelemetry.auto.instrumentation.api.SpanWithScope; import io.opentelemetry.auto.tooling.Instrumenter; @@ -57,15 +59,14 @@ public final class ScalaForkJoinTaskInstrumentation extends Instrumenter.Default } @Override - public ElementMatcher typeMatcher() { - return extendsClass(named(TASK_CLASS_NAME)); + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed(TASK_CLASS_NAME); } @Override - public String[] helperClassNames() { - return new String[] { - AdviceUtils.class.getName(), - }; + public ElementMatcher typeMatcher() { + return extendsClass(named(TASK_CLASS_NAME)); } @Override diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ThreadPoolExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ThreadPoolExecutorInstrumentation.java index f45772df5f..7d31f842e2 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ThreadPoolExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/auto/instrumentation/java/concurrent/ThreadPoolExecutorInstrumentation.java @@ -22,6 +22,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.ExecutorInstrumentationUtils; +import io.opentelemetry.auto.bootstrap.instrumentation.java.concurrent.GenericRunnable; import io.opentelemetry.auto.tooling.Instrumenter; import java.util.Map; import java.util.concurrent.BlockingQueue; @@ -50,16 +52,6 @@ public class ThreadPoolExecutorInstrumentation extends Instrumenter.Default { return named("java.util.concurrent.ThreadPoolExecutor"); } - @Override - public String[] helperClassNames() { - return new String[] { - ThreadPoolExecutorInstrumentation.class.getPackage().getName() - + ".ExecutorInstrumentationUtils", - ThreadPoolExecutorInstrumentation.class.getName() + "$GenericRunnable", - packageName + ".AdviceUtils", - }; - } - @Override public Map, String> transformers() { return singletonMap( @@ -75,7 +67,7 @@ public class ThreadPoolExecutorInstrumentation extends Instrumenter.Default { @Advice.This final ThreadPoolExecutor executor, @Advice.Argument(4) final BlockingQueue queue) { - if (queue.size() == 0) { + if (queue.isEmpty()) { try { queue.offer(new GenericRunnable()); queue.clear(); // Remove the Runnable we just added. @@ -90,10 +82,4 @@ public class ThreadPoolExecutorInstrumentation extends Instrumenter.Default { } } } - - public static class GenericRunnable implements Runnable { - - @Override - public void run() {} - } } diff --git a/instrumentation/java-concurrent/src/slickTest/groovy/SlickTest.groovy b/instrumentation/java-concurrent/src/slickTest/groovy/SlickTest.groovy index 3be234e5eb..b497b35e8b 100644 --- a/instrumentation/java-concurrent/src/slickTest/groovy/SlickTest.groovy +++ b/instrumentation/java-concurrent/src/slickTest/groovy/SlickTest.groovy @@ -27,7 +27,8 @@ class SlickTest extends AgentTestRunner { def "Basic statement generates spans"() { setup: - def result = database.runQuery(SlickUtils.TestQuery()) + def future = database.startQuery(SlickUtils.TestQuery()) + def result = database.getResults(future) expect: result == SlickUtils.TestValue() @@ -61,4 +62,29 @@ class SlickTest extends AgentTestRunner { } } } + + def "Concurrent requests do not throw exception"() { + setup: + def sleepFuture = database.startQuery(SlickUtils.SleepQuery()) + + def future = database.startQuery(SlickUtils.TestQuery()) + def result = database.getResults(future) + + database.getResults(sleepFuture) + + expect: + result == SlickUtils.TestValue() + + // Expect two traces because two queries have been run + assertTraces(2) { + trace(0, 2, { + span(0) {} + span(1) { spanKind CLIENT } + }) + trace(1, 2, { + span(0) {} + span(1) { spanKind CLIENT } + }) + } + } } diff --git a/instrumentation/java-concurrent/src/slickTest/scala/SlickUtils.scala b/instrumentation/java-concurrent/src/slickTest/scala/SlickUtils.scala index f7ce9d268d..f1d8fb90d8 100644 --- a/instrumentation/java-concurrent/src/slickTest/scala/SlickUtils.scala +++ b/instrumentation/java-concurrent/src/slickTest/scala/SlickUtils.scala @@ -17,8 +17,8 @@ import io.opentelemetry.OpenTelemetry import io.opentelemetry.trace.Tracer import slick.jdbc.H2Profile.api._ -import scala.concurrent.Await import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future} class SlickUtils { val TRACER: Tracer = OpenTelemetry.getTracerFactory.get("io.opentelemetry.auto") @@ -35,18 +35,20 @@ class SlickUtils { ) Await.result(database.run(sqlu"""CREATE ALIAS IF NOT EXISTS SLEEP FOR "java.lang.Thread.sleep(long)""""), Duration.Inf) - def runQuery(query: String): Int = { + def startQuery(query: String): Future[Vector[Int]] = { val span = TRACER.spanBuilder("run query").startSpan() val scope = TRACER.withSpan(span) try { - val future = database.run(sql"#$query".as[Int]) - Await.result(future, Duration.Inf).head + return database.run(sql"#$query".as[Int]) } finally { span.end() scope.close() } } + def getResults(future: Future[Vector[Int]]): Int = { + Await.result(future, Duration.Inf).head + } } object SlickUtils { diff --git a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Decorator.java b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Decorator.java index 315409ff8a..2afde999e1 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Decorator.java +++ b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Decorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.jaxrs.v1; import com.sun.jersey.api.client.ClientRequest; import com.sun.jersey.api.client.ClientResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; diff --git a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java index b99d286d30..32af5c43ab 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/v1/JaxRsClientV1Instrumentation.java @@ -15,17 +15,16 @@ */ package io.opentelemetry.auto.instrumentation.jaxrs.v1; -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; import static io.opentelemetry.auto.instrumentation.jaxrs.v1.InjectAdapter.SETTER; import static io.opentelemetry.auto.instrumentation.jaxrs.v1.JaxRsClientV1Decorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jaxrs.v1.JaxRsClientV1Decorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -52,7 +51,7 @@ public final class JaxRsClientV1Instrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/sun/jersey/api/client/ClientHandler.class")); + return hasClassesNamed("com.sun.jersey.api.client.ClientHandler"); } @Override @@ -63,11 +62,7 @@ public final class JaxRsClientV1Instrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - packageName + ".JaxRsClientV1Decorator", - packageName + ".InjectAdapter", + packageName + ".JaxRsClientV1Decorator", packageName + ".InjectAdapter", }; } diff --git a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/test/groovy/JaxRsClientV1Test.groovy b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/test/groovy/JaxRsClientV1Test.groovy index a701d89e9b..546e1e22d1 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/test/groovy/JaxRsClientV1Test.groovy +++ b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/test/groovy/JaxRsClientV1Test.groovy @@ -21,7 +21,7 @@ import io.opentelemetry.auto.instrumentation.jaxrs.v1.JaxRsClientV1Decorator import io.opentelemetry.auto.test.base.HttpClientTest import spock.lang.Shared -class JaxRsClientV1Test extends HttpClientTest { +class JaxRsClientV1Test extends HttpClientTest { @Shared Client client = Client.create() @@ -44,8 +44,8 @@ class JaxRsClientV1Test extends HttpClientTest { } @Override - JaxRsClientV1Decorator decorator() { - return JaxRsClientV1Decorator.DECORATE + String component() { + return JaxRsClientV1Decorator.DECORATE.getComponentName() } boolean testCircularRedirects() { diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/jersey/JerseyClientConnectionErrorInstrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/jersey/JerseyClientConnectionErrorInstrumentation.java index c8f90d3a20..15fe54b071 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/jersey/JerseyClientConnectionErrorInstrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/jersey/JerseyClientConnectionErrorInstrumentation.java @@ -57,11 +57,7 @@ public final class JerseyClientConnectionErrorInstrumentation extends Instrument @Override public String[] helperClassNames() { return new String[] { - getClass().getName() + "$WrappedFuture", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - JaxRsClientDecorator.class.getName(), + getClass().getName() + "$WrappedFuture", JaxRsClientDecorator.class.getName(), }; } diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/resteasy/ResteasyClientConnectionErrorInstrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/resteasy/ResteasyClientConnectionErrorInstrumentation.java index f2cde4970d..e0cfbb263b 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/resteasy/ResteasyClientConnectionErrorInstrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/auto/instrumentation/connection_error/resteasy/ResteasyClientConnectionErrorInstrumentation.java @@ -57,11 +57,7 @@ public final class ResteasyClientConnectionErrorInstrumentation extends Instrume @Override public String[] helperClassNames() { return new String[] { - getClass().getName() + "$WrappedFuture", - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - JaxRsClientDecorator.class.getName(), + getClass().getName() + "$WrappedFuture", JaxRsClientDecorator.class.getName(), }; } diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0.gradle b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0.gradle index 4b23dab575..7c92113657 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0.gradle +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0.gradle @@ -26,8 +26,6 @@ dependencies { compileOnly group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0.1' compileOnly group: 'javax.annotation', name: 'javax.annotation-api', version: '1.2' - testCompile project(':instrumentation:java-concurrent') - testCompile project(':instrumentation:jaxrs-client:jaxrs-client-2.0:jaxrs-client-2.0-jersey-2.0') testCompile project(':instrumentation:jaxrs-client:jaxrs-client-2.0:jaxrs-client-2.0-resteasy-2.0') diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientDecorator.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientDecorator.java index c938a704f6..d428d68513 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientDecorator.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jaxrs; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import javax.ws.rs.client.ClientRequestContext; diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientInstrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientInstrumentation.java index 6212488fad..b41581fc89 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientInstrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs/JaxRsClientInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.jaxrs; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.hasInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; @@ -43,7 +42,7 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/ws/rs/client/ClientBuilder.class")); + return hasClassesNamed("javax.ws.rs.client.ClientBuilder"); } @Override @@ -54,9 +53,6 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".JaxRsClientDecorator", packageName + ".ClientTracingFeature", packageName + ".ClientTracingFilter", diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy index 762dd2a2b7..0a0b27ffec 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientAsyncTest.groovy @@ -29,7 +29,7 @@ import javax.ws.rs.core.MediaType import javax.ws.rs.core.Response import java.util.concurrent.CountDownLatch -abstract class JaxRsClientAsyncTest extends HttpClientTest { +abstract class JaxRsClientAsyncTest extends HttpClientTest { @Override int doRequest(String method, URI uri, Map headers, Closure callback) { @@ -60,8 +60,8 @@ abstract class JaxRsClientAsyncTest extends HttpClientTest } @Override - JaxRsClientDecorator decorator() { - return JaxRsClientDecorator.DECORATE + String component() { + return JaxRsClientDecorator.DECORATE.getComponentName() } abstract ClientBuilder builder() diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientTest.groovy b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientTest.groovy index c175d54798..77a30db0bb 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientTest.groovy +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/test/groovy/JaxRsClientTest.groovy @@ -27,7 +27,7 @@ import javax.ws.rs.client.WebTarget import javax.ws.rs.core.MediaType import javax.ws.rs.core.Response -abstract class JaxRsClientTest extends HttpClientTest { +abstract class JaxRsClientTest extends HttpClientTest { @Override int doRequest(String method, URI uri, Map headers, Closure callback) { @@ -44,8 +44,8 @@ abstract class JaxRsClientTest extends HttpClientTest { } @Override - JaxRsClientDecorator decorator() { - return JaxRsClientDecorator.DECORATE + String component() { + return JaxRsClientDecorator.DECORATE.getComponentName() } abstract ClientBuilder builder() diff --git a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsDecorator.java b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsDecorator.java index 77987440f8..3408aeb80d 100644 --- a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsDecorator.java +++ b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsDecorator.java @@ -19,7 +19,7 @@ import static io.opentelemetry.auto.bootstrap.WeakMap.Provider.newWeakMap; import io.opentelemetry.OpenTelemetry; import io.opentelemetry.auto.bootstrap.WeakMap; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.auto.instrumentation.api.Tags; diff --git a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java index 0a7cc4d596..66b5aa474b 100644 --- a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs1/JaxRsAnnotationsInstrumentation.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.jaxrs1; import static io.opentelemetry.auto.instrumentation.jaxrs1.JaxRsAnnotationsDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jaxrs1.JaxRsAnnotationsDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.hasSuperMethod; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; import static java.util.Collections.singletonMap; @@ -50,9 +50,9 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default // this is required to make sure instrumentation won't apply to jax-rs 2 @Override public ElementMatcher classLoaderMatcher() { - return classLoaderHasNoResources("javax/ws/rs/container/AsyncResponse.class") + return not(hasClassesNamed("javax.ws.rs.container.AsyncResponse")) // Optimization for expensive typeMatcher. - .and(not(classLoaderHasNoResources("javax/ws/rs/Path.class"))); + .and(hasClassesNamed("javax.ws.rs.Path")); } @Override @@ -65,7 +65,6 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", "io.opentelemetry.auto.tooling.ClassHierarchyIterable", "io.opentelemetry.auto.tooling.ClassHierarchyIterable$ClassIterator", packageName + ".JaxRsAnnotationsDecorator", diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0.gradle b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0.gradle index 6e863f14ba..db7788c798 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0.gradle +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0.gradle @@ -27,7 +27,6 @@ testSets { dependencies { compileOnly group: 'javax.ws.rs', name: 'javax.ws.rs-api', version: '2.0' - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:servlet:request-3.0') testCompile project(':instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-jersey-2.0') testCompile project(':instrumentation:jaxrs:jaxrs-2.0:jaxrs-2.0-resteasy-3.0') diff --git a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java index 6fdc99fb0d..35dd3ae823 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/AbstractRequestContextInstrumentation.java @@ -17,12 +17,11 @@ package io.opentelemetry.auto.instrumentation.jaxrs2; import static io.opentelemetry.auto.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.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.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -44,7 +43,7 @@ public abstract class AbstractRequestContextInstrumentation extends Instrumenter @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/ws/rs/container/ContainerRequestContext.class")); + return hasClassesNamed("javax.ws.rs.container.ContainerRequestContext"); } @Override @@ -55,7 +54,6 @@ public abstract class AbstractRequestContextInstrumentation extends Instrumenter @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", "io.opentelemetry.auto.tooling.ClassHierarchyIterable", "io.opentelemetry.auto.tooling.ClassHierarchyIterable$ClassIterator", packageName + ".JaxRsAnnotationsDecorator", diff --git a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java index fdf1bf9556..20521cdf15 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/ContainerRequestFilterInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.jaxrs2; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.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.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; @@ -48,7 +47,7 @@ public class ContainerRequestFilterInstrumentation extends Instrumenter.Default @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/ws/rs/container/ContainerRequestFilter.class")); + return hasClassesNamed("javax.ws.rs.container.ContainerRequestFilter"); } @Override diff --git a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsDecorator.java b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsDecorator.java index d37b6b1fb6..f5fc7694cb 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsDecorator.java +++ b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsDecorator.java @@ -19,7 +19,7 @@ import static io.opentelemetry.auto.bootstrap.WeakMap.Provider.newWeakMap; import io.opentelemetry.OpenTelemetry; import io.opentelemetry.auto.bootstrap.WeakMap; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.auto.instrumentation.api.Tags; diff --git a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java index ea85da9272..ee096fb3e6 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAnnotationsInstrumentation.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.jaxrs2; import static io.opentelemetry.auto.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.hasSuperMethod; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; import static java.util.Collections.singletonMap; @@ -25,7 +25,6 @@ import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.InstrumentationContext; @@ -57,7 +56,7 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/ws/rs/Path.class")); + return hasClassesNamed("javax.ws.rs.Path"); } @Override @@ -70,7 +69,6 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", "io.opentelemetry.auto.tooling.ClassHierarchyIterable", "io.opentelemetry.auto.tooling.ClassHierarchyIterable$ClassIterator", packageName + ".JaxRsAnnotationsDecorator", diff --git a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java index 8911269ff8..a1a8254dee 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/src/main/java/io/opentelemetry/auto/instrumentation/jaxrs2/JaxRsAsyncResponseInstrumentation.java @@ -16,12 +16,11 @@ package io.opentelemetry.auto.instrumentation.jaxrs2; import static io.opentelemetry.auto.instrumentation.jaxrs2.JaxRsAnnotationsDecorator.DECORATE; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -52,7 +51,7 @@ public final class JaxRsAsyncResponseInstrumentation extends Instrumenter.Defaul @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/ws/rs/container/AsyncResponse.class")); + return hasClassesNamed("javax.ws.rs.container.AsyncResponse"); } @Override @@ -63,7 +62,6 @@ public final class JaxRsAsyncResponseInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", "io.opentelemetry.auto.tooling.ClassHierarchyIterable", "io.opentelemetry.auto.tooling.ClassHierarchyIterable$ClassIterator", packageName + ".JaxRsAnnotationsDecorator", diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceDecorator.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceDecorator.java index 4c048a55da..810ff57a3c 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceDecorator.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jdbc; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Tracer; public class DataSourceDecorator extends BaseDecorator { diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceInstrumentation.java index a939759b9e..54bc69222a 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DataSourceInstrumentation.java @@ -48,7 +48,7 @@ public final class DataSourceInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".DataSourceDecorator", + packageName + ".DataSourceDecorator", }; } diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DriverInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DriverInstrumentation.java index 2cfff79c33..ac7a605031 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DriverInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/DriverInstrumentation.java @@ -23,10 +23,10 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; +import io.opentelemetry.auto.bootstrap.instrumentation.jdbc.DBInfo; +import io.opentelemetry.auto.bootstrap.instrumentation.jdbc.JDBCConnectionUrlParser; import io.opentelemetry.auto.tooling.Instrumenter; import java.sql.Connection; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.Properties; import net.bytebuddy.asm.Advice; @@ -48,17 +48,9 @@ public final class DriverInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { - final List helpers = new ArrayList<>(JDBCConnectionUrlParser.values().length + 4); - - helpers.add(packageName + ".DBInfo"); - helpers.add(packageName + ".DBInfo$Builder"); - helpers.add(packageName + ".JDBCMaps"); - helpers.add(packageName + ".JDBCConnectionUrlParser"); - - for (final JDBCConnectionUrlParser parser : JDBCConnectionUrlParser.values()) { - helpers.add(parser.getClass().getName()); - } - return helpers.toArray(new String[0]); + return new String[] { + packageName + ".JDBCMaps", + }; } @Override diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCDecorator.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCDecorator.java index 809e5d7394..0058f8d70d 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCDecorator.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCDecorator.java @@ -16,7 +16,9 @@ package io.opentelemetry.auto.instrumentation.jdbc; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.jdbc.DBInfo; +import io.opentelemetry.auto.bootstrap.instrumentation.jdbc.JDBCConnectionUrlParser; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.auto.instrumentation.api.Tags; diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCMaps.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCMaps.java index f945c9c33c..ff63188a07 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCMaps.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/JDBCMaps.java @@ -18,6 +18,7 @@ package io.opentelemetry.auto.instrumentation.jdbc; import static io.opentelemetry.auto.bootstrap.WeakMap.Provider.newWeakMap; import io.opentelemetry.auto.bootstrap.WeakMap; +import io.opentelemetry.auto.bootstrap.instrumentation.jdbc.DBInfo; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/PreparedStatementInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/PreparedStatementInstrumentation.java index 986247dac5..acd1d4f5b2 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/PreparedStatementInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/PreparedStatementInstrumentation.java @@ -33,8 +33,6 @@ import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; import java.sql.Connection; import java.sql.PreparedStatement; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -55,23 +53,9 @@ public final class PreparedStatementInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { - final List helpers = new ArrayList<>(JDBCConnectionUrlParser.values().length + 9); - - helpers.add(packageName + ".DBInfo"); - helpers.add(packageName + ".DBInfo$Builder"); - helpers.add(packageName + ".JDBCUtils"); - helpers.add(packageName + ".JDBCMaps"); - helpers.add(packageName + ".JDBCConnectionUrlParser"); - - helpers.add("io.opentelemetry.auto.decorator.BaseDecorator"); - helpers.add("io.opentelemetry.auto.decorator.ClientDecorator"); - helpers.add("io.opentelemetry.auto.decorator.DatabaseClientDecorator"); - helpers.add(packageName + ".JDBCDecorator"); - - for (final JDBCConnectionUrlParser parser : JDBCConnectionUrlParser.values()) { - helpers.add(parser.getClass().getName()); - } - return helpers.toArray(new String[0]); + return new String[] { + packageName + ".JDBCMaps", packageName + ".JDBCUtils", packageName + ".JDBCDecorator", + }; } @Override diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/StatementInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/StatementInstrumentation.java index b201308441..4aa01c9b3f 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/StatementInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/auto/instrumentation/jdbc/StatementInstrumentation.java @@ -33,8 +33,6 @@ import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; import java.sql.Connection; import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -55,23 +53,9 @@ public final class StatementInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { - final List helpers = new ArrayList<>(JDBCConnectionUrlParser.values().length + 9); - - helpers.add(packageName + ".DBInfo"); - helpers.add(packageName + ".DBInfo$Builder"); - helpers.add(packageName + ".JDBCUtils"); - helpers.add(packageName + ".JDBCMaps"); - helpers.add(packageName + ".JDBCConnectionUrlParser"); - - helpers.add("io.opentelemetry.auto.decorator.BaseDecorator"); - helpers.add("io.opentelemetry.auto.decorator.ClientDecorator"); - helpers.add("io.opentelemetry.auto.decorator.DatabaseClientDecorator"); - helpers.add(packageName + ".JDBCDecorator"); - - for (final JDBCConnectionUrlParser parser : JDBCConnectionUrlParser.values()) { - helpers.add(parser.getClass().getName()); - } - return helpers.toArray(new String[0]); + return new String[] { + packageName + ".JDBCMaps", packageName + ".JDBCUtils", packageName + ".JDBCDecorator", + }; } @Override diff --git a/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy b/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy index 9e4614beb5..9d83a78429 100644 --- a/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy +++ b/instrumentation/jdbc/src/test/groovy/JDBCConnectionUrlParserTest.groovy @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import io.opentelemetry.auto.instrumentation.jdbc.DBInfo +import io.opentelemetry.auto.bootstrap.instrumentation.jdbc.DBInfo import io.opentelemetry.auto.util.test.AgentSpecification import spock.lang.Shared -import static io.opentelemetry.auto.instrumentation.jdbc.JDBCConnectionUrlParser.parse +import static io.opentelemetry.auto.bootstrap.instrumentation.jdbc.JDBCConnectionUrlParser.parse class JDBCConnectionUrlParserTest extends AgentSpecification { diff --git a/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisClientDecorator.java b/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisClientDecorator.java index 7ddca6e56b..66af1ec6cb 100644 --- a/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisClientDecorator.java +++ b/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jedis; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; import redis.clients.jedis.Protocol; diff --git a/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisInstrumentation.java b/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisInstrumentation.java index 94b6805a59..8caee4ee86 100644 --- a/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisInstrumentation.java +++ b/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/auto/instrumentation/jedis/JedisInstrumentation.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.jedis; import static io.opentelemetry.auto.instrumentation.jedis.JedisClientDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jedis.JedisClientDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -46,9 +46,8 @@ public final class JedisInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { - return classLoaderHasNoResources("redis/clients/jedis/commands/ProtocolCommand.class") - // Optimization for expensive typeMatcher. - .and(not(classLoaderHasNoResources("redis/clients/jedis/Protocol.class"))); + // Avoid matching 3.x + return not(hasClassesNamed("redis.clients.jedis.commands.ProtocolCommand")); } @Override @@ -59,9 +58,6 @@ public final class JedisInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".JedisClientDecorator", }; } diff --git a/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisClientDecorator.java b/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisClientDecorator.java index aca80ca0cc..a5cb9d3059 100644 --- a/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisClientDecorator.java +++ b/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jedis30; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; import redis.clients.jedis.commands.ProtocolCommand; diff --git a/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisInstrumentation.java b/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisInstrumentation.java index 8cf2df59de..2748ae3bc5 100644 --- a/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisInstrumentation.java +++ b/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/auto/instrumentation/jedis30/JedisInstrumentation.java @@ -52,9 +52,6 @@ public final class JedisInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".JedisClientDecorator", }; } diff --git a/instrumentation/jetty-8.0/jetty-8.0.gradle b/instrumentation/jetty-8.0/jetty-8.0.gradle index 10226560ac..21d9e37d0b 100644 --- a/instrumentation/jetty-8.0/jetty-8.0.gradle +++ b/instrumentation/jetty-8.0/jetty-8.0.gradle @@ -23,7 +23,6 @@ dependencies { testCompile(project(':testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } - testCompile project(':instrumentation:java-concurrent') testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.0.0.v20110901' testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.0.0.v20110901' diff --git a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyDecorator.java b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyDecorator.java index 8ee9dd2730..07a2d47a47 100644 --- a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyDecorator.java +++ b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jetty8; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; import java.net.URI; diff --git a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerAdvice.java b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerAdvice.java index 495af4f944..d76da775b6 100644 --- a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerAdvice.java +++ b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerAdvice.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.jetty8; -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; import static io.opentelemetry.auto.instrumentation.jetty8.HttpServletRequestExtractAdapter.GETTER; import static io.opentelemetry.auto.instrumentation.jetty8.JettyDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jetty8.JettyDecorator.TRACER; @@ -60,6 +60,8 @@ public class JettyHandlerAdvice { span.setAttribute(MoreTags.RESOURCE_NAME, resourceName); req.setAttribute(SPAN_ATTRIBUTE, span); + req.setAttribute("traceId", span.getContext().getTraceId().toLowerBase16()); + req.setAttribute("spanId", span.getContext().getSpanId().toLowerBase16()); return new SpanWithScope(span, TRACER.withSpan(span)); } diff --git a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerInstrumentation.java b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerInstrumentation.java index 1b00799946..a5faa004fa 100644 --- a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerInstrumentation.java +++ b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/auto/instrumentation/jetty8/JettyHandlerInstrumentation.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.jetty8; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -45,7 +45,7 @@ public final class JettyHandlerInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/eclipse/jetty/server/Handler.class")); + return hasClassesNamed("org.eclipse.jetty.server.Handler"); } @Override @@ -57,9 +57,6 @@ public final class JettyHandlerInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".JettyDecorator", packageName + ".HttpServletRequestExtractAdapter", packageName + ".TagSettingAsyncListener" diff --git a/instrumentation/jetty-8.0/src/test/groovy/JettyHandlerTest.groovy b/instrumentation/jetty-8.0/src/test/groovy/JettyHandlerTest.groovy index db9f1e3f39..7660aa3009 100644 --- a/instrumentation/jetty-8.0/src/test/groovy/JettyHandlerTest.groovy +++ b/instrumentation/jetty-8.0/src/test/groovy/JettyHandlerTest.groovy @@ -37,7 +37,7 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDI import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS import static io.opentelemetry.trace.Span.Kind.SERVER -class JettyHandlerTest extends HttpServerTest { +class JettyHandlerTest extends HttpServerTest { static { System.setProperty("ota.integration.jetty.enabled", "true") @@ -73,8 +73,8 @@ class JettyHandlerTest extends HttpServerTest { } @Override - JettyDecorator decorator() { - return JettyDecorator.DECORATE + String component() { + return JettyDecorator.DECORATE.getComponentName() } @Override @@ -141,7 +141,7 @@ class JettyHandlerTest extends HttpServerTest { tags { "$MoreTags.RESOURCE_NAME" "$method $handlerName" "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" serverDecorator.getComponentName() + "$Tags.COMPONENT" component "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional "$MoreTags.NET_PEER_PORT" Long "$Tags.HTTP_URL" { it == "${endpoint.resolve(address)}" || it == "${endpoint.resolveWithoutFragment(address)}" } diff --git a/instrumentation/jms-1.1/jms-1.1.gradle b/instrumentation/jms-1.1/jms-1.1.gradle index 7ca419ebfe..7b2c8463af 100644 --- a/instrumentation/jms-1.1/jms-1.1.gradle +++ b/instrumentation/jms-1.1/jms-1.1.gradle @@ -26,6 +26,8 @@ dependencies { testCompile group: 'org.apache.activemq', name: 'activemq-pool', version: '5.14.5' testCompile group: 'org.apache.activemq', name: 'activemq-broker', version: '5.14.5' + // required for Java 11+ . Latest version that runs on Java 7 + testCompile group: 'javax.annotation', name: 'javax.annotation-api', version: '1.2' testCompile group: 'org.springframework', name: 'spring-jms', version: '4.3.21.RELEASE' // 4.x required for Java 7 latestDepTestCompile group: 'org.hornetq', name: 'hornetq-jms-client', version: '2.4.7.Final' diff --git a/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringListenerJMS2Test.groovy b/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringListenerJMS2Test.groovy new file mode 100644 index 0000000000..35e13a3a84 --- /dev/null +++ b/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringListenerJMS2Test.groovy @@ -0,0 +1,48 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import io.opentelemetry.auto.test.AgentTestRunner +import listener.Config +import org.hornetq.jms.client.HornetQMessageConsumer +import org.springframework.context.annotation.AnnotationConfigApplicationContext +import org.springframework.jms.core.JmsTemplate +import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter + +import javax.jms.ConnectionFactory + +import static JMS2Test.consumerSpan +import static JMS2Test.producerSpan + +class SpringListenerJMS2Test extends AgentTestRunner { + + def "receiving message in spring listener generates spans"() { + setup: + def context = new AnnotationConfigApplicationContext(Config) + def factory = context.getBean(ConnectionFactory) + def template = new JmsTemplate(factory) + template.convertAndSend("SpringListenerJMS2", "a message") + + expect: + assertTraces(2) { + trace(0, 2) { + producerSpan(it, 0, "Queue SpringListenerJMS2") + consumerSpan(it, 1, "Queue SpringListenerJMS2", true, MessagingMessageListenerAdapter, span(0)) + } + trace(1, 1) { + consumerSpan(it, 0, "Queue SpringListenerJMS2", false, HornetQMessageConsumer, traces[0][0]) + } + } + } +} diff --git a/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringTemplateJMS2Test.groovy b/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringTemplateJMS2Test.groovy index e87c1f90f3..3a95952867 100644 --- a/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringTemplateJMS2Test.groovy +++ b/instrumentation/jms-1.1/src/latestDepTest/groovy/SpringTemplateJMS2Test.groovy @@ -25,6 +25,7 @@ import org.hornetq.core.config.impl.ConfigurationImpl import org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory import org.hornetq.core.remoting.impl.invm.InVMConnectorFactory import org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory +import org.hornetq.core.server.HornetQServer import org.hornetq.core.server.HornetQServers import org.hornetq.jms.client.HornetQMessageConsumer import org.springframework.jms.core.JmsTemplate @@ -38,6 +39,8 @@ import static JMS2Test.consumerSpan import static JMS2Test.producerSpan class SpringTemplateJMS2Test extends AgentTestRunner { + @Shared + HornetQServer server @Shared String messageText = "a message" @Shared @@ -60,12 +63,13 @@ class SpringTemplateJMS2Test extends AgentTestRunner { config.setAcceptorConfigurations([new TransportConfiguration(NettyAcceptorFactory.name), new TransportConfiguration(InVMAcceptorFactory.name)].toSet()) - HornetQServers.newHornetQServer(config).start() + server = HornetQServers.newHornetQServer(config) + server.start() def serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.name)) def sf = serverLocator.createSessionFactory() def clientSession = sf.createSession(false, false, false) - clientSession.createQueue("jms.queue.someSpringQueue", "jms.queue.someSpringQueue", true) + clientSession.createQueue("jms.queue.SpringTemplateJMS2", "jms.queue.SpringTemplateJMS2", true) clientSession.close() sf.close() serverLocator.close() @@ -82,6 +86,10 @@ class SpringTemplateJMS2Test extends AgentTestRunner { template.receiveTimeout = TimeUnit.SECONDS.toMillis(10) } + def cleanupSpec() { + server.stop() + } + def "sending a message to #jmsResourceName generates spans"() { setup: template.convertAndSend(destination, messageText) @@ -99,8 +107,8 @@ class SpringTemplateJMS2Test extends AgentTestRunner { } where: - destination | jmsResourceName - session.createQueue("someSpringQueue") | "Queue someSpringQueue" + destination | jmsResourceName + session.createQueue("SpringTemplateJMS2") | "Queue SpringTemplateJMS2" } def "send and receive message generates spans"() { @@ -136,7 +144,7 @@ class SpringTemplateJMS2Test extends AgentTestRunner { } where: - destination | jmsResourceName - session.createQueue("someSpringQueue") | "Queue someSpringQueue" + destination | jmsResourceName + session.createQueue("SpringTemplateJMS2") | "Queue SpringTemplateJMS2" } } diff --git a/instrumentation/jms-1.1/src/latestDepTest/groovy/listener/Config.groovy b/instrumentation/jms-1.1/src/latestDepTest/groovy/listener/Config.groovy new file mode 100644 index 0000000000..bf9db547db --- /dev/null +++ b/instrumentation/jms-1.1/src/latestDepTest/groovy/listener/Config.groovy @@ -0,0 +1,89 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package listener + +import com.google.common.io.Files +import org.hornetq.api.core.TransportConfiguration +import org.hornetq.api.core.client.HornetQClient +import org.hornetq.api.jms.HornetQJMSClient +import org.hornetq.api.jms.JMSFactoryType +import org.hornetq.core.config.CoreQueueConfiguration +import org.hornetq.core.config.impl.ConfigurationImpl +import org.hornetq.core.remoting.impl.invm.InVMAcceptorFactory +import org.hornetq.core.remoting.impl.invm.InVMConnectorFactory +import org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory +import org.hornetq.core.server.HornetQServer +import org.hornetq.core.server.HornetQServers +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.jms.annotation.EnableJms +import org.springframework.jms.config.DefaultJmsListenerContainerFactory +import org.springframework.jms.config.JmsListenerContainerFactory + +import javax.annotation.PreDestroy +import javax.jms.ConnectionFactory + +@Configuration +@ComponentScan +@EnableJms +class Config { + + private HornetQServer server + + @Bean + ConnectionFactory connectionFactory() { + def tempDir = Files.createTempDir() + tempDir.deleteOnExit() + + org.hornetq.core.config.Configuration config = new ConfigurationImpl() + config.bindingsDirectory = tempDir.path + config.journalDirectory = tempDir.path + config.createBindingsDir = false + config.createJournalDir = false + config.securityEnabled = false + config.persistenceEnabled = false + config.setQueueConfigurations([new CoreQueueConfiguration("someQueue", "someQueue", null, true)]) + config.setAcceptorConfigurations([new TransportConfiguration(NettyAcceptorFactory.name), + new TransportConfiguration(InVMAcceptorFactory.name)].toSet()) + + server = HornetQServers.newHornetQServer(config) + server.start() + + def serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.name)) + def sf = serverLocator.createSessionFactory() + def clientSession = sf.createSession(false, false, false) + clientSession.createQueue("jms.queue.SpringListenerJMS2", "jms.queue.SpringListenerJMS2", true) + clientSession.close() + sf.close() + serverLocator.close() + + return HornetQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, + new TransportConfiguration(InVMConnectorFactory.name)) + } + + @Bean + JmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) { + DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory() + factory.setConnectionFactory(connectionFactory) + return factory + } + + @PreDestroy + void destroy() { + server.stop() + } +} diff --git a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/HeadersInjectAdapter.java b/instrumentation/jms-1.1/src/latestDepTest/groovy/listener/TestListener.groovy similarity index 57% rename from instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/HeadersInjectAdapter.java rename to instrumentation/jms-1.1/src/latestDepTest/groovy/listener/TestListener.groovy index b82021c676..e2eccd2544 100644 --- a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/HeadersInjectAdapter.java +++ b/instrumentation/jms-1.1/src/latestDepTest/groovy/listener/TestListener.groovy @@ -13,17 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.playws21; +package listener -import io.opentelemetry.context.propagation.HttpTextFormat; -import play.shaded.ahc.org.asynchttpclient.Request; +import org.springframework.jms.annotation.JmsListener +import org.springframework.stereotype.Component -public class HeadersInjectAdapter implements HttpTextFormat.Setter { +@Component +class TestListener { - public static final HeadersInjectAdapter SETTER = new HeadersInjectAdapter(); - - @Override - public void put(final Request carrier, final String key, final String value) { - carrier.getHeaders().add(key, value); + @JmsListener(destination = "SpringListenerJMS2", containerFactory = "containerFactory") + void receiveMessage(String message) { + println "received: " + message } } diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSDecorator.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSDecorator.java index 2fb00c8272..d5d55218c3 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSDecorator.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jms; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageConsumerInstrumentation.java index ad06ec4183..15e4e4e3e5 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -18,12 +18,11 @@ package io.opentelemetry.auto.instrumentation.jms; import static io.opentelemetry.auto.instrumentation.jms.JMSDecorator.CONSUMER_DECORATE; import static io.opentelemetry.auto.instrumentation.jms.JMSDecorator.TRACER; import static io.opentelemetry.auto.instrumentation.jms.MessageExtractAdapter.GETTER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; @@ -52,7 +51,7 @@ public final class JMSMessageConsumerInstrumentation extends Instrumenter.Defaul @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/jms/MessageConsumer.class")); + return hasClassesNamed("javax.jms.MessageConsumer"); } @Override @@ -63,8 +62,6 @@ public final class JMSMessageConsumerInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".JMSDecorator", packageName + ".JMSDecorator$1", packageName + ".JMSDecorator$2", diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageListenerInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageListenerInstrumentation.java index 09dba9c0e4..6dd7dffdb8 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageListenerInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageListenerInstrumentation.java @@ -18,13 +18,12 @@ package io.opentelemetry.auto.instrumentation.jms; import static io.opentelemetry.auto.instrumentation.jms.JMSDecorator.CONSUMER_DECORATE; import static io.opentelemetry.auto.instrumentation.jms.JMSDecorator.TRACER; import static io.opentelemetry.auto.instrumentation.jms.MessageExtractAdapter.GETTER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.trace.Span.Kind.CONSUMER; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -50,7 +49,7 @@ public final class JMSMessageListenerInstrumentation extends Instrumenter.Defaul @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/jms/MessageListener.class")); + return hasClassesNamed("javax.jms.MessageListener"); } @Override @@ -61,8 +60,6 @@ public final class JMSMessageListenerInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".JMSDecorator", packageName + ".JMSDecorator$1", packageName + ".JMSDecorator$2", diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageProducerInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageProducerInstrumentation.java index bc240e4739..35bddd1aaa 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageProducerInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/auto/instrumentation/jms/JMSMessageProducerInstrumentation.java @@ -18,12 +18,11 @@ package io.opentelemetry.auto.instrumentation.jms; import static io.opentelemetry.auto.instrumentation.jms.JMSDecorator.PRODUCER_DECORATE; import static io.opentelemetry.auto.instrumentation.jms.JMSDecorator.TRACER; import static io.opentelemetry.auto.instrumentation.jms.MessageInjectAdapter.SETTER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.trace.Span.Kind.PRODUCER; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -52,7 +51,7 @@ public final class JMSMessageProducerInstrumentation extends Instrumenter.Defaul @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/jms/MessageProducer.class")); + return hasClassesNamed("javax.jms.MessageProducer"); } @Override @@ -63,8 +62,6 @@ public final class JMSMessageProducerInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".JMSDecorator", packageName + ".JMSDecorator$1", packageName + ".JMSDecorator$2", diff --git a/instrumentation/jms-1.1/src/test/groovy/SpringListenerJMS1Test.groovy b/instrumentation/jms-1.1/src/test/groovy/SpringListenerJMS1Test.groovy new file mode 100644 index 0000000000..a6fe5084e6 --- /dev/null +++ b/instrumentation/jms-1.1/src/test/groovy/SpringListenerJMS1Test.groovy @@ -0,0 +1,52 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import io.opentelemetry.auto.test.AgentTestRunner +import listener.Config +import org.apache.activemq.ActiveMQMessageConsumer +import org.apache.activemq.junit.EmbeddedActiveMQBroker +import org.springframework.context.annotation.AnnotationConfigApplicationContext +import org.springframework.jms.core.JmsTemplate +import org.springframework.jms.listener.adapter.MessagingMessageListenerAdapter + +import javax.jms.ConnectionFactory + +import static JMS1Test.consumerSpan +import static JMS1Test.producerSpan + +class SpringListenerJMS1Test extends AgentTestRunner { + + def "receiving message in spring listener generates spans"() { + setup: + def context = new AnnotationConfigApplicationContext(Config) + def factory = context.getBean(ConnectionFactory) + def template = new JmsTemplate(factory) + template.convertAndSend("SpringListenerJMS1", "a message") + + expect: + assertTraces(2) { + trace(0, 2) { + producerSpan(it, 0, "Queue SpringListenerJMS1") + consumerSpan(it, 1, "Queue SpringListenerJMS1", true, MessagingMessageListenerAdapter, span(0)) + } + trace(1, 1) { + consumerSpan(it, 0, "Queue SpringListenerJMS1", false, ActiveMQMessageConsumer, traces[0][0]) + } + } + + cleanup: + context.getBean(EmbeddedActiveMQBroker).stop() + } +} diff --git a/instrumentation/jms-1.1/src/test/groovy/SpringTemplateJMS1Test.groovy b/instrumentation/jms-1.1/src/test/groovy/SpringTemplateJMS1Test.groovy index 5946799a40..b049c70db2 100644 --- a/instrumentation/jms-1.1/src/test/groovy/SpringTemplateJMS1Test.groovy +++ b/instrumentation/jms-1.1/src/test/groovy/SpringTemplateJMS1Test.groovy @@ -19,6 +19,7 @@ import org.apache.activemq.ActiveMQConnectionFactory import org.apache.activemq.ActiveMQMessageConsumer import org.apache.activemq.junit.EmbeddedActiveMQBroker import org.springframework.jms.core.JmsTemplate +import spock.lang.Retry import spock.lang.Shared import javax.jms.Connection @@ -29,6 +30,7 @@ import java.util.concurrent.TimeUnit import static JMS1Test.consumerSpan import static JMS1Test.producerSpan +@Retry class SpringTemplateJMS1Test extends AgentTestRunner { @Shared EmbeddedActiveMQBroker broker = new EmbeddedActiveMQBroker() @@ -73,8 +75,8 @@ class SpringTemplateJMS1Test extends AgentTestRunner { } where: - destination | jmsResourceName - session.createQueue("someSpringQueue") | "Queue someSpringQueue" + destination | jmsResourceName + session.createQueue("SpringTemplateJMS1") | "Queue SpringTemplateJMS1" } def "send and receive message generates spans"() { @@ -114,7 +116,7 @@ class SpringTemplateJMS1Test extends AgentTestRunner { } where: - destination | jmsResourceName - session.createQueue("someSpringQueue") | "Queue someSpringQueue" + destination | jmsResourceName + session.createQueue("SpringTemplateJMS1") | "Queue SpringTemplateJMS1" } } diff --git a/instrumentation/jms-1.1/src/test/groovy/listener/Config.groovy b/instrumentation/jms-1.1/src/test/groovy/listener/Config.groovy new file mode 100644 index 0000000000..881ba0ed80 --- /dev/null +++ b/instrumentation/jms-1.1/src/test/groovy/listener/Config.groovy @@ -0,0 +1,57 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package listener + +import org.apache.activemq.junit.EmbeddedActiveMQBroker +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.jms.annotation.EnableJms +import org.springframework.jms.config.DefaultJmsListenerContainerFactory +import org.springframework.jms.config.JmsListenerContainerFactory + +import javax.annotation.PreDestroy +import javax.jms.ConnectionFactory + +@Configuration +@ComponentScan +@EnableJms +class Config { + + @Bean + EmbeddedActiveMQBroker broker() { + def broker = new EmbeddedActiveMQBroker() + broker.start() + return broker + } + + @Bean + ConnectionFactory connectionFactory(EmbeddedActiveMQBroker broker) { + return broker.createConnectionFactory() + } + + @Bean + JmsListenerContainerFactory containerFactory(ConnectionFactory connectionFactory) { + DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory() + factory.setConnectionFactory(connectionFactory) + return factory + } + + @PreDestroy + void destroy() { + broker().stop() + } +} diff --git a/instrumentation/grpc-1.5/src/test/groovy/util/BlockingListener.groovy b/instrumentation/jms-1.1/src/test/groovy/listener/TestListener.groovy similarity index 51% rename from instrumentation/grpc-1.5/src/test/groovy/util/BlockingListener.groovy rename to instrumentation/jms-1.1/src/test/groovy/listener/TestListener.groovy index 40d564b629..b537d7614f 100644 --- a/instrumentation/grpc-1.5/src/test/groovy/util/BlockingListener.groovy +++ b/instrumentation/jms-1.1/src/test/groovy/listener/TestListener.groovy @@ -13,26 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package util +package listener -import io.grpc.ClientCall -import io.grpc.ForwardingClientCallListener -import io.grpc.Metadata -import io.grpc.Status +import org.springframework.jms.annotation.JmsListener +import org.springframework.stereotype.Component -import java.util.concurrent.Phaser +@Component +class TestListener { -class BlockingListener extends ForwardingClientCallListener.SimpleForwardingClientCallListener { - private final Phaser phaser - - BlockingListener(ClientCall.Listener delegate, Phaser phaser) { - super(delegate) - this.phaser = phaser - } - - @Override - void onClose(final Status status, final Metadata trailers) { - delegate().onClose(status, trailers) - phaser.arriveAndAwaitAdvance() + @JmsListener(destination = "SpringListenerJMS1", containerFactory = "containerFactory") + void receiveMessage(String message) { + println "received: " + message } } diff --git a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPDecorator.java b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPDecorator.java index d04c4a0033..e1aba289e6 100644 --- a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPDecorator.java +++ b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.jsp; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPInstrumentation.java b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPInstrumentation.java index 9e95e3af74..9607265285 100644 --- a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPInstrumentation.java +++ b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JSPInstrumentation.java @@ -17,12 +17,11 @@ package io.opentelemetry.auto.instrumentation.jsp; import static io.opentelemetry.auto.instrumentation.jsp.JSPDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.jsp.JSPDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -46,7 +45,7 @@ public final class JSPInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/jsp/HttpJspPage.class")); + return hasClassesNamed("javax.servlet.jsp.HttpJspPage"); } @Override @@ -57,7 +56,7 @@ public final class JSPInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".JSPDecorator", + packageName + ".JSPDecorator", }; } diff --git a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java index 5d39aba152..5d718adcdd 100644 --- a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java +++ b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/auto/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java @@ -48,7 +48,7 @@ public final class JasperJSPCompilationContextInstrumentation extends Instrument @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".JSPDecorator", + packageName + ".JSPDecorator", }; } diff --git a/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy b/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy index c4de280d89..0674a6daf3 100644 --- a/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy +++ b/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ import com.google.common.io.Files -import io.opentelemetry.auto.decorator.HttpServerDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy b/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy index 237f4faf37..cb38247c33 100644 --- a/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy +++ b/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy @@ -14,7 +14,7 @@ * limitations under the License. */ import com.google.common.io.Files -import io.opentelemetry.auto.decorator.HttpServerDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java b/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java index 183fb37c36..8f67d30e85 100644 --- a/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java +++ b/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java @@ -50,8 +50,6 @@ public final class KafkaConsumerInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".KafkaDecorator", packageName + ".KafkaDecorator$1", packageName + ".KafkaDecorator$2", diff --git a/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaDecorator.java b/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaDecorator.java index 9ef1ab88ea..6d728fc0b3 100644 --- a/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaDecorator.java +++ b/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.kafka_clients; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaProducerInstrumentation.java b/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaProducerInstrumentation.java index 419d5f62bc..55a9610dac 100644 --- a/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaProducerInstrumentation.java +++ b/instrumentation/kafka-clients-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_clients/KafkaProducerInstrumentation.java @@ -56,8 +56,6 @@ public final class KafkaProducerInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".KafkaDecorator", packageName + ".KafkaDecorator$1", packageName + ".KafkaDecorator$2", diff --git a/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsDecorator.java b/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsDecorator.java index 6622683d58..f2e47c6ac4 100644 --- a/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsDecorator.java +++ b/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.kafka_streams; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsProcessorInstrumentation.java b/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsProcessorInstrumentation.java index b84f973e14..3f9ebe0ab6 100644 --- a/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsProcessorInstrumentation.java +++ b/instrumentation/kafka-streams-0.11/src/main/java/io/opentelemetry/auto/instrumentation/kafka_streams/KafkaStreamsProcessorInstrumentation.java @@ -73,8 +73,6 @@ public class KafkaStreamsProcessorInstrumentation { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".KafkaStreamsDecorator", packageName + ".TextMapExtractAdapter", KafkaStreamsProcessorInstrumentation.class.getName() + "$SpanScopeHolder" @@ -138,8 +136,6 @@ public class KafkaStreamsProcessorInstrumentation { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".KafkaStreamsDecorator", packageName + ".TextMapExtractAdapter", KafkaStreamsProcessorInstrumentation.class.getName() + "$SpanScopeHolder" diff --git a/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceAsyncCommandsInstrumentation.java b/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceAsyncCommandsInstrumentation.java index 315fd08366..f5499edea6 100644 --- a/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceAsyncCommandsInstrumentation.java +++ b/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceAsyncCommandsInstrumentation.java @@ -42,9 +42,6 @@ public class LettuceAsyncCommandsInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".LettuceClientDecorator", packageName + ".LettuceAsyncBiFunction", packageName + ".LettuceInstrumentationUtil" diff --git a/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientInstrumentation.java b/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientInstrumentation.java index 6048accb42..e1a3767ba9 100644 --- a/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientInstrumentation.java +++ b/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientInstrumentation.java @@ -46,9 +46,6 @@ public final class LettuceClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".LettuceClientDecorator", packageName + ".LettuceInstrumentationUtil", packageName + ".LettuceAsyncBiFunction" diff --git a/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceReactiveCommandsInstrumentation.java b/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceReactiveCommandsInstrumentation.java index b2608440ca..f0a1a5ebc9 100644 --- a/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceReactiveCommandsInstrumentation.java +++ b/instrumentation/lettuce-5.0/src/main/java/io/opentelemetry/auto/instrumentation/lettuce/LettuceReactiveCommandsInstrumentation.java @@ -45,9 +45,6 @@ public class LettuceReactiveCommandsInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", packageName + ".LettuceClientDecorator", packageName + ".LettuceInstrumentationUtil", packageName + ".rx.LettuceMonoCreationAdvice", diff --git a/instrumentation/lettuce-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientDecorator.java b/instrumentation/lettuce-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientDecorator.java index 0b33f72ce1..d191045d39 100644 --- a/instrumentation/lettuce-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientDecorator.java +++ b/instrumentation/lettuce-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/lettuce/LettuceClientDecorator.java @@ -18,10 +18,9 @@ package io.opentelemetry.auto.instrumentation.lettuce; import io.lettuce.core.RedisURI; import io.lettuce.core.protocol.RedisCommand; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; -import io.opentelemetry.auto.instrumentation.api.Tags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/mongo/mongo-3.1/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientInstrumentation.java b/instrumentation/mongo/mongo-3.1/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientInstrumentation.java index 4cd1d1862c..eca2aeb76a 100644 --- a/instrumentation/mongo/mongo-3.1/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientInstrumentation.java +++ b/instrumentation/mongo/mongo-3.1/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientInstrumentation.java @@ -59,11 +59,7 @@ public final class MongoClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", - packageName + ".MongoClientDecorator", - packageName + ".TracingCommandListener" + packageName + ".MongoClientDecorator", packageName + ".TracingCommandListener" }; } diff --git a/instrumentation/mongo/mongo-3.7/src/main/java/io/opentelemetry/auto/instrumentation/mongo/v3_7/MongoClientInstrumentation.java b/instrumentation/mongo/mongo-3.7/src/main/java/io/opentelemetry/auto/instrumentation/mongo/v3_7/MongoClientInstrumentation.java index 3cdb383dcd..0715c7ed3a 100644 --- a/instrumentation/mongo/mongo-3.7/src/main/java/io/opentelemetry/auto/instrumentation/mongo/v3_7/MongoClientInstrumentation.java +++ b/instrumentation/mongo/mongo-3.7/src/main/java/io/opentelemetry/auto/instrumentation/mongo/v3_7/MongoClientInstrumentation.java @@ -60,9 +60,6 @@ public final class MongoClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", "io.opentelemetry.auto.instrumentation.mongo.MongoClientDecorator", "io.opentelemetry.auto.instrumentation.mongo.TracingCommandListener" }; diff --git a/instrumentation/mongo/mongo-async-3.3/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoAsyncClientInstrumentation.java b/instrumentation/mongo/mongo-async-3.3/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoAsyncClientInstrumentation.java index 5e1cb65046..7984949b59 100644 --- a/instrumentation/mongo/mongo-async-3.3/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoAsyncClientInstrumentation.java +++ b/instrumentation/mongo/mongo-async-3.3/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoAsyncClientInstrumentation.java @@ -59,11 +59,7 @@ public final class MongoAsyncClientInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.DatabaseClientDecorator", - packageName + ".MongoClientDecorator", - packageName + ".TracingCommandListener" + packageName + ".MongoClientDecorator", packageName + ".TracingCommandListener" }; } diff --git a/instrumentation/mongo/mongo-common/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientDecorator.java b/instrumentation/mongo/mongo-common/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientDecorator.java index 65f45d411f..68eb39b912 100644 --- a/instrumentation/mongo/mongo-common/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientDecorator.java +++ b/instrumentation/mongo/mongo-common/src/main/java/io/opentelemetry/auto/instrumentation/mongo/MongoClientDecorator.java @@ -21,7 +21,7 @@ import com.mongodb.connection.ConnectionId; import com.mongodb.connection.ServerId; import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.DatabaseClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.DatabaseClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/netty/netty-4.0/netty-4.0.gradle b/instrumentation/netty/netty-4.0/netty-4.0.gradle index f29dd2dad9..189330b498 100644 --- a/instrumentation/netty/netty-4.0/netty-4.0.gradle +++ b/instrumentation/netty/netty-4.0/netty-4.0.gradle @@ -42,8 +42,6 @@ testSets { dependencies { compileOnly group: 'io.netty', name: 'netty-codec-http', version: '4.0.0.Final' - testCompile project(':instrumentation:java-concurrent') - testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.0.0.Final' testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.0' diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/ChannelFutureListenerInstrumentation.java index 9adf616c8f..94899c9f50 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/ChannelFutureListenerInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.netty40; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.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.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -48,7 +47,7 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("io/netty/channel/ChannelFutureListener.class")); + return hasClassesNamed("io.netty.channel.ChannelFutureListener"); } @Override @@ -61,18 +60,13 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { return new String[] { packageName + ".AttributeKeys", packageName + ".AttributeKeys$1", - "io.opentelemetry.auto.decorator.BaseDecorator", // client helpers - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".client.NettyHttpClientDecorator", packageName + ".client.NettyResponseInjectAdapter", packageName + ".client.HttpClientRequestTracingHandler", packageName + ".client.HttpClientResponseTracingHandler", packageName + ".client.HttpClientTracingHandler", // server helpers - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".server.NettyHttpServerDecorator", packageName + ".server.NettyRequestExtractAdapter", packageName + ".server.HttpServerRequestTracingHandler", diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/NettyChannelPipelineInstrumentation.java index 2cfd022a82..0c628c8181 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/NettyChannelPipelineInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.netty40; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -64,7 +63,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("io/netty/channel/ChannelPipeline.class")); + return hasClassesNamed("io.netty.channel.ChannelPipeline"); } @Override @@ -77,18 +76,13 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { return new String[] { packageName + ".AttributeKeys", packageName + ".AttributeKeys$1", - "io.opentelemetry.auto.decorator.BaseDecorator", // client helpers - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".client.NettyHttpClientDecorator", packageName + ".client.NettyResponseInjectAdapter", packageName + ".client.HttpClientRequestTracingHandler", packageName + ".client.HttpClientResponseTracingHandler", packageName + ".client.HttpClientTracingHandler", // server helpers - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".server.NettyHttpServerDecorator", packageName + ".server.NettyRequestExtractAdapter", packageName + ".server.HttpServerRequestTracingHandler", diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/client/NettyHttpClientDecorator.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/client/NettyHttpClientDecorator.java index 9e6d67d907..fd0f565d81 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/client/NettyHttpClientDecorator.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/client/NettyHttpClientDecorator.java @@ -20,7 +20,7 @@ import static io.netty.handler.codec.http.HttpHeaders.Names.HOST; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/server/NettyHttpServerDecorator.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/server/NettyHttpServerDecorator.java index 36d89cb5ea..d44455653e 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/server/NettyHttpServerDecorator.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/auto/instrumentation/netty40/server/NettyHttpServerDecorator.java @@ -21,7 +21,7 @@ import io.netty.channel.Channel; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Tracer; import java.net.InetSocketAddress; import java.net.SocketAddress; diff --git a/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ClientTest.groovy b/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ClientTest.groovy index 1fcb2364aa..cabb33469a 100644 --- a/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ClientTest.groovy +++ b/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ClientTest.groovy @@ -31,7 +31,7 @@ import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace import static org.asynchttpclient.Dsl.asyncHttpClient -class Netty40ClientTest extends HttpClientTest { +class Netty40ClientTest extends HttpClientTest { @Shared def clientConfig = DefaultAsyncHttpClientConfig.Builder.newInstance().setRequestTimeout(TimeUnit.SECONDS.toMillis(10).toInteger()) @@ -55,8 +55,8 @@ class Netty40ClientTest extends HttpClientTest { } @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ServerTest.groovy b/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ServerTest.groovy index beddaf2140..40e2edc3f9 100644 --- a/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ServerTest.groovy +++ b/instrumentation/netty/netty-4.0/src/test/groovy/Netty40ServerTest.groovy @@ -47,7 +47,7 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.QUER import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDIRECT import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS -class Netty40ServerTest extends HttpServerTest { +class Netty40ServerTest extends HttpServerTest { @Override EventLoopGroup startServer(int port) { @@ -120,7 +120,7 @@ class Netty40ServerTest extends HttpServerTest classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("io/netty/channel/ChannelFutureListener.class")); + return hasClassesNamed("io.netty.channel.ChannelFutureListener"); } @Override @@ -61,18 +60,13 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { return new String[] { packageName + ".AttributeKeys", packageName + ".AttributeKeys$1", - "io.opentelemetry.auto.decorator.BaseDecorator", // client helpers - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".client.NettyHttpClientDecorator", packageName + ".client.NettyResponseInjectAdapter", packageName + ".client.HttpClientRequestTracingHandler", packageName + ".client.HttpClientResponseTracingHandler", packageName + ".client.HttpClientTracingHandler", // server helpers - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".server.NettyHttpServerDecorator", packageName + ".server.NettyRequestExtractAdapter", packageName + ".server.HttpServerRequestTracingHandler", diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/NettyChannelPipelineInstrumentation.java index 2fbf2835ce..d39783b92d 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/NettyChannelPipelineInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.netty41; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -64,7 +63,7 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("io/netty/channel/ChannelPipeline.class")); + return hasClassesNamed("io.netty.channel.ChannelPipeline"); } @Override @@ -77,18 +76,13 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { return new String[] { packageName + ".AttributeKeys", packageName + ".AttributeKeys$1", - "io.opentelemetry.auto.decorator.BaseDecorator", // client helpers - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".client.NettyHttpClientDecorator", packageName + ".client.NettyResponseInjectAdapter", packageName + ".client.HttpClientRequestTracingHandler", packageName + ".client.HttpClientResponseTracingHandler", packageName + ".client.HttpClientTracingHandler", // server helpers - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".server.NettyHttpServerDecorator", packageName + ".server.NettyRequestExtractAdapter", packageName + ".server.HttpServerRequestTracingHandler", diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/client/NettyHttpClientDecorator.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/client/NettyHttpClientDecorator.java index 80f9f093a4..bd35dfdd4c 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/client/NettyHttpClientDecorator.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/client/NettyHttpClientDecorator.java @@ -20,7 +20,7 @@ import static io.netty.handler.codec.http.HttpHeaderNames.HOST; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/server/NettyHttpServerDecorator.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/server/NettyHttpServerDecorator.java index 4c24ad0551..9fe6628d57 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/server/NettyHttpServerDecorator.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/auto/instrumentation/netty41/server/NettyHttpServerDecorator.java @@ -21,7 +21,7 @@ import io.netty.channel.Channel; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponse; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Tracer; import java.net.InetSocketAddress; import java.net.SocketAddress; diff --git a/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy b/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy index 3b5df40bd8..7307b83448 100644 --- a/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy +++ b/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ClientTest.groovy @@ -28,6 +28,7 @@ import org.asynchttpclient.AsyncCompletionHandler import org.asynchttpclient.AsyncHttpClient import org.asynchttpclient.DefaultAsyncHttpClientConfig import org.asynchttpclient.Response +import spock.lang.Retry import spock.lang.Shared import java.util.concurrent.ExecutionException @@ -39,7 +40,8 @@ import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace import static org.asynchttpclient.Dsl.asyncHttpClient -class Netty41ClientTest extends HttpClientTest { +@Retry +class Netty41ClientTest extends HttpClientTest { @Shared def clientConfig = DefaultAsyncHttpClientConfig.Builder.newInstance().setRequestTimeout(TimeUnit.SECONDS.toMillis(10).toInteger()) @@ -62,8 +64,8 @@ class Netty41ClientTest extends HttpClientTest { } @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ServerTest.groovy b/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ServerTest.groovy index 98cfe2009d..a46391a6e6 100644 --- a/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ServerTest.groovy +++ b/instrumentation/netty/netty-4.1/src/test/groovy/Netty41ServerTest.groovy @@ -46,7 +46,7 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.QUER import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDIRECT import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS -class Netty41ServerTest extends HttpServerTest { +class Netty41ServerTest extends HttpServerTest { @Override EventLoopGroup startServer(int port) { @@ -119,7 +119,7 @@ class Netty41ServerTest extends HttpServerTest { +class OkHttp3Test extends HttpClientTest { - def client = new OkHttpClient() + def client = new OkHttpClient() - @Override - int doRequest(String method, URI uri, Map headers, Closure callback) { - def body = HttpMethod.requiresRequestBody(method) ? RequestBody.create(MediaType.parse("text/plain"), "") : null - def request = new Request.Builder() - .url(uri.toURL()) - .method(method, body) - .headers(Headers.of(headers)).build() - def response = client.newCall(request).execute() - callback?.call() - return response.code() - } + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + def body = HttpMethod.requiresRequestBody(method) ? RequestBody.create(MediaType.parse("text/plain"), "") : null + def request = new Request.Builder() + .url(uri.toURL()) + .method(method, body) + .headers(Headers.of(headers)).build() + def response = client.newCall(request).execute() + callback?.call() + return response.code() + } - @Override - OkHttpClientDecorator decorator() { - return OkHttpClientDecorator.DECORATE - } + @Override + String component() { + return OkHttpClientDecorator.DECORATE.getComponentName() + } - boolean testRedirects() { - false - } + boolean testRedirects() { + false + } } diff --git a/instrumentation/play-ws/play-ws-1.0/play-ws-1.0.gradle b/instrumentation/play-ws/play-ws-1.0/play-ws-1.0.gradle index 7c90639059..e668a7f944 100644 --- a/instrumentation/play-ws/play-ws-1.0/play-ws-1.0.gradle +++ b/instrumentation/play-ws/play-ws-1.0/play-ws-1.0.gradle @@ -37,7 +37,8 @@ def scalaVersion = '2.12' dependencies { compileOnly group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '1.0.2' - testCompile project(':instrumentation:java-concurrent') + compile project(':instrumentation:play-ws:play-ws-common') + testCompile project(path: ':instrumentation:play-ws:play-ws-common', configuration: 'testArtifacts') // These are to ensure cross compatibility testCompile project(':instrumentation:netty:netty-4.0') diff --git a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/AsyncHandlerWrapper.java b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/AsyncHandlerWrapper.java index 63768ca5e4..282cad14fd 100644 --- a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/AsyncHandlerWrapper.java +++ b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/AsyncHandlerWrapper.java @@ -15,8 +15,8 @@ */ package io.opentelemetry.auto.instrumentation.playws1; -import static io.opentelemetry.auto.instrumentation.playws1.PlayWSClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.playws1.PlayWSClientDecorator.TRACER; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.TRACER; import io.opentelemetry.context.Scope; import io.opentelemetry.trace.Span; diff --git a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientDecorator.java b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientDecorator.java deleted file mode 100644 index 29ffd83490..0000000000 --- a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientDecorator.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2020, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.opentelemetry.auto.instrumentation.playws1; - -import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; -import io.opentelemetry.trace.Tracer; -import java.net.URI; -import java.net.URISyntaxException; -import play.shaded.ahc.org.asynchttpclient.Request; -import play.shaded.ahc.org.asynchttpclient.Response; - -public class PlayWSClientDecorator extends HttpClientDecorator { - public static final PlayWSClientDecorator DECORATE = new PlayWSClientDecorator(); - - public static final Tracer TRACER = - OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto.play-ws-1.0"); - - @Override - protected String method(final Request request) { - return request.getMethod(); - } - - @Override - protected URI url(final Request request) throws URISyntaxException { - return request.getUri().toJavaNetURI(); - } - - @Override - protected String hostname(final Request request) { - return request.getUri().getHost(); - } - - @Override - protected Integer port(final Request request) { - return request.getUri().getPort(); - } - - @Override - protected Integer status(final Response response) { - return response.getStatusCode(); - } - - @Override - protected String getComponentName() { - return "play-ws"; - } -} diff --git a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientInstrumentation.java index f87f52cdfa..8e7d93f974 100644 --- a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/PlayWSClientInstrumentation.java @@ -15,74 +15,22 @@ */ package io.opentelemetry.auto.instrumentation.playws1; -import static io.opentelemetry.auto.instrumentation.playws1.HeadersInjectAdapter.SETTER; -import static io.opentelemetry.auto.instrumentation.playws1.PlayWSClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.playws1.PlayWSClientDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; -import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.auto.instrumentation.playws.HeadersInjectAdapter.SETTER; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.TRACER; import static io.opentelemetry.trace.Span.Kind.CLIENT; -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.not; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; +import io.opentelemetry.auto.instrumentation.playws.BasePlayWSClientInstrumentation; import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; -import java.util.Map; import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; import play.shaded.ahc.org.asynchttpclient.AsyncHandler; import play.shaded.ahc.org.asynchttpclient.Request; +import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; @AutoService(Instrumenter.class) -public class PlayWSClientInstrumentation extends Instrumenter.Default { - public PlayWSClientInstrumentation() { - super("play-ws"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return not( - classLoaderHasNoResources("play/shaded/ahc/org/asynchttpclient/AsyncHttpClient.class")); - } - - @Override - public ElementMatcher typeMatcher() { - // CachingAsyncHttpClient rejects overrides to AsyncHandler - // It also delegates to another AsyncHttpClient - return implementsInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient")) - .and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient"))); - } - - @Override - public Map, String> transformers() { - return singletonMap( - isMethod() - .and(named("execute")) - .and(takesArguments(2)) - .and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request"))) - .and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))), - PlayWSClientInstrumentation.class.getName() + "$ClientAdvice"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - packageName + ".PlayWSClientDecorator", - packageName + ".HeadersInjectAdapter", - packageName + ".AsyncHandlerWrapper" - }; - } - +public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation { public static class ClientAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Span methodEnter( @@ -96,7 +44,11 @@ public class PlayWSClientInstrumentation extends Instrumenter.Default { DECORATE.onRequest(span, request); TRACER.getHttpTextFormat().inject(span.getContext(), request, SETTER); - asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); + if (asyncHandler instanceof StreamedAsyncHandler) { + asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); + } else { + asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); + } return span; } diff --git a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/StreamedAsyncHandlerWrapper.java b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/StreamedAsyncHandlerWrapper.java new file mode 100644 index 0000000000..018812c023 --- /dev/null +++ b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/auto/instrumentation/playws1/StreamedAsyncHandlerWrapper.java @@ -0,0 +1,35 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.opentelemetry.auto.instrumentation.playws1; + +import io.opentelemetry.trace.Span; +import org.reactivestreams.Publisher; +import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; + +public class StreamedAsyncHandlerWrapper extends AsyncHandlerWrapper + implements StreamedAsyncHandler { + private final StreamedAsyncHandler streamedDelegate; + + public StreamedAsyncHandlerWrapper(final StreamedAsyncHandler delegate, final Span span) { + super(delegate, span); + streamedDelegate = delegate; + } + + @Override + public State onStream(final Publisher publisher) { + return streamedDelegate.onStream(publisher); + } +} diff --git a/instrumentation/play-ws/play-ws-1.0/src/test/groovy/PlayWSClientTest.groovy b/instrumentation/play-ws/play-ws-1.0/src/test/groovy/PlayWSClientTest.groovy index fd573c2b65..1f3466656e 100644 --- a/instrumentation/play-ws/play-ws-1.0/src/test/groovy/PlayWSClientTest.groovy +++ b/instrumentation/play-ws/play-ws-1.0/src/test/groovy/PlayWSClientTest.groovy @@ -13,59 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import akka.actor.ActorSystem -import akka.stream.ActorMaterializer -import akka.stream.ActorMaterializerSettings -import io.opentelemetry.auto.instrumentation.playws1.PlayWSClientDecorator -import io.opentelemetry.auto.test.base.HttpClientTest import play.libs.ws.StandaloneWSClient import play.libs.ws.StandaloneWSRequest import play.libs.ws.StandaloneWSResponse import play.libs.ws.ahc.StandaloneAhcWSClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig +import scala.collection.JavaConverters +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.concurrent.duration.Duration import spock.lang.Shared import java.util.concurrent.TimeUnit -class PlayWSClientTest extends HttpClientTest { - @Shared - ActorSystem system - +class PlayJavaWSClientTest extends PlayWSClientTestBase { @Shared StandaloneWSClient wsClient - def setupSpec() { - String name = "play-ws" - system = ActorSystem.create(name) - ActorMaterializerSettings settings = ActorMaterializerSettings.create(system) - ActorMaterializer materializer = ActorMaterializer.create(settings, system, name) - - AsyncHttpClientConfig asyncHttpClientConfig = - new DefaultAsyncHttpClientConfig.Builder() - .setMaxRequestRetry(0) - .setShutdownQuietPeriod(0) - .setShutdownTimeout(0) - .build() - - AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(asyncHttpClientConfig) - - wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) - } - - def cleanupSpec() { - wsClient?.close() - system?.terminate() - } - @Override int doRequest(String method, URI uri, Map headers, Closure callback) { StandaloneWSRequest wsRequest = wsClient.url(uri.toURL().toString()).setFollowRedirects(true) headers.entrySet().each { entry -> wsRequest.addHeader(entry.getKey(), entry.getValue()) } - StandaloneWSResponse wsResponse = wsRequest.execute(method) + StandaloneWSResponse wsResponse = wsRequest.setMethod(method).execute() .whenComplete({ response, throwable -> callback?.call() }).toCompletableFuture().get(5, TimeUnit.SECONDS) @@ -73,13 +43,104 @@ class PlayWSClientTest extends HttpClientTest { return wsResponse.getStatus() } - @Override - PlayWSClientDecorator decorator() { - return PlayWSClientDecorator.DECORATE + def setupSpec() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) } - @Override - boolean testCircularRedirects() { - return false + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayJavaStreamedWSClientTest extends PlayWSClientTestBase { + @Shared + StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + StandaloneWSRequest wsRequest = wsClient.url(uri.toURL().toString()).setFollowRedirects(true) + + headers.entrySet().each { entry -> wsRequest.addHeader(entry.getKey(), entry.getValue()) } + StandaloneWSResponse wsResponse = wsRequest.setMethod(method).stream() + .whenComplete({ response, throwable -> + callback?.call() + }).toCompletableFuture().get(5, TimeUnit.SECONDS) + + // The status can be ready before the body so explicity call wait for body to be ready + wsResponse.getBodyAsSource().runFold("", { acc, out -> "" }, materializer) + .toCompletableFuture().get(5, TimeUnit.SECONDS) + return wsResponse.getStatus() + } + + def setupSpec() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayScalaWSClientTest extends PlayWSClientTestBase { + @Shared + play.api.libs.ws.StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + Future futureResponse = wsClient.url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) + .execute() + .transform({ theTry -> + callback?.call() + theTry + }, ExecutionContext.global()) + + play.api.libs.ws.StandaloneWSResponse wsResponse = Await.result(futureResponse, Duration.apply(5, TimeUnit.SECONDS)) + + return wsResponse.status() + } + + def setupSpec() { + wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayScalaStreamedWSClientTest extends PlayWSClientTestBase { + @Shared + play.api.libs.ws.StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + Future futureResponse = wsClient.url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) + .stream() + .transform({ theTry -> + callback?.call() + theTry + }, ExecutionContext.global()) + + play.api.libs.ws.StandaloneWSResponse wsResponse = Await.result(futureResponse, Duration.apply(5, TimeUnit.SECONDS)) + + // The status can be ready before the body so explicity call wait for body to be ready + Await.result( + wsResponse.bodyAsSource().runFold("", { acc, out -> "" }, materializer), + Duration.apply(5, TimeUnit.SECONDS)) + return wsResponse.status() + } + + def setupSpec() { + wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() } } diff --git a/instrumentation/play-ws/play-ws-2.0/play-ws-2.0.gradle b/instrumentation/play-ws/play-ws-2.0/play-ws-2.0.gradle index f348627368..0a94760804 100644 --- a/instrumentation/play-ws/play-ws-2.0/play-ws-2.0.gradle +++ b/instrumentation/play-ws/play-ws-2.0/play-ws-2.0.gradle @@ -60,7 +60,8 @@ def scalaVersion = '2.12' dependencies { compileOnly group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '2.0.0' - testCompile project(':instrumentation:java-concurrent') + compile project(':instrumentation:play-ws:play-ws-common') + testCompile project(path: ':instrumentation:play-ws:play-ws-common', configuration: 'testArtifacts') // These are to ensure cross compatibility testCompile project(':instrumentation:netty:netty-4.0') diff --git a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/AsyncHandlerWrapper.java b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/AsyncHandlerWrapper.java index e4faff2156..5db8ebac03 100644 --- a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/AsyncHandlerWrapper.java +++ b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/AsyncHandlerWrapper.java @@ -15,8 +15,8 @@ */ package io.opentelemetry.auto.instrumentation.playws2; -import static io.opentelemetry.auto.instrumentation.playws2.PlayWSClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.playws2.PlayWSClientDecorator.TRACER; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.TRACER; import io.opentelemetry.context.Scope; import io.opentelemetry.trace.Span; diff --git a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientDecorator.java b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientDecorator.java deleted file mode 100644 index 5a03cf4291..0000000000 --- a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientDecorator.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2020, OpenTelemetry Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.opentelemetry.auto.instrumentation.playws2; - -import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; -import io.opentelemetry.trace.Tracer; -import java.net.URI; -import java.net.URISyntaxException; -import play.shaded.ahc.org.asynchttpclient.Request; -import play.shaded.ahc.org.asynchttpclient.Response; - -public class PlayWSClientDecorator extends HttpClientDecorator { - public static final PlayWSClientDecorator DECORATE = new PlayWSClientDecorator(); - - public static final Tracer TRACER = - OpenTelemetry.getTracerFactory().get("io.opentelemetry.auto.play-ws-2.0"); - - @Override - protected String method(final Request request) { - return request.getMethod(); - } - - @Override - protected URI url(final Request request) throws URISyntaxException { - return request.getUri().toJavaNetURI(); - } - - @Override - protected String hostname(final Request request) { - return request.getUri().getHost(); - } - - @Override - protected Integer port(final Request request) { - return request.getUri().getPort(); - } - - @Override - protected Integer status(final Response response) { - return response.getStatusCode(); - } - - @Override - protected String getComponentName() { - return "play-ws"; - } -} diff --git a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientInstrumentation.java index ae179ba92c..f2220351d7 100644 --- a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/PlayWSClientInstrumentation.java @@ -15,77 +15,22 @@ */ package io.opentelemetry.auto.instrumentation.playws2; -import static io.opentelemetry.auto.instrumentation.playws2.HeadersInjectAdapter.SETTER; -import static io.opentelemetry.auto.instrumentation.playws2.PlayWSClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.playws2.PlayWSClientDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; -import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.hasInterface; +import static io.opentelemetry.auto.instrumentation.playws.HeadersInjectAdapter.SETTER; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.TRACER; import static io.opentelemetry.trace.Span.Kind.CLIENT; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; +import io.opentelemetry.auto.instrumentation.playws.BasePlayWSClientInstrumentation; import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; -import java.util.Map; import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; import play.shaded.ahc.org.asynchttpclient.AsyncHandler; import play.shaded.ahc.org.asynchttpclient.Request; +import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; @AutoService(Instrumenter.class) -public class PlayWSClientInstrumentation extends Instrumenter.Default { - public PlayWSClientInstrumentation() { - super("play-ws"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return not( - classLoaderHasNoResources("play/shaded/ahc/org/asynchttpclient/AsyncHttpClient.class")); - } - - @Override - public ElementMatcher typeMatcher() { - // CachingAsyncHttpClient rejects overrides to AsyncHandler - // It also delegates to another AsyncHttpClient - return nameStartsWith("play.") - .and( - hasInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient")) - .and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient")))); - } - - @Override - public Map, String> transformers() { - return singletonMap( - isMethod() - .and(named("execute")) - .and(takesArguments(2)) - .and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request"))) - .and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))), - PlayWSClientInstrumentation.class.getName() + "$ClientAdvice"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - packageName + ".PlayWSClientDecorator", - packageName + ".HeadersInjectAdapter", - packageName + ".AsyncHandlerWrapper" - }; - } - +public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation { public static class ClientAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Span methodEnter( @@ -99,7 +44,11 @@ public class PlayWSClientInstrumentation extends Instrumenter.Default { DECORATE.onRequest(span, request); TRACER.getHttpTextFormat().inject(span.getContext(), request, SETTER); - asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); + if (asyncHandler instanceof StreamedAsyncHandler) { + asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); + } else { + asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); + } return span; } diff --git a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/StreamedAsyncHandlerWrapper.java b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/StreamedAsyncHandlerWrapper.java new file mode 100644 index 0000000000..7348737280 --- /dev/null +++ b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/StreamedAsyncHandlerWrapper.java @@ -0,0 +1,35 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.opentelemetry.auto.instrumentation.playws2; + +import io.opentelemetry.trace.Span; +import org.reactivestreams.Publisher; +import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; + +public class StreamedAsyncHandlerWrapper extends AsyncHandlerWrapper + implements StreamedAsyncHandler { + private final StreamedAsyncHandler streamedDelegate; + + public StreamedAsyncHandlerWrapper(final StreamedAsyncHandler delegate, final Span span) { + super(delegate, span); + streamedDelegate = delegate; + } + + @Override + public State onStream(final Publisher publisher) { + return streamedDelegate.onStream(publisher); + } +} diff --git a/instrumentation/play-ws/play-ws-2.0/src/test/groovy/PlayWSClientTest.groovy b/instrumentation/play-ws/play-ws-2.0/src/test/groovy/PlayWSClientTest.groovy index 865031836f..1f3466656e 100644 --- a/instrumentation/play-ws/play-ws-2.0/src/test/groovy/PlayWSClientTest.groovy +++ b/instrumentation/play-ws/play-ws-2.0/src/test/groovy/PlayWSClientTest.groovy @@ -13,59 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import akka.actor.ActorSystem -import akka.stream.ActorMaterializer -import akka.stream.ActorMaterializerSettings -import io.opentelemetry.auto.instrumentation.playws2.PlayWSClientDecorator -import io.opentelemetry.auto.test.base.HttpClientTest import play.libs.ws.StandaloneWSClient import play.libs.ws.StandaloneWSRequest import play.libs.ws.StandaloneWSResponse import play.libs.ws.ahc.StandaloneAhcWSClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig +import scala.collection.JavaConverters +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.concurrent.duration.Duration import spock.lang.Shared import java.util.concurrent.TimeUnit -class PlayWSClientTest extends HttpClientTest { - @Shared - ActorSystem system - +class PlayJavaWSClientTest extends PlayWSClientTestBase { @Shared StandaloneWSClient wsClient - def setupSpec() { - String name = "play-ws" - system = ActorSystem.create(name) - ActorMaterializerSettings settings = ActorMaterializerSettings.create(system) - ActorMaterializer materializer = ActorMaterializer.create(settings, system, name) - - AsyncHttpClientConfig asyncHttpClientConfig = - new DefaultAsyncHttpClientConfig.Builder() - .setMaxRequestRetry(0) - .setShutdownQuietPeriod(0) - .setShutdownTimeout(0) - .build() - - AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(asyncHttpClientConfig) - - wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) - } - - def cleanupSpec() { - wsClient?.close() - system?.terminate() - } - @Override int doRequest(String method, URI uri, Map headers, Closure callback) { StandaloneWSRequest wsRequest = wsClient.url(uri.toURL().toString()).setFollowRedirects(true) headers.entrySet().each { entry -> wsRequest.addHeader(entry.getKey(), entry.getValue()) } - StandaloneWSResponse wsResponse = wsRequest.execute(method) + StandaloneWSResponse wsResponse = wsRequest.setMethod(method).execute() .whenComplete({ response, throwable -> callback?.call() }).toCompletableFuture().get(5, TimeUnit.SECONDS) @@ -73,13 +43,104 @@ class PlayWSClientTest extends HttpClientTest { return wsResponse.getStatus() } - @Override - PlayWSClientDecorator decorator() { - return PlayWSClientDecorator.DECORATE + def setupSpec() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) } - @Override - boolean testCircularRedirects() { - return false + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayJavaStreamedWSClientTest extends PlayWSClientTestBase { + @Shared + StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + StandaloneWSRequest wsRequest = wsClient.url(uri.toURL().toString()).setFollowRedirects(true) + + headers.entrySet().each { entry -> wsRequest.addHeader(entry.getKey(), entry.getValue()) } + StandaloneWSResponse wsResponse = wsRequest.setMethod(method).stream() + .whenComplete({ response, throwable -> + callback?.call() + }).toCompletableFuture().get(5, TimeUnit.SECONDS) + + // The status can be ready before the body so explicity call wait for body to be ready + wsResponse.getBodyAsSource().runFold("", { acc, out -> "" }, materializer) + .toCompletableFuture().get(5, TimeUnit.SECONDS) + return wsResponse.getStatus() + } + + def setupSpec() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayScalaWSClientTest extends PlayWSClientTestBase { + @Shared + play.api.libs.ws.StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + Future futureResponse = wsClient.url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) + .execute() + .transform({ theTry -> + callback?.call() + theTry + }, ExecutionContext.global()) + + play.api.libs.ws.StandaloneWSResponse wsResponse = Await.result(futureResponse, Duration.apply(5, TimeUnit.SECONDS)) + + return wsResponse.status() + } + + def setupSpec() { + wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayScalaStreamedWSClientTest extends PlayWSClientTestBase { + @Shared + play.api.libs.ws.StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + Future futureResponse = wsClient.url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) + .stream() + .transform({ theTry -> + callback?.call() + theTry + }, ExecutionContext.global()) + + play.api.libs.ws.StandaloneWSResponse wsResponse = Await.result(futureResponse, Duration.apply(5, TimeUnit.SECONDS)) + + // The status can be ready before the body so explicity call wait for body to be ready + Await.result( + wsResponse.bodyAsSource().runFold("", { acc, out -> "" }, materializer), + Duration.apply(5, TimeUnit.SECONDS)) + return wsResponse.status() + } + + def setupSpec() { + wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() } } diff --git a/instrumentation/play-ws/play-ws-2.1/play-ws-2.1.gradle b/instrumentation/play-ws/play-ws-2.1/play-ws-2.1.gradle index f4b14aab08..ff53f37b11 100644 --- a/instrumentation/play-ws/play-ws-2.1/play-ws-2.1.gradle +++ b/instrumentation/play-ws/play-ws-2.1/play-ws-2.1.gradle @@ -6,12 +6,11 @@ ext { apply from: "${rootDir}/gradle/instrumentation.gradle" apply plugin: 'org.unbroken-dome.test-sets' -// TODO: Uncomment when there are more releases, right now 2.1.0 is the latest release -//testSets { -// latestDepTest { -// dirName = 'test' -// } -//} +testSets { + latestDepTest { + dirName = 'test' + } +} muzzle { // 2.0.5 was a bad release @@ -61,7 +60,8 @@ def scalaVersion = '2.12' dependencies { compileOnly group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '2.1.0' - testCompile project(':instrumentation:java-concurrent') + compile project(':instrumentation:play-ws:play-ws-common') + testCompile project(path: ':instrumentation:play-ws:play-ws-common', configuration: 'testArtifacts') // These are to ensure cross compatibility testCompile project(':instrumentation:netty:netty-4.0') @@ -70,7 +70,5 @@ dependencies { testCompile group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '2.1.0' - // TODO: Uncomment when there are more releases, right now 2.1.0 is the latest release - - // latestDepTestCompile group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '+' + latestDepTestCompile group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '+' } diff --git a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/AsyncHandlerWrapper.java b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/AsyncHandlerWrapper.java index 65904a6665..bd06a78864 100644 --- a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/AsyncHandlerWrapper.java +++ b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/AsyncHandlerWrapper.java @@ -15,8 +15,8 @@ */ package io.opentelemetry.auto.instrumentation.playws21; -import static io.opentelemetry.auto.instrumentation.playws21.PlayWSClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.playws21.PlayWSClientDecorator.TRACER; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.TRACER; import io.opentelemetry.context.Scope; import io.opentelemetry.trace.Span; diff --git a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientInstrumentation.java index fa184ba98a..41f3242e2a 100644 --- a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientInstrumentation.java @@ -15,74 +15,22 @@ */ package io.opentelemetry.auto.instrumentation.playws21; -import static io.opentelemetry.auto.instrumentation.playws21.HeadersInjectAdapter.SETTER; -import static io.opentelemetry.auto.instrumentation.playws21.PlayWSClientDecorator.DECORATE; -import static io.opentelemetry.auto.instrumentation.playws21.PlayWSClientDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; -import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.auto.instrumentation.playws.HeadersInjectAdapter.SETTER; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.DECORATE; +import static io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator.TRACER; import static io.opentelemetry.trace.Span.Kind.CLIENT; -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.not; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; +import io.opentelemetry.auto.instrumentation.playws.BasePlayWSClientInstrumentation; import io.opentelemetry.auto.tooling.Instrumenter; import io.opentelemetry.trace.Span; -import java.util.Map; import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; import play.shaded.ahc.org.asynchttpclient.AsyncHandler; import play.shaded.ahc.org.asynchttpclient.Request; +import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; @AutoService(Instrumenter.class) -public class PlayWSClientInstrumentation extends Instrumenter.Default { - public PlayWSClientInstrumentation() { - super("play-ws"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return not( - classLoaderHasNoResources("play/shaded/ahc/org/asynchttpclient/AsyncHttpClient.class")); - } - - @Override - public ElementMatcher typeMatcher() { - // CachingAsyncHttpClient rejects overrides to AsyncHandler - // It also delegates to another AsyncHttpClient - return implementsInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient")) - .and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient"))); - } - - @Override - public Map, String> transformers() { - return singletonMap( - isMethod() - .and(named("execute")) - .and(takesArguments(2)) - .and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request"))) - .and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))), - PlayWSClientInstrumentation.class.getName() + "$ClientAdvice"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", - packageName + ".PlayWSClientDecorator", - packageName + ".HeadersInjectAdapter", - packageName + ".AsyncHandlerWrapper" - }; - } - +public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation { public static class ClientAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Span methodEnter( @@ -96,7 +44,11 @@ public class PlayWSClientInstrumentation extends Instrumenter.Default { DECORATE.onRequest(span, request); TRACER.getHttpTextFormat().inject(span.getContext(), request, SETTER); - asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); + if (asyncHandler instanceof StreamedAsyncHandler) { + asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); + } else { + asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); + } return span; } diff --git a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/StreamedAsyncHandlerWrapper.java b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/StreamedAsyncHandlerWrapper.java new file mode 100644 index 0000000000..edee09ec5c --- /dev/null +++ b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/StreamedAsyncHandlerWrapper.java @@ -0,0 +1,35 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.opentelemetry.auto.instrumentation.playws21; + +import io.opentelemetry.trace.Span; +import org.reactivestreams.Publisher; +import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; + +public class StreamedAsyncHandlerWrapper extends AsyncHandlerWrapper + implements StreamedAsyncHandler { + private final StreamedAsyncHandler streamedDelegate; + + public StreamedAsyncHandlerWrapper(final StreamedAsyncHandler delegate, final Span span) { + super(delegate, span); + streamedDelegate = delegate; + } + + @Override + public State onStream(final Publisher publisher) { + return streamedDelegate.onStream(publisher); + } +} diff --git a/instrumentation/play-ws/play-ws-2.1/src/test/groovy/PlayWSClientTest.groovy b/instrumentation/play-ws/play-ws-2.1/src/test/groovy/PlayWSClientTest.groovy index c41d84c802..1f3466656e 100644 --- a/instrumentation/play-ws/play-ws-2.1/src/test/groovy/PlayWSClientTest.groovy +++ b/instrumentation/play-ws/play-ws-2.1/src/test/groovy/PlayWSClientTest.groovy @@ -13,59 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import akka.actor.ActorSystem -import akka.stream.ActorMaterializer -import akka.stream.ActorMaterializerSettings -import io.opentelemetry.auto.instrumentation.playws21.PlayWSClientDecorator -import io.opentelemetry.auto.test.base.HttpClientTest import play.libs.ws.StandaloneWSClient import play.libs.ws.StandaloneWSRequest import play.libs.ws.StandaloneWSResponse import play.libs.ws.ahc.StandaloneAhcWSClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient -import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig +import scala.collection.JavaConverters +import scala.concurrent.Await +import scala.concurrent.ExecutionContext +import scala.concurrent.Future +import scala.concurrent.duration.Duration import spock.lang.Shared import java.util.concurrent.TimeUnit -class PlayWSClientTest extends HttpClientTest { - @Shared - ActorSystem system - +class PlayJavaWSClientTest extends PlayWSClientTestBase { @Shared StandaloneWSClient wsClient - def setupSpec() { - String name = "play-ws" - system = ActorSystem.create(name) - ActorMaterializerSettings settings = ActorMaterializerSettings.create(system) - ActorMaterializer materializer = ActorMaterializer.create(settings, system, name) - - AsyncHttpClientConfig asyncHttpClientConfig = - new DefaultAsyncHttpClientConfig.Builder() - .setMaxRequestRetry(0) - .setShutdownQuietPeriod(0) - .setShutdownTimeout(0) - .build() - - AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(asyncHttpClientConfig) - - wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) - } - - def cleanupSpec() { - wsClient?.close() - system?.terminate() - } - @Override int doRequest(String method, URI uri, Map headers, Closure callback) { StandaloneWSRequest wsRequest = wsClient.url(uri.toURL().toString()).setFollowRedirects(true) headers.entrySet().each { entry -> wsRequest.addHeader(entry.getKey(), entry.getValue()) } - StandaloneWSResponse wsResponse = wsRequest.execute(method) + StandaloneWSResponse wsResponse = wsRequest.setMethod(method).execute() .whenComplete({ response, throwable -> callback?.call() }).toCompletableFuture().get(5, TimeUnit.SECONDS) @@ -73,13 +43,104 @@ class PlayWSClientTest extends HttpClientTest { return wsResponse.getStatus() } - @Override - PlayWSClientDecorator decorator() { - return PlayWSClientDecorator.DECORATE + def setupSpec() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) } - @Override - boolean testCircularRedirects() { - return false + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayJavaStreamedWSClientTest extends PlayWSClientTestBase { + @Shared + StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + StandaloneWSRequest wsRequest = wsClient.url(uri.toURL().toString()).setFollowRedirects(true) + + headers.entrySet().each { entry -> wsRequest.addHeader(entry.getKey(), entry.getValue()) } + StandaloneWSResponse wsResponse = wsRequest.setMethod(method).stream() + .whenComplete({ response, throwable -> + callback?.call() + }).toCompletableFuture().get(5, TimeUnit.SECONDS) + + // The status can be ready before the body so explicity call wait for body to be ready + wsResponse.getBodyAsSource().runFold("", { acc, out -> "" }, materializer) + .toCompletableFuture().get(5, TimeUnit.SECONDS) + return wsResponse.getStatus() + } + + def setupSpec() { + wsClient = new StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayScalaWSClientTest extends PlayWSClientTestBase { + @Shared + play.api.libs.ws.StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + Future futureResponse = wsClient.url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) + .execute() + .transform({ theTry -> + callback?.call() + theTry + }, ExecutionContext.global()) + + play.api.libs.ws.StandaloneWSResponse wsResponse = Await.result(futureResponse, Duration.apply(5, TimeUnit.SECONDS)) + + return wsResponse.status() + } + + def setupSpec() { + wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() + } +} + +class PlayScalaStreamedWSClientTest extends PlayWSClientTestBase { + @Shared + play.api.libs.ws.StandaloneWSClient wsClient + + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + Future futureResponse = wsClient.url(uri.toURL().toString()) + .withMethod(method) + .withFollowRedirects(true) + .withHttpHeaders(JavaConverters.mapAsScalaMap(headers).toSeq()) + .stream() + .transform({ theTry -> + callback?.call() + theTry + }, ExecutionContext.global()) + + play.api.libs.ws.StandaloneWSResponse wsResponse = Await.result(futureResponse, Duration.apply(5, TimeUnit.SECONDS)) + + // The status can be ready before the body so explicity call wait for body to be ready + Await.result( + wsResponse.bodyAsSource().runFold("", { acc, out -> "" }, materializer), + Duration.apply(5, TimeUnit.SECONDS)) + return wsResponse.status() + } + + def setupSpec() { + wsClient = new play.api.libs.ws.ahc.StandaloneAhcWSClient(asyncHttpClient, materializer) + } + + def cleanupSpec() { + wsClient?.close() } } diff --git a/instrumentation/play-ws/play-ws-common/play-ws-common.gradle b/instrumentation/play-ws/play-ws-common/play-ws-common.gradle new file mode 100644 index 0000000000..2fca54fb3a --- /dev/null +++ b/instrumentation/play-ws/play-ws-common/play-ws-common.gradle @@ -0,0 +1,25 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + +apply from: "${rootDir}/gradle/instrumentation.gradle" +apply plugin: 'org.unbroken-dome.test-sets' + +def scalaVersion = '2.12' + +configurations { + testArtifacts +} + +// Create test artifact so that test base class can be reused +artifacts { + testArtifacts testJar +} + + +dependencies { + compileOnly group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '1.0.2' + + testCompile group: 'com.typesafe.play', name: "play-ahc-ws-standalone_$scalaVersion", version: '1.0.2' +} diff --git a/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/BasePlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/BasePlayWSClientInstrumentation.java new file mode 100644 index 0000000000..d945368a9e --- /dev/null +++ b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/BasePlayWSClientInstrumentation.java @@ -0,0 +1,75 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.opentelemetry.auto.instrumentation.playws; + +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; +import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import io.opentelemetry.auto.tooling.Instrumenter; +import java.util.Map; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +public abstract class BasePlayWSClientInstrumentation extends Instrumenter.Default { + public BasePlayWSClientInstrumentation() { + super("play-ws"); + } + + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient"); + } + + @Override + public ElementMatcher typeMatcher() { + // CachingAsyncHttpClient rejects overrides to AsyncHandler + // It also delegates to another AsyncHttpClient + return nameStartsWith("play.") + .and( + implementsInterface(named("play.shaded.ahc.org.asynchttpclient.AsyncHttpClient")) + .and(not(named("play.api.libs.ws.ahc.cache.CachingAsyncHttpClient")))); + } + + @Override + public Map, String> transformers() { + return singletonMap( + isMethod() + .and(named("execute")) + .and(takesArguments(2)) + .and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request"))) + .and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))), + getClass().getName() + "$ClientAdvice"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.auto.instrumentation.playws.PlayWSClientDecorator", + "io.opentelemetry.auto.instrumentation.playws.HeadersInjectAdapter", + packageName + ".AsyncHandlerWrapper", + packageName + ".StreamedAsyncHandlerWrapper" + }; + } +} diff --git a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/HeadersInjectAdapter.java b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/HeadersInjectAdapter.java similarity index 94% rename from instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/HeadersInjectAdapter.java rename to instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/HeadersInjectAdapter.java index 928ea4d8f0..08aed7eea0 100644 --- a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/auto/instrumentation/playws2/HeadersInjectAdapter.java +++ b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/HeadersInjectAdapter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.playws2; +package io.opentelemetry.auto.instrumentation.playws; import io.opentelemetry.context.propagation.HttpTextFormat; import play.shaded.ahc.org.asynchttpclient.Request; diff --git a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientDecorator.java b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/PlayWSClientDecorator.java similarity index 92% rename from instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientDecorator.java rename to instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/PlayWSClientDecorator.java index 281f39d78d..ac6d49bb4c 100644 --- a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/auto/instrumentation/playws21/PlayWSClientDecorator.java +++ b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/auto/instrumentation/playws/PlayWSClientDecorator.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.opentelemetry.auto.instrumentation.playws21; +package io.opentelemetry.auto.instrumentation.playws; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.net.URISyntaxException; diff --git a/instrumentation/play-ws/play-ws-common/src/test/groovy/PlayWSClientTestBase.groovy b/instrumentation/play-ws/play-ws-common/src/test/groovy/PlayWSClientTestBase.groovy new file mode 100644 index 0000000000..c735a9c445 --- /dev/null +++ b/instrumentation/play-ws/play-ws-common/src/test/groovy/PlayWSClientTestBase.groovy @@ -0,0 +1,74 @@ +/* + * Copyright 2020, OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import akka.actor.ActorSystem +import akka.stream.ActorMaterializer +import akka.stream.ActorMaterializerSettings +import io.opentelemetry.auto.test.base.HttpClientTest +import play.shaded.ahc.org.asynchttpclient.AsyncHttpClient +import play.shaded.ahc.org.asynchttpclient.AsyncHttpClientConfig +import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClient +import play.shaded.ahc.org.asynchttpclient.DefaultAsyncHttpClientConfig +import spock.lang.Shared + +abstract class PlayWSClientTestBase extends HttpClientTest { + @Shared + ActorSystem system + + @Shared + AsyncHttpClient asyncHttpClient + + @Shared + ActorMaterializer materializer + + def setupSpec() { + String name = "play-ws" + system = ActorSystem.create(name) + ActorMaterializerSettings settings = ActorMaterializerSettings.create(system) + materializer = ActorMaterializer.create(settings, system, name) + + AsyncHttpClientConfig asyncHttpClientConfig = + new DefaultAsyncHttpClientConfig.Builder() + .setMaxRequestRetry(0) + .setShutdownQuietPeriod(0) + .setShutdownTimeout(0) + .build() + + asyncHttpClient = new DefaultAsyncHttpClient(asyncHttpClientConfig) + } + + def cleanupSpec() { + system?.terminate() + } + + @Override + String component() { + return PlayWSClientDecorator.DECORATE.getComponentName() + } + + String expectedOperationName() { + return "play-ws.request" + } + + @Override + boolean testCircularRedirects() { + return false + } + + @Override + boolean testCallbackWithParent() { + return false + } +} diff --git a/instrumentation/play/play-2.4/play-2.4.gradle b/instrumentation/play/play-2.4/play-2.4.gradle index 5dfd488835..9cce7ab065 100644 --- a/instrumentation/play/play-2.4/play-2.4.gradle +++ b/instrumentation/play/play-2.4/play-2.4.gradle @@ -35,7 +35,6 @@ testSets { dependencies { main_java8Compile group: 'com.typesafe.play', name: 'play_2.11', version: '2.4.0' - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:netty:netty-4.0') testCompile project(':instrumentation:netty:netty-4.1') testCompile project(':instrumentation:akka-http-10.0') diff --git a/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/auto/instrumentation/play24/PlayInstrumentation.java b/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/auto/instrumentation/play24/PlayInstrumentation.java index cffe863dab..71161aa8c7 100644 --- a/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/auto/instrumentation/play24/PlayInstrumentation.java +++ b/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/auto/instrumentation/play24/PlayInstrumentation.java @@ -15,11 +15,10 @@ */ package io.opentelemetry.auto.instrumentation.play24; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -40,7 +39,7 @@ public final class PlayInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("play/api/mvc/Action.class")); + return hasClassesNamed("play.api.mvc.Action"); } @Override @@ -51,9 +50,6 @@ public final class PlayInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".PlayHttpServerDecorator", packageName + ".RequestCompleteCallback", packageName + ".PlayHeaders", diff --git a/instrumentation/play/play-2.4/src/main/java8/io/opentelemetry/auto/instrumentation/play24/PlayHttpServerDecorator.java b/instrumentation/play/play-2.4/src/main/java8/io/opentelemetry/auto/instrumentation/play24/PlayHttpServerDecorator.java index f9fac74881..af34a91b0a 100644 --- a/instrumentation/play/play-2.4/src/main/java8/io/opentelemetry/auto/instrumentation/play24/PlayHttpServerDecorator.java +++ b/instrumentation/play/play-2.4/src/main/java8/io/opentelemetry/auto/instrumentation/play24/PlayHttpServerDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.play24; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.Tags; import io.opentelemetry.trace.Span; diff --git a/instrumentation/play/play-2.4/src/test/groovy/client/PlayWSClientTest.groovy b/instrumentation/play/play-2.4/src/test/groovy/client/PlayWSClientTest.groovy index e7b38ca4e3..c57f256064 100644 --- a/instrumentation/play/play-2.4/src/test/groovy/client/PlayWSClientTest.groovy +++ b/instrumentation/play/play-2.4/src/test/groovy/client/PlayWSClientTest.groovy @@ -24,7 +24,7 @@ import spock.lang.Subject // Play 2.6+ uses a separately versioned client that shades the underlying dependency // This means our built in instrumentation won't work. -class PlayWSClientTest extends HttpClientTest { +class PlayWSClientTest extends HttpClientTest { @Subject @Shared @AutoCleanup @@ -47,8 +47,8 @@ class PlayWSClientTest extends HttpClientTest { } @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/play/play-2.4/src/test/groovy/server/PlayServerTest.groovy b/instrumentation/play/play-2.4/src/test/groovy/server/PlayServerTest.groovy index 4ddb43d2e4..4a1b56812b 100644 --- a/instrumentation/play/play-2.4/src/test/groovy/server/PlayServerTest.groovy +++ b/instrumentation/play/play-2.4/src/test/groovy/server/PlayServerTest.groovy @@ -36,81 +36,81 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDI import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS import static io.opentelemetry.trace.Span.Kind.INTERNAL -class PlayServerTest extends HttpServerTest { - @Override - Server startServer(int port) { - def router = - new RoutingDsl() - .GET(SUCCESS.getPath()).routeTo({ - controller(SUCCESS) { - Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) - } - } as Supplier) - .GET(QUERY_PARAM.getPath()).routeTo({ - controller(QUERY_PARAM) { - Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) - } - } as Supplier) - .GET(REDIRECT.getPath()).routeTo({ - controller(REDIRECT) { - Results.found(REDIRECT.getBody()) - } - } as Supplier) - .GET(ERROR.getPath()).routeTo({ - controller(ERROR) { - Results.status(ERROR.getStatus(), ERROR.getBody()) - } - } as Supplier) - .GET(EXCEPTION.getPath()).routeTo({ - controller(EXCEPTION) { - throw new Exception(EXCEPTION.getBody()) - } - } as Supplier) +class PlayServerTest extends HttpServerTest { + @Override + Server startServer(int port) { + def router = + new RoutingDsl() + .GET(SUCCESS.getPath()).routeTo({ + controller(SUCCESS) { + Results.status(SUCCESS.getStatus(), SUCCESS.getBody()) + } + } as Supplier) + .GET(QUERY_PARAM.getPath()).routeTo({ + controller(QUERY_PARAM) { + Results.status(QUERY_PARAM.getStatus(), QUERY_PARAM.getBody()) + } + } as Supplier) + .GET(REDIRECT.getPath()).routeTo({ + controller(REDIRECT) { + Results.found(REDIRECT.getBody()) + } + } as Supplier) + .GET(ERROR.getPath()).routeTo({ + controller(ERROR) { + Results.status(ERROR.getStatus(), ERROR.getBody()) + } + } as Supplier) + .GET(EXCEPTION.getPath()).routeTo({ + controller(EXCEPTION) { + throw new Exception(EXCEPTION.getBody()) + } + } as Supplier) - return Server.forRouter(router.build(), port) - } - - @Override - void stopServer(Server server) { - server.stop() - } - - @Override - NettyHttpServerDecorator decorator() { - return NettyHttpServerDecorator.DECORATE - } - - @Override - boolean hasHandlerSpan() { - true - } - - boolean testExceptionBody() { - // I can't figure out how to set a proper exception handler to customize the response body. - false - } - - @Override - void handlerSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { - trace.span(index) { - operationName "play.request" - spanKind INTERNAL - errored endpoint == ERROR || endpoint == EXCEPTION - childOf((SpanData) parent) - tags { - "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" PlayHttpServerDecorator.DECORATE.getComponentName() - "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional - "$Tags.HTTP_URL" String - "$Tags.HTTP_METHOD" String - "$Tags.HTTP_STATUS" Long - if (endpoint == EXCEPTION) { - errorTags(Exception, EXCEPTION.body) - } - if (endpoint.query) { - "$MoreTags.HTTP_QUERY" endpoint.query - } - } + return Server.forRouter(router.build(), port) + } + + @Override + void stopServer(Server server) { + server.stop() + } + + @Override + String component() { + return NettyHttpServerDecorator.DECORATE.getComponentName() + } + + @Override + boolean hasHandlerSpan() { + true + } + + boolean testExceptionBody() { + // I can't figure out how to set a proper exception handler to customize the response body. + false + } + + @Override + void handlerSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { + trace.span(index) { + operationName "play.request" + spanKind INTERNAL + errored endpoint == ERROR || endpoint == EXCEPTION + childOf((SpanData) parent) + tags { + "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER + "$Tags.COMPONENT" PlayHttpServerDecorator.DECORATE.getComponentName() + "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional + "$Tags.HTTP_URL" String + "$Tags.HTTP_METHOD" String + "$Tags.HTTP_STATUS" Long + if (endpoint == EXCEPTION) { + errorTags(Exception, EXCEPTION.body) + } + if (endpoint.query) { + "$MoreTags.HTTP_QUERY" endpoint.query + } + } + } } - } } diff --git a/instrumentation/play/play-2.6/play-2.6.gradle b/instrumentation/play/play-2.6/play-2.6.gradle index 98b7134e77..ac2c5bb1b9 100644 --- a/instrumentation/play/play-2.6/play-2.6.gradle +++ b/instrumentation/play/play-2.6/play-2.6.gradle @@ -40,7 +40,6 @@ testSets { dependencies { main_java8Compile group: 'com.typesafe.play', name: "play_$scalaVersion", version: playVersion - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:netty:netty-4.0') testCompile project(':instrumentation:netty:netty-4.1') testCompile project(':instrumentation:akka-http-10.0') diff --git a/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/auto/instrumentation/play26/PlayInstrumentation.java b/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/auto/instrumentation/play26/PlayInstrumentation.java index 31ca56b14d..260e9463f6 100644 --- a/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/auto/instrumentation/play26/PlayInstrumentation.java +++ b/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/auto/instrumentation/play26/PlayInstrumentation.java @@ -15,11 +15,10 @@ */ package io.opentelemetry.auto.instrumentation.play26; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -40,7 +39,7 @@ public final class PlayInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("play/api/mvc/Action.class")); + return hasClassesNamed("play.api.mvc.Action"); } @Override @@ -51,9 +50,6 @@ public final class PlayInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".PlayHttpServerDecorator", packageName + ".RequestCompleteCallback", packageName + ".PlayHeaders", diff --git a/instrumentation/play/play-2.6/src/main/java8/io/opentelemetry/auto/instrumentation/play26/PlayHttpServerDecorator.java b/instrumentation/play/play-2.6/src/main/java8/io/opentelemetry/auto/instrumentation/play26/PlayHttpServerDecorator.java index 1ecd9c4006..8b2d305f59 100644 --- a/instrumentation/play/play-2.6/src/main/java8/io/opentelemetry/auto/instrumentation/play26/PlayHttpServerDecorator.java +++ b/instrumentation/play/play-2.6/src/main/java8/io/opentelemetry/auto/instrumentation/play26/PlayHttpServerDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.play26; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.Tags; import io.opentelemetry.trace.Span; diff --git a/instrumentation/play/play-2.6/src/test/groovy/server/PlayServerTest.groovy b/instrumentation/play/play-2.6/src/test/groovy/server/PlayServerTest.groovy index 5dded54884..339e482963 100644 --- a/instrumentation/play/play-2.6/src/test/groovy/server/PlayServerTest.groovy +++ b/instrumentation/play/play-2.6/src/test/groovy/server/PlayServerTest.groovy @@ -41,7 +41,7 @@ import static io.opentelemetry.trace.Span.Kind.INTERNAL import static io.opentelemetry.trace.Span.Kind.SERVER @Retry(mode = Retry.Mode.SETUP_FEATURE_CLEANUP) -class PlayServerTest extends HttpServerTest { +class PlayServerTest extends HttpServerTest { @Override Server startServer(int port) { return Server.forRouter(Mode.TEST, port) { BuiltInComponents components -> @@ -81,8 +81,8 @@ class PlayServerTest extends HttpServerTest { } @Override - AkkaHttpServerDecorator decorator() { - return AkkaHttpServerDecorator.DECORATE + String component() { + return AkkaHttpServerDecorator.DECORATE.getComponentName() } @Override @@ -132,7 +132,7 @@ class PlayServerTest extends HttpServerTest { } tags { "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" serverDecorator.getComponentName() + "$Tags.COMPONENT" component "$Tags.HTTP_STATUS" endpoint.status "$Tags.HTTP_URL" { it == "${endpoint.resolve(address)}" || it == "${endpoint.resolveWithoutFragment(address)}" } "$Tags.HTTP_METHOD" method diff --git a/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java b/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java index b0c2a47956..cff517d1e3 100644 --- a/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java +++ b/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitChannelInstrumentation.java @@ -22,7 +22,7 @@ import static io.opentelemetry.auto.instrumentation.rabbitmq.amqp.RabbitDecorato import static io.opentelemetry.auto.instrumentation.rabbitmq.amqp.RabbitDecorator.TRACER; import static io.opentelemetry.auto.instrumentation.rabbitmq.amqp.TextMapExtractAdapter.GETTER; import static io.opentelemetry.auto.instrumentation.rabbitmq.amqp.TextMapInjectAdapter.SETTER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static io.opentelemetry.trace.Span.Kind.PRODUCER; @@ -70,7 +70,7 @@ public class RabbitChannelInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/rabbitmq/client/Channel.class")); + return hasClassesNamed("com.rabbitmq.client.Channel"); } @Override @@ -81,8 +81,6 @@ public class RabbitChannelInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".RabbitDecorator", packageName + ".RabbitDecorator$1", packageName + ".RabbitDecorator$2", diff --git a/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java b/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java index 0642d11ce6..0c9e4dfd80 100644 --- a/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java +++ b/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitCommandInstrumentation.java @@ -17,12 +17,11 @@ package io.opentelemetry.auto.instrumentation.rabbitmq.amqp; import static io.opentelemetry.auto.instrumentation.rabbitmq.amqp.RabbitCommandInstrumentation.SpanHolder.CURRENT_RABBIT_SPAN; import static io.opentelemetry.auto.instrumentation.rabbitmq.amqp.RabbitDecorator.DECORATE; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import com.rabbitmq.client.Command; @@ -44,7 +43,7 @@ public class RabbitCommandInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/rabbitmq/client/Command.class")); + return hasClassesNamed("com.rabbitmq.client.Command"); } @Override @@ -55,8 +54,6 @@ public class RabbitCommandInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".RabbitDecorator", packageName + ".RabbitDecorator$1", packageName + ".RabbitDecorator$2", diff --git a/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitDecorator.java b/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitDecorator.java index 4818f04aa8..7370c3799a 100644 --- a/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitDecorator.java +++ b/instrumentation/rabbitmq-amqp-2.7/src/main/java/io/opentelemetry/auto/instrumentation/rabbitmq/amqp/RabbitDecorator.java @@ -18,7 +18,7 @@ package io.opentelemetry.auto.instrumentation.rabbitmq.amqp; import com.rabbitmq.client.Command; import com.rabbitmq.client.Envelope; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/ratpack-1.4/ratpack-1.4.gradle b/instrumentation/ratpack-1.4/ratpack-1.4.gradle index 9930b114b5..c669a26494 100644 --- a/instrumentation/ratpack-1.4/ratpack-1.4.gradle +++ b/instrumentation/ratpack-1.4/ratpack-1.4.gradle @@ -30,7 +30,6 @@ testSets { dependencies { main_java8CompileOnly group: 'io.ratpack', name: 'ratpack-core', version: '1.4.0' - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:netty:netty-4.1') testCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.4.0' latestDepTestCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '+' diff --git a/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ContinuationInstrumentation.java b/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ContinuationInstrumentation.java index 987ea36a66..e1a7d32e22 100644 --- a/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ContinuationInstrumentation.java +++ b/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ContinuationInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.ratpack; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -43,7 +42,7 @@ public final class ContinuationInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("ratpack/exec/internal/Continuation.class")); + return hasClassesNamed("ratpack.exec.internal.Continuation"); } @Override diff --git a/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java b/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java index f190ed695b..5c61c5549d 100644 --- a/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java +++ b/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerErrorHandlerInstrumentation.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.ratpack; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -40,7 +40,7 @@ public class ServerErrorHandlerInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("ratpack/error/ServerErrorHandler.class")); + return hasClassesNamed("ratpack.error.ServerErrorHandler"); } @Override @@ -51,9 +51,6 @@ public class ServerErrorHandlerInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".RatpackServerDecorator", }; } diff --git a/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerRegistryInstrumentation.java b/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerRegistryInstrumentation.java index 89cfdaca7e..bfc7e75beb 100644 --- a/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerRegistryInstrumentation.java +++ b/instrumentation/ratpack-1.4/src/main/java/io/opentelemetry/auto/instrumentation/ratpack/ServerRegistryInstrumentation.java @@ -42,11 +42,7 @@ public class ServerRegistryInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", - packageName + ".RatpackServerDecorator", - packageName + ".TracingHandler", + packageName + ".RatpackServerDecorator", packageName + ".TracingHandler", }; } diff --git a/instrumentation/ratpack-1.4/src/main/java8/io/opentelemetry/auto/instrumentation/ratpack/RatpackServerDecorator.java b/instrumentation/ratpack-1.4/src/main/java8/io/opentelemetry/auto/instrumentation/ratpack/RatpackServerDecorator.java index f24f066af2..71e1800cad 100644 --- a/instrumentation/ratpack-1.4/src/main/java8/io/opentelemetry/auto/instrumentation/ratpack/RatpackServerDecorator.java +++ b/instrumentation/ratpack-1.4/src/main/java8/io/opentelemetry/auto/instrumentation/ratpack/RatpackServerDecorator.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.ratpack; import com.google.common.net.HostAndPort; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/ratpack-1.4/src/test/groovy/client/RatpackHttpClientTest.groovy b/instrumentation/ratpack-1.4/src/test/groovy/client/RatpackHttpClientTest.groovy index 896e3d1310..da97304ff8 100644 --- a/instrumentation/ratpack-1.4/src/test/groovy/client/RatpackHttpClientTest.groovy +++ b/instrumentation/ratpack-1.4/src/test/groovy/client/RatpackHttpClientTest.groovy @@ -23,7 +23,7 @@ import ratpack.test.exec.ExecHarness import spock.lang.AutoCleanup import spock.lang.Shared -class RatpackHttpClientTest extends HttpClientTest { +class RatpackHttpClientTest extends HttpClientTest { @AutoCleanup @Shared @@ -52,8 +52,8 @@ class RatpackHttpClientTest extends HttpClientTest { } @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() } @Override diff --git a/instrumentation/ratpack-1.4/src/test/groovy/server/RatpackHttpServerTest.groovy b/instrumentation/ratpack-1.4/src/test/groovy/server/RatpackHttpServerTest.groovy index 26fcd9ac6c..495900397b 100644 --- a/instrumentation/ratpack-1.4/src/test/groovy/server/RatpackHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/src/test/groovy/server/RatpackHttpServerTest.groovy @@ -37,7 +37,7 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCC import static io.opentelemetry.trace.Span.Kind.INTERNAL import static io.opentelemetry.trace.Span.Kind.SERVER -class RatpackHttpServerTest extends HttpServerTest { +class RatpackHttpServerTest extends HttpServerTest { @Override EmbeddedApp startServer(int bindPort) { @@ -112,8 +112,8 @@ class RatpackHttpServerTest extends HttpServerTest classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("reactor/core/publisher/Mono.class")); + return hasClassesNamed("reactor.core.publisher.Mono"); } @Override @@ -59,7 +59,6 @@ public final class FluxAndMonoInstrumentation extends Instrumenter.Default { return new String[] { packageName + ".ReactorCoreAdviceUtils", packageName + ".ReactorCoreAdviceUtils$TracingSubscriber", - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".ReactorCoreDecorator" }; } diff --git a/instrumentation/reactor-3.1/src/main/java8/io/opentelemetry/auto/instrumentation/reactor/core/ReactorCoreDecorator.java b/instrumentation/reactor-3.1/src/main/java8/io/opentelemetry/auto/instrumentation/reactor/core/ReactorCoreDecorator.java index 68b13dc8d3..0ec43b8cbc 100644 --- a/instrumentation/reactor-3.1/src/main/java8/io/opentelemetry/auto/instrumentation/reactor/core/ReactorCoreDecorator.java +++ b/instrumentation/reactor-3.1/src/main/java8/io/opentelemetry/auto/instrumentation/reactor/core/ReactorCoreDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.reactor.core; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientDecorator.java b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientDecorator.java index bc87dd046d..ec2aaf417a 100644 --- a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientDecorator.java +++ b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.rmi.client; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientInstrumentation.java b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientInstrumentation.java index 08b33e0720..8c0e2eea10 100644 --- a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientInstrumentation.java +++ b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/client/RmiClientInstrumentation.java @@ -50,11 +50,7 @@ public final class RmiClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - packageName + ".RmiClientDecorator" - }; + return new String[] {packageName + ".RmiClientDecorator"}; } @Override diff --git a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerDecorator.java b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerDecorator.java index e3c5f44142..60d87b73cf 100644 --- a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerDecorator.java +++ b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.rmi.server; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ServerDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerInstrumentation.java b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerInstrumentation.java index 2634f3095c..a062abeb10 100644 --- a/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerInstrumentation.java +++ b/instrumentation/rmi/src/main/java/io/opentelemetry/auto/instrumentation/rmi/server/RmiServerInstrumentation.java @@ -51,11 +51,7 @@ public final class RmiServerInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.BaseDecorator", - packageName + ".RmiServerDecorator" - }; + return new String[] {packageName + ".RmiServerDecorator"}; } @Override diff --git a/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/SpanFinishingSubscription.java b/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/SpanFinishingSubscription.java index 3a35012b2d..3f37660b2e 100644 --- a/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/SpanFinishingSubscription.java +++ b/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/SpanFinishingSubscription.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.rxjava; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Span; import java.util.concurrent.atomic.AtomicReference; import rx.Subscription; diff --git a/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedOnSubscribe.java b/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedOnSubscribe.java index cdb5e711cf..f87c2a0f6c 100644 --- a/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedOnSubscribe.java +++ b/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedOnSubscribe.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.rxjava; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.context.Scope; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedSubscriber.java b/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedSubscriber.java index 941d52df6f..d6c7eb3b47 100644 --- a/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedSubscriber.java +++ b/instrumentation/rxjava-1.0/src/main/java/io/opentelemetry/auto/instrumentation/rxjava/TracedSubscriber.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.rxjava; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.context.Scope; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/servlet/glassfish-testing/src/test/groovy/GlassFishServerTest.groovy b/instrumentation/servlet/glassfish-testing/src/test/groovy/GlassFishServerTest.groovy index 4ed5ecc99f..fe08db15d7 100644 --- a/instrumentation/servlet/glassfish-testing/src/test/groovy/GlassFishServerTest.groovy +++ b/instrumentation/servlet/glassfish-testing/src/test/groovy/GlassFishServerTest.groovy @@ -36,7 +36,7 @@ import static io.opentelemetry.trace.Span.Kind.SERVER * OSGi setup that requires {@link io.opentelemetry.auto.instrumentation.classloader.ClassloadingInstrumentation}. */ // TODO: Figure out a better way to test with OSGi included. -class GlassFishServerTest extends HttpServerTest { +class GlassFishServerTest extends HttpServerTest { // static { // System.setProperty("ota.integration.grizzly.enabled", "true") @@ -83,8 +83,8 @@ class GlassFishServerTest extends HttpServerTest { } @Override - Servlet3Decorator decorator() { - return Servlet3Decorator.DECORATE + String component() { + return Servlet3Decorator.DECORATE.getComponentName() } @Override @@ -106,7 +106,7 @@ class GlassFishServerTest extends HttpServerTest { } tags { "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" serverDecorator.getComponentName() + "$Tags.COMPONENT" component "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional "$MoreTags.NET_PEER_PORT" Long "$Tags.HTTP_STATUS" endpoint.status diff --git a/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Advice.java b/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Advice.java index ed71f73d4f..6d2c93008a 100644 --- a/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Advice.java +++ b/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Advice.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.servlet2; -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; import static io.opentelemetry.auto.instrumentation.servlet2.HttpServletRequestExtractAdapter.GETTER; import static io.opentelemetry.auto.instrumentation.servlet2.Servlet2Decorator.DECORATE; import static io.opentelemetry.auto.instrumentation.servlet2.Servlet2Decorator.TRACER; @@ -44,12 +44,10 @@ public class Servlet2Advice { @Advice.Argument(0) final ServletRequest request, @Advice.Argument(value = 1, readOnly = false, typing = Assigner.Typing.DYNAMIC) ServletResponse response) { - final Span current = TRACER.getCurrentSpan(); - final boolean hasActiveTrace = current.getContext().isValid(); final boolean hasServletTrace = request.getAttribute(SPAN_ATTRIBUTE) instanceof Span; final boolean invalidRequest = !(request instanceof HttpServletRequest); - if (invalidRequest || (hasActiveTrace && hasServletTrace)) { - // Tracing might already be applied by the FilterChain. If so ignore this. + if (invalidRequest || hasServletTrace) { + // Tracing might already be applied by the FilterChain or a parent request (forward/include). return null; } @@ -82,6 +80,8 @@ public class Servlet2Advice { DECORATE.onRequest(span, httpServletRequest); httpServletRequest.setAttribute(SPAN_ATTRIBUTE, span); + httpServletRequest.setAttribute("traceId", span.getContext().getTraceId().toLowerBase16()); + httpServletRequest.setAttribute("spanId", span.getContext().getSpanId().toLowerBase16()); return new SpanWithScope(span, TRACER.withSpan(span)); } diff --git a/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Decorator.java b/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Decorator.java index 875a6bf5c7..2d401db46f 100644 --- a/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Decorator.java +++ b/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Decorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.servlet2; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; import java.net.URI; diff --git a/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Instrumentation.java b/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Instrumentation.java index 4b8285c6d2..0a66b8183d 100644 --- a/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Instrumentation.java +++ b/instrumentation/servlet/request-2.3/src/main/java/io/opentelemetry/auto/instrumentation/servlet2/Servlet2Instrumentation.java @@ -15,11 +15,12 @@ */ package io.opentelemetry.auto.instrumentation.servlet2; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -39,8 +40,7 @@ public final class Servlet2Instrumentation extends Instrumenter.Default { // this is required to make sure servlet 2 instrumentation won't apply to servlet 3 @Override public ElementMatcher classLoaderMatcher() { - return classLoaderHasNoResources( - "javax/servlet/AsyncEvent.class", "javax/servlet/AsyncListener.class"); + return not(hasClassesNamed("javax.servlet.AsyncEvent", "javax.servlet.AsyncListener")); } @Override @@ -52,9 +52,6 @@ public final class Servlet2Instrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".Servlet2Decorator", packageName + ".HttpServletRequestExtractAdapter", packageName + ".StatusSavingHttpServletResponseWrapper", diff --git a/instrumentation/servlet/request-2.3/src/test/groovy/JettyServlet2Test.groovy b/instrumentation/servlet/request-2.3/src/test/groovy/JettyServlet2Test.groovy index 09e1c8f3db..02b8ff730c 100644 --- a/instrumentation/servlet/request-2.3/src/test/groovy/JettyServlet2Test.groovy +++ b/instrumentation/servlet/request-2.3/src/test/groovy/JettyServlet2Test.groovy @@ -33,7 +33,7 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDI import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS import static io.opentelemetry.trace.Span.Kind.SERVER -class JettyServlet2Test extends HttpServerTest { +class JettyServlet2Test extends HttpServerTest { private static final CONTEXT = "ctx" @@ -78,8 +78,8 @@ class JettyServlet2Test extends HttpServerTest { } @Override - Servlet2Decorator decorator() { - return Servlet2Decorator.DECORATE + String component() { + return Servlet2Decorator.DECORATE.getComponentName() } @Override @@ -101,7 +101,7 @@ class JettyServlet2Test extends HttpServerTest { } tags { "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" serverDecorator.getComponentName() + "$Tags.COMPONENT" component "$MoreTags.NET_PEER_IP" "127.0.0.1" // No peer port "$Tags.HTTP_URL" { it == "${endpoint.resolve(address)}" || it == "${endpoint.resolveWithoutFragment(address)}" } diff --git a/instrumentation/servlet/request-3.0/request-3.0.gradle b/instrumentation/servlet/request-3.0/request-3.0.gradle index 78b434a8c4..dceb2d1891 100644 --- a/instrumentation/servlet/request-3.0/request-3.0.gradle +++ b/instrumentation/servlet/request-3.0/request-3.0.gradle @@ -27,7 +27,6 @@ dependencies { testCompile(project(':testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:jetty-8.0') // See if there's any conflicts. testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.2.0.v20160908' testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.2.0.v20160908' diff --git a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/AsyncContextInstrumentation.java b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/AsyncContextInstrumentation.java index 403fec5a88..6464f1752b 100644 --- a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/AsyncContextInstrumentation.java +++ b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/AsyncContextInstrumentation.java @@ -15,15 +15,14 @@ */ package io.opentelemetry.auto.instrumentation.servlet3; -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; import static io.opentelemetry.auto.instrumentation.servlet3.Servlet3Decorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.CallDepthThreadLocalMap; @@ -47,7 +46,7 @@ public final class AsyncContextInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/AsyncContext.class")); + return hasClassesNamed("javax.servlet.AsyncContext"); } @Override @@ -57,12 +56,7 @@ public final class AsyncContextInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", - packageName + ".Servlet3Decorator" - }; + return new String[] {packageName + ".Servlet3Decorator"}; } @Override @@ -87,21 +81,8 @@ public final class AsyncContextInstrumentation extends Instrumenter.Default { return false; } - final String path; - if (args.length == 1 && args[0] instanceof String) { - path = (String) args[0]; - } else if (args.length == 2 && args[1] instanceof String) { - path = (String) args[1]; - } else { - path = "true"; - } - final ServletRequest request = context.getRequest(); - // this tells the dispatched servlet that it is already part of an existing servlet request, - // so that it will only capture an INTERNAL span to represent the dispatch work - request.setAttribute("io.opentelemetry.auto.servlet.dispatch", path); - final Span currentSpan = TRACER.getCurrentSpan(); if (currentSpan.getContext().isValid()) { // this tells the dispatched servlet to use the current span as the parent for its work diff --git a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Advice.java b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Advice.java index 8f07d4163e..3baa7a15d4 100644 --- a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Advice.java +++ b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Advice.java @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.servlet3; -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; import static io.opentelemetry.auto.instrumentation.servlet3.HttpServletRequestExtractAdapter.GETTER; import static io.opentelemetry.auto.instrumentation.servlet3.Servlet3Decorator.DECORATE; import static io.opentelemetry.auto.instrumentation.servlet3.Servlet3Decorator.TRACER; @@ -48,26 +48,9 @@ public class Servlet3Advice { } final Object spanAttr = request.getAttribute(SPAN_ATTRIBUTE); if (spanAttr instanceof Span) { - // inside of an existing servlet span already + // inside of an existing servlet span already, possibly a dispatched servlet/filter final Span span = (Span) spanAttr; - final Object dispatch = request.getAttribute("io.opentelemetry.auto.servlet.dispatch"); - - if (dispatch instanceof String) { - // inside of a dispatched servlet/filter - - // remove the dispatch attribute so that it won't trigger any additional dispatch spans - // beyond this one - request.removeAttribute("io.opentelemetry.auto.servlet.dispatch"); - - // start an INTERNAL span to group the dispatched work under - final Span dispatchSpan = - TRACER.spanBuilder("servlet.dispatch").setParent(span).startSpan(); - DECORATE.afterStart(dispatchSpan); - dispatchSpan.setAttribute(MoreTags.RESOURCE_NAME, (String) dispatch); - return new SpanWithScope(dispatchSpan, TRACER.withSpan(dispatchSpan)); - } - final boolean spanContextWasLost = !TRACER.getCurrentSpan().getContext().getTraceId().equals(span.getContext().getTraceId()); if (spanContextWasLost) { @@ -85,6 +68,11 @@ public class Servlet3Advice { } final HttpServletRequest httpServletRequest = (HttpServletRequest) request; + + // For use by HttpServletResponseInstrumentation: + InstrumentationContext.get(HttpServletResponse.class, HttpServletRequest.class) + .put((HttpServletResponse) response, httpServletRequest); + final Span.Builder builder = TRACER.spanBuilder(DECORATE.spanNameForRequest(httpServletRequest)).setSpanKind(SERVER); try { @@ -95,11 +83,7 @@ public class Servlet3Advice { // Couldn't extract a context. We should treat this as a root span. ' builder.setNoParent(); } - // For use by HttpServletResponseInstrumentation: - InstrumentationContext.get(HttpServletResponse.class, HttpServletRequest.class) - .put((HttpServletResponse) response, httpServletRequest); final Span span = builder.startSpan(); - span.setAttribute("span.origin.type", servlet.getClass().getName()); DECORATE.afterStart(span); @@ -107,6 +91,8 @@ public class Servlet3Advice { DECORATE.onRequest(span, httpServletRequest); httpServletRequest.setAttribute(SPAN_ATTRIBUTE, span); + httpServletRequest.setAttribute("traceId", span.getContext().getTraceId().toLowerBase16()); + httpServletRequest.setAttribute("spanId", span.getContext().getSpanId().toLowerBase16()); return new SpanWithScope(span, TRACER.withSpan(span)); } diff --git a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Decorator.java b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Decorator.java index 8528c59552..ea9d637e88 100644 --- a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Decorator.java +++ b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Decorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.servlet3; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; import java.net.URI; diff --git a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Instrumentation.java b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Instrumentation.java index 2a56f86f70..1e79ee5db3 100644 --- a/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Instrumentation.java +++ b/instrumentation/servlet/request-3.0/src/main/java/io/opentelemetry/auto/instrumentation/servlet3/Servlet3Instrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.servlet3; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -39,7 +38,7 @@ public final class Servlet3Instrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/http/HttpServlet.class")); + return hasClassesNamed("javax.servlet.http.HttpServlet"); } @Override @@ -51,9 +50,6 @@ public final class Servlet3Instrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".Servlet3Decorator", packageName + ".HttpServletRequestExtractAdapter", packageName + ".TagSettingAsyncListener" diff --git a/instrumentation/servlet/request-3.0/src/test/groovy/AbstractServlet3Test.groovy b/instrumentation/servlet/request-3.0/src/test/groovy/AbstractServlet3Test.groovy index b14667996f..554cba1758 100644 --- a/instrumentation/servlet/request-3.0/src/test/groovy/AbstractServlet3Test.groovy +++ b/instrumentation/servlet/request-3.0/src/test/groovy/AbstractServlet3Test.groovy @@ -21,7 +21,6 @@ import io.opentelemetry.auto.test.asserts.TraceAssert import io.opentelemetry.auto.test.base.HttpServerTest import io.opentelemetry.trace.Span import okhttp3.Request -import org.apache.catalina.core.ApplicationFilterChain import javax.servlet.Servlet @@ -32,15 +31,15 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.QUER import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDIRECT import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS -abstract class AbstractServlet3Test extends HttpServerTest { +abstract class AbstractServlet3Test extends HttpServerTest { @Override URI buildAddress() { return new URI("http://localhost:$port/$context/") } @Override - Servlet3Decorator decorator() { - return Servlet3Decorator.DECORATE + String component() { + return Servlet3Decorator.DECORATE.getComponentName() } // FIXME: Add authentication tests back in... @@ -78,7 +77,6 @@ abstract class AbstractServlet3Test extends HttpServerTest extends HttpServerTest extends HttpServerTest { @@ -226,29 +220,4 @@ abstract class JettyDispatchTest extends JettyServlet3Test { URI buildAddress() { return new URI("http://localhost:$port/$context/dispatch/") } - - boolean hasDispatchSpan(ServerEndpoint endpoint) { - true - } - - @Override - void dispatchSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { - trace.span(index) { - operationName "servlet.dispatch" - spanKind INTERNAL - childOf((SpanData) parent) - errored endpoint.errored - tags { - "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$MoreTags.RESOURCE_NAME" endpoint.path - "$Tags.COMPONENT" serverDecorator.getComponentName() - "$Tags.HTTP_STATUS" endpoint.status - if (endpoint.errored) { - "error.msg" { it == null || it == EXCEPTION.body } - "error.type" { it == null || it == Exception.name } - "error.stack" { it == null || it instanceof String } - } - } - } - } } diff --git a/instrumentation/servlet/request-3.0/src/test/groovy/TomcatServlet3Test.groovy b/instrumentation/servlet/request-3.0/src/test/groovy/TomcatServlet3Test.groovy index 6195acdaa1..5725c382b2 100644 --- a/instrumentation/servlet/request-3.0/src/test/groovy/TomcatServlet3Test.groovy +++ b/instrumentation/servlet/request-3.0/src/test/groovy/TomcatServlet3Test.groovy @@ -14,33 +14,36 @@ * limitations under the License. */ import com.google.common.io.Files -import io.opentelemetry.auto.instrumentation.api.MoreTags -import io.opentelemetry.auto.instrumentation.api.SpanTypes -import io.opentelemetry.auto.instrumentation.api.Tags -import io.opentelemetry.auto.test.asserts.TraceAssert -import io.opentelemetry.sdk.trace.SpanData +import org.apache.catalina.AccessLog import org.apache.catalina.Context import org.apache.catalina.connector.Request import org.apache.catalina.connector.Response import org.apache.catalina.core.StandardHost import org.apache.catalina.startup.Tomcat import org.apache.catalina.valves.ErrorReportValve +import org.apache.catalina.valves.ValveBase import org.apache.tomcat.JarScanFilter import org.apache.tomcat.JarScanType +import spock.lang.Shared +import spock.lang.Unroll import javax.servlet.Servlet +import javax.servlet.ServletException import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.AUTH_REQUIRED import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.EXCEPTION -import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDIRECT import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS -import static io.opentelemetry.trace.Span.Kind.INTERNAL +import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan +@Unroll abstract class TomcatServlet3Test extends AbstractServlet3Test { + @Shared + def accessLogValue = new TestAccessLogValve() + @Override Tomcat startServer(int port) { def tomcatServer = new Tomcat() @@ -70,12 +73,17 @@ abstract class TomcatServlet3Test extends AbstractServlet3Test setupServlets(servletContext) (tomcatServer.host as StandardHost).errorReportValveClass = ErrorHandlerValve.name + (tomcatServer.host as StandardHost).getPipeline().addValve(accessLogValue) tomcatServer.start() return tomcatServer } + def setup() { + accessLogValue.loggedIds.clear() + } + @Override void stopServer(Tomcat server) { server.stop() @@ -94,6 +102,74 @@ abstract class TomcatServlet3Test extends AbstractServlet3Test servletContext.addServletMappingDecoded(path, name) } + + def "access log has ids for #count requests"() { + given: + def request = request(SUCCESS, method, body).build() + + when: + List responses = (1..count).collect { + return client.newCall(request).execute() + } + + then: + responses.each { response -> + assert response.code() == SUCCESS.status + assert response.body().string() == SUCCESS.body + } + + and: + assertTraces(count * 2) { + (0..count - 1).each { + trace(it * 2, 1) { + basicSpan(it, 0, "TEST_SPAN", "ServerEntry") + } + trace(it * 2 + 1, 2) { + serverSpan(it, 0) + controllerSpan(it, 1, span(0)) + } + + def (String traceId, String spanId) = accessLogValue.loggedIds[it] + assert traces[it * 2 + 1][0].traceId.toLowerBase16() == traceId + assert traces[it * 2 + 1][0].spanId.toLowerBase16() == spanId + } + } + + where: + method = "GET" + body = null + count << [1, 4] // make multiple requests. + } + + def "access log has ids for error request"() { + setup: + def request = request(ERROR, method, body).build() + def response = client.newCall(request).execute() + + expect: + response.code() == ERROR.status + response.body().string() == ERROR.body + + and: + assertTraces(2) { + trace(0, 1) { + basicSpan(it, 0, "TEST_SPAN", "ServerEntry") + } + trace(1, 2) { + serverSpan(it, 0, null, null, method, ERROR) + controllerSpan(it, 1, span(0)) + } + + def (String traceId, String spanId) = accessLogValue.loggedIds[0] + assert traces[1][0].traceId.toLowerBase16() == traceId + assert traces[1][0].spanId.toLowerBase16() == spanId + } + + where: + method = "GET" + body = null + } + // FIXME: Add authentication tests back in... // private setupAuthentication(Tomcat server, Context servletContext) { // // Login Config @@ -142,6 +218,33 @@ class ErrorHandlerValve extends ErrorReportValve { } } +class TestAccessLogValve extends ValveBase implements AccessLog { + List> loggedIds = [] + + TestAccessLogValve() { + super(true) + } + + void log(Request request, Response response, long time) { + loggedIds.add(new Tuple2(request.getAttribute("traceId"), + request.getAttribute("spanId"))) + } + + @Override + void setRequestAttributesEnabled(boolean requestAttributesEnabled) { + } + + @Override + boolean getRequestAttributesEnabled() { + return false + } + + @Override + void invoke(Request request, Response response) throws IOException, ServletException { + getNext().invoke(request, response) + } +} + class TomcatServlet3TestSync extends TomcatServlet3Test { @Override @@ -266,30 +369,4 @@ abstract class TomcatDispatchTest extends TomcatServlet3Test { URI buildAddress() { return new URI("http://localhost:$port/$context/dispatch/") } - - boolean hasDispatchSpan(ServerEndpoint endpoint) { - // Tomcat won't "dispatch" an unregistered url - endpoint != NOT_FOUND - } - - @Override - void dispatchSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { - trace.span(index) { - operationName "servlet.dispatch" - spanKind INTERNAL - childOf((SpanData) parent) - errored endpoint.errored - tags { - "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$MoreTags.RESOURCE_NAME" endpoint.path - "$Tags.COMPONENT" serverDecorator.getComponentName() - "$Tags.HTTP_STATUS" endpoint.status - if (endpoint.errored) { - "error.msg" { it == null || it == EXCEPTION.body } - "error.type" { it == null || it == Exception.name } - "error.stack" { it == null || it instanceof String } - } - } - } - } } diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherDecorator.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherDecorator.java index a3dbc9b606..b259b9cf74 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherDecorator.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.servlet.dispatcher; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Tracer; public class RequestDispatcherDecorator extends BaseDecorator { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java index f00073bdef..a3baa47772 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/RequestDispatcherInstrumentation.java @@ -15,16 +15,16 @@ */ package io.opentelemetry.auto.instrumentation.servlet.dispatcher; -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE; import static io.opentelemetry.auto.instrumentation.servlet.dispatcher.RequestDispatcherDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.servlet.dispatcher.RequestDispatcherDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.InstrumentationContext; @@ -49,7 +49,7 @@ public final class RequestDispatcherInstrumentation extends Instrumenter.Default @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/RequestDispatcher.class")); + return hasClassesNamed("javax.servlet.RequestDispatcher"); } @Override @@ -60,7 +60,7 @@ public final class RequestDispatcherInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".RequestDispatcherDecorator", + packageName + ".RequestDispatcherDecorator", }; } @@ -74,10 +74,11 @@ public final class RequestDispatcherInstrumentation extends Instrumenter.Default return singletonMap( named("forward") .or(named("include")) + .and(takesArguments(2)) .and(takesArgument(0, named("javax.servlet.ServletRequest"))) .and(takesArgument(1, named("javax.servlet.ServletResponse"))) .and(isPublic()), - RequestDispatcherAdvice.class.getName()); + getClass().getName() + "$RequestDispatcherAdvice"); } public static class RequestDispatcherAdvice { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java index 457b508077..c5a3c345a4 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/dispatcher/ServletContextInstrumentation.java @@ -15,12 +15,11 @@ */ package io.opentelemetry.auto.instrumentation.servlet.dispatcher; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -43,7 +42,7 @@ public final class ServletContextInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/ServletContext.class")); + return hasClassesNamed("javax.servlet.ServletContext"); } @Override diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterDecorator.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterDecorator.java index d4c9a28972..f413090fbe 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterDecorator.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.servlet.filter; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Tracer; public class FilterDecorator extends BaseDecorator { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterInstrumentation.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterInstrumentation.java index 2aea6157b5..193ebe9991 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterInstrumentation.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/filter/FilterInstrumentation.java @@ -16,12 +16,11 @@ package io.opentelemetry.auto.instrumentation.servlet.filter; import static io.opentelemetry.auto.instrumentation.servlet.filter.FilterDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -50,8 +49,8 @@ public final class FilterInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - // return not(classLoaderHasNoResources("javax/servlet/Filter.class")); // Not available in 2.2 - return not(classLoaderHasNoResources("javax/servlet/http/HttpServlet.class")); + // return hasClassesNamed("javax.servlet.Filter"); // Not available in 2.2 + return hasClassesNamed("javax.servlet.http.HttpServlet"); } @Override @@ -62,7 +61,7 @@ public final class FilterInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".FilterDecorator", + packageName + ".FilterDecorator", }; } @@ -73,7 +72,7 @@ public final class FilterInstrumentation extends Instrumenter.Default { .and(takesArgument(0, named("javax.servlet.ServletRequest"))) .and(takesArgument(1, named("javax.servlet.ServletResponse"))) .and(isPublic()), - FilterAdvice.class.getName()); + getClass().getName() + "$FilterAdvice"); } public static class FilterAdvice { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletDecorator.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletDecorator.java index 059a278e5c..3b171718cb 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletDecorator.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.servlet.http; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Tracer; public class HttpServletDecorator extends BaseDecorator { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletInstrumentation.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletInstrumentation.java index 8503e43663..ea3d0275d9 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletInstrumentation.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletInstrumentation.java @@ -17,14 +17,13 @@ package io.opentelemetry.auto.instrumentation.servlet.http; import static io.opentelemetry.auto.instrumentation.servlet.http.HttpServletDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.servlet.http.HttpServletDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isProtected; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; @@ -53,7 +52,7 @@ public final class HttpServletInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/http/HttpServlet.class")); + return hasClassesNamed("javax.servlet.http.HttpServlet"); } @Override @@ -64,7 +63,7 @@ public final class HttpServletInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".HttpServletDecorator", + packageName + ".HttpServletDecorator", }; } @@ -80,7 +79,7 @@ public final class HttpServletInstrumentation extends Instrumenter.Default { .and(takesArgument(0, named("javax.servlet.http.HttpServletRequest"))) .and(takesArgument(1, named("javax.servlet.http.HttpServletResponse"))) .and(isProtected().or(isPublic())), - HttpServletAdvice.class.getName()); + getClass().getName() + "$HttpServletAdvice"); } public static class HttpServletAdvice { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseDecorator.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseDecorator.java index 318c17acca..86e17dae95 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseDecorator.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.servlet.http; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Tracer; public class HttpServletResponseDecorator extends BaseDecorator { diff --git a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseInstrumentation.java b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseInstrumentation.java index 669204299d..c3299d8124 100644 --- a/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseInstrumentation.java +++ b/instrumentation/servlet/src/main/java/io/opentelemetry/auto/instrumentation/servlet/http/HttpServletResponseInstrumentation.java @@ -17,11 +17,10 @@ package io.opentelemetry.auto.instrumentation.servlet.http; import static io.opentelemetry.auto.instrumentation.servlet.http.HttpServletResponseDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.servlet.http.HttpServletResponseDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import com.google.auto.service.AutoService; import io.opentelemetry.auto.bootstrap.InstrumentationContext; @@ -46,7 +45,7 @@ public final class HttpServletResponseInstrumentation extends Instrumenter.Defau @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("javax/servlet/http/HttpServletResponse.class")); + return hasClassesNamed("javax.servlet.http.HttpServletResponse"); } @Override @@ -57,7 +56,6 @@ public final class HttpServletResponseInstrumentation extends Instrumenter.Defau @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".HttpServletResponseDecorator", }; } diff --git a/instrumentation/servlet/src/test/groovy/RequestDispatcherTest.groovy b/instrumentation/servlet/src/test/groovy/RequestDispatcherTest.groovy index ab2d271233..42a2f2c610 100644 --- a/instrumentation/servlet/src/test/groovy/RequestDispatcherTest.groovy +++ b/instrumentation/servlet/src/test/groovy/RequestDispatcherTest.groovy @@ -22,7 +22,7 @@ import javax.servlet.ServletException import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse -import static io.opentelemetry.auto.decorator.HttpServerDecorator.SPAN_ATTRIBUTE +import static io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator.SPAN_ATTRIBUTE import static io.opentelemetry.auto.test.utils.TraceUtils.basicSpan import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace diff --git a/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringDataDecorator.java b/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringDataDecorator.java index cf63df9f69..a749d8f54b 100644 --- a/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringDataDecorator.java +++ b/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringDataDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.springdata; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringRepositoryInstrumentation.java b/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringRepositoryInstrumentation.java index b6f96597bd..73ea93a3f3 100644 --- a/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringRepositoryInstrumentation.java +++ b/instrumentation/spring-data-1.8/src/main/java/io/opentelemetry/auto/instrumentation/springdata/SpringRepositoryInstrumentation.java @@ -54,8 +54,6 @@ public final class SpringRepositoryInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".SpringDataDecorator", getClass().getName() + "$RepositoryInterceptor", getClass().getName() + "$InterceptingRepositoryProxyPostProcessor", diff --git a/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingDecorator.java b/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingDecorator.java index 1c859119cb..fe6b57d94b 100644 --- a/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingDecorator.java +++ b/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.springscheduling; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingInstrumentation.java b/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingInstrumentation.java index 720c49df5d..630c55abf3 100644 --- a/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingInstrumentation.java +++ b/instrumentation/spring-scheduling-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springscheduling/SpringSchedulingInstrumentation.java @@ -47,9 +47,7 @@ public final class SpringSchedulingInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - packageName + ".SpringSchedulingDecorator", - getClass().getName() + "$RunnableWrapper", + packageName + ".SpringSchedulingDecorator", getClass().getName() + "$RunnableWrapper", }; } diff --git a/instrumentation/spring-webflux-5.0/spring-webflux-5.0.gradle b/instrumentation/spring-webflux-5.0/spring-webflux-5.0.gradle index 6f6e1f9091..3be42c6353 100644 --- a/instrumentation/spring-webflux-5.0/spring-webflux-5.0.gradle +++ b/instrumentation/spring-webflux-5.0/spring-webflux-5.0.gradle @@ -31,7 +31,6 @@ dependencies { // TODO: It is unclear why we need to use `compile` here (instead of 'compileOnly') compile project(':instrumentation:reactor-3.1') - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:trace-annotation') testCompile project(':instrumentation:netty:netty-4.1') testCompile project(':instrumentation:reactor-3.1') diff --git a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java index 90ab500d09..c16a30ca85 100644 --- a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java +++ b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/client/DefaultWebClientInstrumentation.java @@ -15,13 +15,12 @@ */ package io.opentelemetry.auto.instrumentation.springwebflux.client; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.auto.tooling.Instrumenter; @@ -41,9 +40,7 @@ public class DefaultWebClientInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not( - classLoaderHasNoResources( - "org/springframework/web/reactive/function/client/ExchangeFunction.class")); + return hasClassesNamed("org.springframework.web.reactive.function.client.ExchangeFunction"); } @Override @@ -55,9 +52,6 @@ public class DefaultWebClientInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", - "io.opentelemetry.auto.decorator.HttpClientDecorator", packageName + ".SpringWebfluxHttpClientDecorator", packageName + ".HttpHeadersInjectAdapter", packageName + ".TracingClientResponseSubscriber", diff --git a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/AbstractWebfluxInstrumentation.java b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/AbstractWebfluxInstrumentation.java index dd995a3595..5af24d728c 100644 --- a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/AbstractWebfluxInstrumentation.java +++ b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/AbstractWebfluxInstrumentation.java @@ -26,8 +26,6 @@ public abstract class AbstractWebfluxInstrumentation extends Instrumenter.Defaul @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", packageName + ".SpringWebfluxHttpServerDecorator", // Some code comes from reactor's instrumentation's helper "io.opentelemetry.auto.instrumentation.reactor.core.ReactorCoreDecorator", diff --git a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/HandlerAdapterInstrumentation.java b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/HandlerAdapterInstrumentation.java index eb303e42e5..49880957ba 100644 --- a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/HandlerAdapterInstrumentation.java +++ b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/HandlerAdapterInstrumentation.java @@ -15,6 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.springwebflux.server; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -35,6 +36,12 @@ import net.bytebuddy.matcher.ElementMatcher; @AutoService(Instrumenter.class) public final class HandlerAdapterInstrumentation extends AbstractWebfluxInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("org.springframework.web.reactive.HandlerAdapter"); + } + @Override public ElementMatcher typeMatcher() { return not(isAbstract()) diff --git a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java index 69bbe46ce2..5344918aea 100644 --- a/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java +++ b/instrumentation/spring-webflux-5.0/src/main/java/io/opentelemetry/auto/instrumentation/springwebflux/server/RouterFunctionInstrumentation.java @@ -15,6 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.springwebflux.server; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isAbstract; @@ -39,6 +40,12 @@ public final class RouterFunctionInstrumentation extends AbstractWebfluxInstrume super("spring-webflux-functional"); } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("org.springframework.web.reactive.function.server.ServerRequest"); + } + @Override public ElementMatcher typeMatcher() { return not(isAbstract()) diff --git a/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/client/SpringWebfluxHttpClientDecorator.java b/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/client/SpringWebfluxHttpClientDecorator.java index 54af580054..f24555a895 100644 --- a/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/client/SpringWebfluxHttpClientDecorator.java +++ b/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/client/SpringWebfluxHttpClientDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.springwebflux.client; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; import java.net.URI; diff --git a/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/server/SpringWebfluxHttpServerDecorator.java b/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/server/SpringWebfluxHttpServerDecorator.java index 497b0b7af0..2079bc81cb 100644 --- a/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/server/SpringWebfluxHttpServerDecorator.java +++ b/instrumentation/spring-webflux-5.0/src/main/java8/io/opentelemetry/auto/instrumentation/springwebflux/server/SpringWebfluxHttpServerDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.springwebflux.server; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ServerDecorator; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Tracer; import lombok.extern.slf4j.Slf4j; diff --git a/instrumentation/spring-webflux-5.0/src/test/groovy/client/SpringWebfluxHttpClientTest.groovy b/instrumentation/spring-webflux-5.0/src/test/groovy/client/SpringWebfluxHttpClientTest.groovy index c5d77b63e4..74ef68c079 100644 --- a/instrumentation/spring-webflux-5.0/src/test/groovy/client/SpringWebfluxHttpClientTest.groovy +++ b/instrumentation/spring-webflux-5.0/src/test/groovy/client/SpringWebfluxHttpClientTest.groovy @@ -33,7 +33,7 @@ import static io.opentelemetry.trace.Span.Kind.CLIENT // FIXME this instrumentation is not currently reliable and so is currently disabled // see DefaultWebClientInstrumentation and DefaultWebClientAdvice @Ignore -class SpringWebfluxHttpClientTest extends HttpClientTest { +class SpringWebfluxHttpClientTest extends HttpClientTest { @Shared def client = WebClient.builder().build() @@ -53,8 +53,8 @@ class SpringWebfluxHttpClientTest extends HttpClientTest classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("org/springframework/web/servlet/HandlerAdapter.class")); + return hasClassesNamed("org.springframework.web.servlet.HandlerAdapter"); } @Override @@ -61,9 +60,6 @@ public final class HandlerAdapterInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ServerDecorator", - "io.opentelemetry.auto.decorator.HttpServerDecorator", packageName + ".SpringWebHttpServerDecorator", packageName + ".SpringWebHttpServerDecorator$1", }; diff --git a/instrumentation/spring-webmvc-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springweb/SpringWebHttpServerDecorator.java b/instrumentation/spring-webmvc-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springweb/SpringWebHttpServerDecorator.java index e5c26b97e2..e924563827 100644 --- a/instrumentation/spring-webmvc-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springweb/SpringWebHttpServerDecorator.java +++ b/instrumentation/spring-webmvc-3.1/src/main/java/io/opentelemetry/auto/instrumentation/springweb/SpringWebHttpServerDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.springweb; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.HttpServerDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.trace.Span; import io.opentelemetry.trace.Tracer; diff --git a/instrumentation/spring-webmvc-3.1/src/test/groovy/test/SpringBootBasedTest.groovy b/instrumentation/spring-webmvc-3.1/src/test/groovy/test/SpringBootBasedTest.groovy index 1f529506ea..a4f81e8257 100644 --- a/instrumentation/spring-webmvc-3.1/src/test/groovy/test/SpringBootBasedTest.groovy +++ b/instrumentation/spring-webmvc-3.1/src/test/groovy/test/SpringBootBasedTest.groovy @@ -36,7 +36,7 @@ import static io.opentelemetry.trace.Span.Kind.INTERNAL import static io.opentelemetry.trace.Span.Kind.SERVER import static java.util.Collections.singletonMap -class SpringBootBasedTest extends HttpServerTest { +class SpringBootBasedTest extends HttpServerTest { @Override ConfigurableApplicationContext startServer(int port) { @@ -52,8 +52,8 @@ class SpringBootBasedTest extends HttpServerTest classLoaderMatcher() { + // Optimization for expensive typeMatcher. + ElementMatcher.Junction matcher = null; + for (final String name : additionalTraceAnnotations) { + if (matcher == null) { + matcher = hasClassesNamed(name); + } else { + matcher = matcher.or(hasClassesNamed(name)); + } + } + if (matcher == null) { + return none(); + } + return matcher; + } + @Override public ElementMatcher typeMatcher() { return safeHasSuperType(declaresMethod(isAnnotatedWith(methodTraceMatcher))); @@ -107,7 +125,7 @@ public final class TraceAnnotationsInstrumentation extends Instrumenter.Default @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".TraceDecorator", + packageName + ".TraceDecorator", }; } diff --git a/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceConfigInstrumentation.java b/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceConfigInstrumentation.java index 981d6b2590..567af0c2f4 100644 --- a/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceConfigInstrumentation.java +++ b/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceConfigInstrumentation.java @@ -15,6 +15,7 @@ */ package io.opentelemetry.auto.instrumentation.trace_annotation; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.safeHasSuperType; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -130,7 +131,7 @@ public class TraceConfigInstrumentation implements Instrumenter { /** No-arg constructor only used by muzzle and tests. */ public TracerClassInstrumentation() { - this("noop", Collections.singleton("noop")); + this("io.opentracing.contrib.dropwizard.Trace", Collections.singleton("noop")); } public TracerClassInstrumentation(final String className, final Set methodNames) { @@ -139,6 +140,12 @@ public class TraceConfigInstrumentation implements Instrumenter { this.methodNames = methodNames; } + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed(className); + } + @Override public ElementMatcher typeMatcher() { return safeHasSuperType(named(className)); @@ -147,7 +154,7 @@ public class TraceConfigInstrumentation implements Instrumenter { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", packageName + ".TraceDecorator", + packageName + ".TraceDecorator", }; } diff --git a/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceDecorator.java b/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceDecorator.java index 3695f186b9..c59687f69d 100644 --- a/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceDecorator.java +++ b/instrumentation/trace-annotation/src/main/java/io/opentelemetry/auto/instrumentation/trace_annotation/TraceDecorator.java @@ -16,7 +16,7 @@ package io.opentelemetry.auto.instrumentation.trace_annotation; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.BaseDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator; import io.opentelemetry.trace.Tracer; public class TraceDecorator extends BaseDecorator { diff --git a/instrumentation/trace-annotation/trace-annotation.gradle b/instrumentation/trace-annotation/trace-annotation.gradle index f26306749c..e4c402563e 100644 --- a/instrumentation/trace-annotation/trace-annotation.gradle +++ b/instrumentation/trace-annotation/trace-annotation.gradle @@ -1,5 +1,13 @@ apply from: "${rootDir}/gradle/instrumentation.gradle" +muzzle { + pass { + group = "io.opentracing.contrib.dropwizard" + module = "dropwizard-opentracing" + versions = "(,)" + } +} + dependencies { testCompile group: 'com.newrelic.agent.java', name: 'newrelic-api', version: '+' testCompile group: 'io.opentracing.contrib.dropwizard', name: 'dropwizard-opentracing', version: '0.2.2' diff --git a/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioAsyncInstrumentation.java b/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioAsyncInstrumentation.java index 6bfd3d3ff3..476157dd1f 100644 --- a/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioAsyncInstrumentation.java +++ b/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioAsyncInstrumentation.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.twilio; import static io.opentelemetry.auto.instrumentation.twilio.TwilioClientDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.twilio.TwilioClientDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static java.util.Collections.singletonMap; @@ -53,7 +53,7 @@ public class TwilioAsyncInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/twilio/Twilio.class")); + return hasClassesNamed("com.twilio.Twilio"); } /** Match any child class of the base Twilio service classes. */ @@ -71,8 +71,6 @@ public class TwilioAsyncInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".TwilioClientDecorator", packageName + ".TwilioAsyncInstrumentation$SpanFinishingCallback", }; diff --git a/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioClientDecorator.java b/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioClientDecorator.java index c28b375b52..08e867cb1d 100644 --- a/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioClientDecorator.java +++ b/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioClientDecorator.java @@ -19,7 +19,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.twilio.rest.api.v2010.account.Call; import com.twilio.rest.api.v2010.account.Message; import io.opentelemetry.OpenTelemetry; -import io.opentelemetry.auto.decorator.ClientDecorator; +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.ClientDecorator; import io.opentelemetry.auto.instrumentation.api.MoreTags; import io.opentelemetry.auto.instrumentation.api.SpanTypes; import io.opentelemetry.trace.Span; diff --git a/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioSyncInstrumentation.java b/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioSyncInstrumentation.java index 2e59db2c73..4366c57663 100644 --- a/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioSyncInstrumentation.java +++ b/instrumentation/twilio-6.6/src/main/java/io/opentelemetry/auto/instrumentation/twilio/TwilioSyncInstrumentation.java @@ -17,7 +17,7 @@ package io.opentelemetry.auto.instrumentation.twilio; import static io.opentelemetry.auto.instrumentation.twilio.TwilioClientDecorator.DECORATE; import static io.opentelemetry.auto.instrumentation.twilio.TwilioClientDecorator.TRACER; -import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.classLoaderHasNoResources; +import static io.opentelemetry.auto.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.auto.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.trace.Span.Kind.CLIENT; import static java.util.Collections.singletonMap; @@ -49,7 +49,7 @@ public class TwilioSyncInstrumentation extends Instrumenter.Default { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. - return not(classLoaderHasNoResources("com/twilio/Twilio.class")); + return hasClassesNamed("com.twilio.Twilio"); } /** Match any child class of the base Twilio service classes. */ @@ -69,8 +69,6 @@ public class TwilioSyncInstrumentation extends Instrumenter.Default { @Override public String[] helperClassNames() { return new String[] { - "io.opentelemetry.auto.decorator.BaseDecorator", - "io.opentelemetry.auto.decorator.ClientDecorator", packageName + ".TwilioClientDecorator", }; } diff --git a/instrumentation/twilio-6.6/src/test/groovy/test/TwilioClientTest.groovy b/instrumentation/twilio-6.6/src/test/groovy/test/TwilioClientTest.groovy index 5cdc2d80bb..c05e6fc3f2 100644 --- a/instrumentation/twilio-6.6/src/test/groovy/test/TwilioClientTest.groovy +++ b/instrumentation/twilio-6.6/src/test/groovy/test/TwilioClientTest.groovy @@ -25,7 +25,7 @@ import com.twilio.http.TwilioRestClient import com.twilio.rest.api.v2010.account.Call import com.twilio.rest.api.v2010.account.Message import com.twilio.type.PhoneNumber -import io.opentelemetry.auto.decorator.HttpClientDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags diff --git a/instrumentation/twilio-6.6/twilio-6.6.gradle b/instrumentation/twilio-6.6/twilio-6.6.gradle index db9f0bf6b3..001c4e4b69 100644 --- a/instrumentation/twilio-6.6/twilio-6.6.gradle +++ b/instrumentation/twilio-6.6/twilio-6.6.gradle @@ -18,7 +18,6 @@ dependencies { testCompile group: 'com.twilio.sdk', name: 'twilio', version: '6.6.9' testCompile project(':instrumentation:apache-httpclient:apache-httpclient-4.0') - testCompile project(':instrumentation:java-concurrent') testCompile group: 'nl.jqno.equalsverifier', name: 'equalsverifier', version: '2.5.2' // Last version to support Java7 latestDepTestCompile group: 'com.twilio.sdk', name: 'twilio', version: '+' diff --git a/instrumentation/vertx-testing/src/test/groovy/client/VertxHttpClientTest.groovy b/instrumentation/vertx-testing/src/test/groovy/client/VertxHttpClientTest.groovy index 2efba379e5..73b0db5551 100644 --- a/instrumentation/vertx-testing/src/test/groovy/client/VertxHttpClientTest.groovy +++ b/instrumentation/vertx-testing/src/test/groovy/client/VertxHttpClientTest.groovy @@ -28,39 +28,39 @@ import spock.lang.Timeout import java.util.concurrent.CompletableFuture @Timeout(10) -class VertxHttpClientTest extends HttpClientTest { +class VertxHttpClientTest extends HttpClientTest { - @Shared - Vertx vertx = Vertx.vertx(new VertxOptions()) - @Shared - HttpClient httpClient = vertx.createHttpClient() + @Shared + Vertx vertx = Vertx.vertx(new VertxOptions()) + @Shared + HttpClient httpClient = vertx.createHttpClient() - @Override - int doRequest(String method, URI uri, Map headers, Closure callback) { - CompletableFuture future = new CompletableFuture<>() - def request = httpClient.request(HttpMethod.valueOf(method), uri.port, uri.host, "$uri") - headers.each { request.putHeader(it.key, it.value) } - request.handler { response -> - callback?.call() - future.complete(response) + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + CompletableFuture future = new CompletableFuture<>() + def request = httpClient.request(HttpMethod.valueOf(method), uri.port, uri.host, "$uri") + headers.each { request.putHeader(it.key, it.value) } + request.handler { response -> + callback?.call() + future.complete(response) + } + request.end() + + return future.get().statusCode() } - request.end() - return future.get().statusCode() - } + @Override + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() + } - @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE - } + @Override + boolean testRedirects() { + false + } - @Override - boolean testRedirects() { - false - } - - @Override - boolean testConnectionFailure() { - false - } + @Override + boolean testConnectionFailure() { + false + } } diff --git a/instrumentation/vertx-testing/src/test/groovy/client/VertxRxCircuitBreakerWebClientTest.groovy b/instrumentation/vertx-testing/src/test/groovy/client/VertxRxCircuitBreakerWebClientTest.groovy index 6057bf1896..e34b4279ab 100644 --- a/instrumentation/vertx-testing/src/test/groovy/client/VertxRxCircuitBreakerWebClientTest.groovy +++ b/instrumentation/vertx-testing/src/test/groovy/client/VertxRxCircuitBreakerWebClientTest.groovy @@ -29,54 +29,54 @@ import spock.lang.Timeout import java.util.concurrent.CompletableFuture @Timeout(10) -class VertxRxCircuitBreakerWebClientTest extends HttpClientTest { +class VertxRxCircuitBreakerWebClientTest extends HttpClientTest { - @Shared - Vertx vertx = Vertx.vertx(new VertxOptions()) - @Shared - WebClient client = WebClient.create(vertx) - @Shared - CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx, - new CircuitBreakerOptions() - .setTimeout(-1) // Disable the timeout otherwise it makes each test take this long. - ) + @Shared + Vertx vertx = Vertx.vertx(new VertxOptions()) + @Shared + WebClient client = WebClient.create(vertx) + @Shared + CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx, + new CircuitBreakerOptions() + .setTimeout(-1) // Disable the timeout otherwise it makes each test take this long. + ) - @Override - int doRequest(String method, URI uri, Map headers, Closure callback) { - def request = client.request(HttpMethod.valueOf(method), uri.port, uri.host, "$uri") - headers.each { request.putHeader(it.key, it.value) } + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + def request = client.request(HttpMethod.valueOf(method), uri.port, uri.host, "$uri") + headers.each { request.putHeader(it.key, it.value) } - def future = new CompletableFuture() + def future = new CompletableFuture() - breaker.executeCommand({ command -> - request.rxSend().doOnSuccess { - command.complete(it) - }.doOnError { - command.fail(it) - }.subscribe() - }, { - callback?.call() - if (it.succeeded()) { - future.complete(it.result().statusCode()) - } else { - future.completeExceptionally(it.cause()) - } - }) - return future.get() - } + breaker.executeCommand({ command -> + request.rxSend().doOnSuccess { + command.complete(it) + }.doOnError { + command.fail(it) + }.subscribe() + }, { + callback?.call() + if (it.succeeded()) { + future.complete(it.result().statusCode()) + } else { + future.completeExceptionally(it.cause()) + } + }) + return future.get() + } - @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE - } + @Override + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() + } - @Override - boolean testRedirects() { - false - } + @Override + boolean testRedirects() { + false + } - @Override - boolean testConnectionFailure() { - false - } + @Override + boolean testConnectionFailure() { + false + } } diff --git a/instrumentation/vertx-testing/src/test/groovy/client/VertxRxWebClientTest.groovy b/instrumentation/vertx-testing/src/test/groovy/client/VertxRxWebClientTest.groovy index 799e23a359..fd05d3d36c 100644 --- a/instrumentation/vertx-testing/src/test/groovy/client/VertxRxWebClientTest.groovy +++ b/instrumentation/vertx-testing/src/test/groovy/client/VertxRxWebClientTest.groovy @@ -25,37 +25,37 @@ import spock.lang.Shared import spock.lang.Timeout @Timeout(10) -class VertxRxWebClientTest extends HttpClientTest { +class VertxRxWebClientTest extends HttpClientTest { - @Shared - Vertx vertx = Vertx.vertx(new VertxOptions()) - @Shared - WebClient client = WebClient.create(vertx) + @Shared + Vertx vertx = Vertx.vertx(new VertxOptions()) + @Shared + WebClient client = WebClient.create(vertx) - @Override - int doRequest(String method, URI uri, Map headers, Closure callback) { - def request = client.request(HttpMethod.valueOf(method), uri.port, uri.host, "$uri") - headers.each { request.putHeader(it.key, it.value) } - return request - .rxSend() - .doOnSuccess { response -> callback?.call() } - .map { it.statusCode() } - .toObservable() - .blockingFirst() - } + @Override + int doRequest(String method, URI uri, Map headers, Closure callback) { + def request = client.request(HttpMethod.valueOf(method), uri.port, uri.host, "$uri") + headers.each { request.putHeader(it.key, it.value) } + return request + .rxSend() + .doOnSuccess { response -> callback?.call() } + .map { it.statusCode() } + .toObservable() + .blockingFirst() + } - @Override - NettyHttpClientDecorator decorator() { - return NettyHttpClientDecorator.DECORATE - } + @Override + String component() { + return NettyHttpClientDecorator.DECORATE.getComponentName() + } - @Override - boolean testRedirects() { - false - } + @Override + boolean testRedirects() { + false + } - @Override - boolean testConnectionFailure() { - false - } + @Override + boolean testConnectionFailure() { + false + } } diff --git a/instrumentation/vertx-testing/src/test/groovy/server/VertxHttpServerTest.groovy b/instrumentation/vertx-testing/src/test/groovy/server/VertxHttpServerTest.groovy index 9df4655ee3..e6b325b4b3 100644 --- a/instrumentation/vertx-testing/src/test/groovy/server/VertxHttpServerTest.groovy +++ b/instrumentation/vertx-testing/src/test/groovy/server/VertxHttpServerTest.groovy @@ -33,85 +33,85 @@ import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.QUER import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.REDIRECT import static io.opentelemetry.auto.test.base.HttpServerTest.ServerEndpoint.SUCCESS -class VertxHttpServerTest extends HttpServerTest { - public static final String CONFIG_HTTP_SERVER_PORT = "http.server.port" - - @Override - Vertx startServer(int port) { - def server = Vertx.vertx(new VertxOptions() - // Useful for debugging: - // .setBlockedThreadCheckInterval(Integer.MAX_VALUE) - .setClusterPort(port)) - final CompletableFuture future = new CompletableFuture<>() - server.deployVerticle(verticle().name, - new DeploymentOptions() - .setConfig(new JsonObject().put(CONFIG_HTTP_SERVER_PORT, port)) - .setInstances(3)) { res -> - if (!res.succeeded()) { - throw new RuntimeException("Cannot deploy server Verticle", res.cause()) - } - future.complete(null) - } - - future.get() - return server - } - - protected Class verticle() { - return VertxWebTestServer - } - - @Override - void stopServer(Vertx server) { - server.close() - } - - @Override - NettyHttpServerDecorator decorator() { - return NettyHttpServerDecorator.DECORATE - } - - @Override - boolean testExceptionBody() { - false - } - - static class VertxWebTestServer extends AbstractVerticle { +class VertxHttpServerTest extends HttpServerTest { + public static final String CONFIG_HTTP_SERVER_PORT = "http.server.port" @Override - void start(final Future startFuture) { - final int port = config().getInteger(CONFIG_HTTP_SERVER_PORT) - final Router router = Router.router(vertx) + Vertx startServer(int port) { + def server = Vertx.vertx(new VertxOptions() + // Useful for debugging: + // .setBlockedThreadCheckInterval(Integer.MAX_VALUE) + .setClusterPort(port)) + final CompletableFuture future = new CompletableFuture<>() + server.deployVerticle(verticle().name, + new DeploymentOptions() + .setConfig(new JsonObject().put(CONFIG_HTTP_SERVER_PORT, port)) + .setInstances(3)) { res -> + if (!res.succeeded()) { + throw new RuntimeException("Cannot deploy server Verticle", res.cause()) + } + future.complete(null) + } - router.route(SUCCESS.path).handler { ctx -> - controller(SUCCESS) { - ctx.response().setStatusCode(SUCCESS.status).end(SUCCESS.body) - } - } - router.route(QUERY_PARAM.path).handler { ctx -> - controller(QUERY_PARAM) { - ctx.response().setStatusCode(QUERY_PARAM.status).end(ctx.request().query()) - } - } - router.route(REDIRECT.path).handler { ctx -> - controller(REDIRECT) { - ctx.response().setStatusCode(REDIRECT.status).putHeader("location", REDIRECT.body).end() - } - } - router.route(ERROR.path).handler { ctx -> - controller(ERROR) { - ctx.response().setStatusCode(ERROR.status).end(ERROR.body) - } - } - router.route(EXCEPTION.path).handler { ctx -> - controller(EXCEPTION) { - throw new Exception(EXCEPTION.body) - } - } - - vertx.createHttpServer() - .requestHandler { router.accept(it) } - .listen(port) { startFuture.complete() } + future.get() + return server + } + + protected Class verticle() { + return VertxWebTestServer + } + + @Override + void stopServer(Vertx server) { + server.close() + } + + @Override + String component() { + return NettyHttpServerDecorator.DECORATE.getComponentName() + } + + @Override + boolean testExceptionBody() { + false + } + + static class VertxWebTestServer extends AbstractVerticle { + + @Override + void start(final Future startFuture) { + final int port = config().getInteger(CONFIG_HTTP_SERVER_PORT) + final Router router = Router.router(vertx) + + router.route(SUCCESS.path).handler { ctx -> + controller(SUCCESS) { + ctx.response().setStatusCode(SUCCESS.status).end(SUCCESS.body) + } + } + router.route(QUERY_PARAM.path).handler { ctx -> + controller(QUERY_PARAM) { + ctx.response().setStatusCode(QUERY_PARAM.status).end(ctx.request().query()) + } + } + router.route(REDIRECT.path).handler { ctx -> + controller(REDIRECT) { + ctx.response().setStatusCode(REDIRECT.status).putHeader("location", REDIRECT.body).end() + } + } + router.route(ERROR.path).handler { ctx -> + controller(ERROR) { + ctx.response().setStatusCode(ERROR.status).end(ERROR.body) + } + } + router.route(EXCEPTION.path).handler { ctx -> + controller(EXCEPTION) { + throw new Exception(EXCEPTION.body) + } + } + + vertx.createHttpServer() + .requestHandler { router.accept(it) } + .listen(port) { startFuture.complete() } + } } - } } diff --git a/instrumentation/vertx-testing/vertx-testing.gradle b/instrumentation/vertx-testing/vertx-testing.gradle index 5a5b2479ba..bc18c09a17 100644 --- a/instrumentation/vertx-testing/vertx-testing.gradle +++ b/instrumentation/vertx-testing/vertx-testing.gradle @@ -19,7 +19,6 @@ dependencies { // compileOnly group: 'io.vertx', name: 'vertx-web', version: '3.5.0' testCompile project(':instrumentation:netty:netty-4.1') - testCompile project(':instrumentation:java-concurrent') testCompile project(':instrumentation:trace-annotation') // Tests seem to fail before 3.5... maybe a problem with some of the tests? diff --git a/settings.gradle b/settings.gradle index 9211c99a93..9df49f3b39 100644 --- a/settings.gradle +++ b/settings.gradle @@ -46,7 +46,7 @@ include ':smoke-tests:springboot' // instrumentation: include ':instrumentation:akka-http-10.0' include ':instrumentation:apache-httpasyncclient-4.0' -include ':instrumentation:apache-httpclient:apache-httpclient-3.0' +include ':instrumentation:apache-httpclient:apache-httpclient-2.0' include ':instrumentation:apache-httpclient:apache-httpclient-4.0' include ':instrumentation:aws-sdk:aws-sdk-1.11' include ':instrumentation:aws-sdk:aws-sdk-2.2' @@ -118,6 +118,7 @@ include ':instrumentation:play:play-2.6' include ':instrumentation:play-ws:play-ws-1.0' include ':instrumentation:play-ws:play-ws-2.0' include ':instrumentation:play-ws:play-ws-2.1' +include ':instrumentation:play-ws:play-ws-common' include ':instrumentation:rabbitmq-amqp-2.7' include ':instrumentation:ratpack-1.4' include ':instrumentation:reactor-3.1' diff --git a/smoke-tests/wildfly/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy b/smoke-tests/wildfly/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy index 9b5597dc5d..636d68d97b 100644 --- a/smoke-tests/wildfly/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy +++ b/smoke-tests/wildfly/src/test/groovy/io/opentelemetry/smoketest/WildflySmokeTest.groovy @@ -17,8 +17,10 @@ package io.opentelemetry.smoketest import io.opentelemetry.auto.test.utils.PortUtils import okhttp3.Request +import spock.lang.Retry import spock.lang.Shared +@Retry(delay = 20) class WildflySmokeTest extends AbstractServerSmokeTest { @Shared diff --git a/testing/src/main/groovy/io/opentelemetry/auto/test/asserts/TagsAssert.groovy b/testing/src/main/groovy/io/opentelemetry/auto/test/asserts/TagsAssert.groovy index e1d4eeab8d..333f6649b0 100644 --- a/testing/src/main/groovy/io/opentelemetry/auto/test/asserts/TagsAssert.groovy +++ b/testing/src/main/groovy/io/opentelemetry/auto/test/asserts/TagsAssert.groovy @@ -24,6 +24,7 @@ import java.util.regex.Pattern class TagsAssert { private final Map tags private final Set assertedTags = new TreeSet<>() + private final Set ignoredTags = ["slow.stack"] // Don't error if this tag isn't checked. private TagsAssert(attributes) { this.tags = attributes @@ -84,6 +85,7 @@ class TagsAssert { void assertTagsAllVerified() { def set = new TreeMap<>(tags).keySet() set.removeAll(assertedTags) + set.removeAll(ignoredTags) // The primary goal is to ensure the set is empty. // tags and assertedTags are included via an "always true" comparison // so they provide better context in the error message. diff --git a/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpClientTest.groovy b/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpClientTest.groovy index 55810fab1f..88de07d24e 100644 --- a/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpClientTest.groovy +++ b/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpClientTest.groovy @@ -15,8 +15,8 @@ */ package io.opentelemetry.auto.test.base +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpClientDecorator import io.opentelemetry.auto.config.Config -import io.opentelemetry.auto.decorator.HttpClientDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags @@ -39,7 +39,7 @@ import static io.opentelemetry.trace.Span.Kind.SERVER import static org.junit.Assume.assumeTrue @Unroll -abstract class HttpClientTest extends AgentTestRunner { +abstract class HttpClientTest extends AgentTestRunner { protected static final BODY_METHODS = ["POST", "PUT"] @AutoCleanup @@ -72,7 +72,7 @@ abstract class HttpClientTest extends Age } @Shared - DECORATOR clientDecorator = decorator() + String component = component() /** * Make the request and return the status code response @@ -81,7 +81,7 @@ abstract class HttpClientTest extends Age */ abstract int doRequest(String method, URI uri, Map headers = [:], Closure callback = null) - abstract DECORATOR decorator() + abstract String component() Integer statusOnRedirectError() { return null @@ -180,6 +180,9 @@ abstract class HttpClientTest extends Age } def "trace request with callback and parent"() { + given: + assumeTrue(testCallbackWithParent()) + when: def status = runUnderTrace("parent") { doRequest(method, server.address.resolve("/success"), ["is-test-server": "false"]) { @@ -339,7 +342,7 @@ abstract class HttpClientTest extends Age tags { "$MoreTags.SERVICE_NAME" renameService ? "localhost" : null "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_CLIENT - "$Tags.COMPONENT" clientDecorator.getComponentName() + "$Tags.COMPONENT" component "$MoreTags.NET_PEER_NAME" "localhost" "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional "$MoreTags.NET_PEER_PORT" uri.port @@ -394,6 +397,12 @@ abstract class HttpClientTest extends Age true } + boolean testCallbackWithParent() { + // FIXME: this hack is here because callback with parent is broken in play-ws when the stream() + // function is used. There is no way to stop a test from a derived class hence the flag + true + } + URI removeFragment(URI uri) { return new URI(uri.scheme, null, uri.host, uri.port, uri.path, uri.query, null) } diff --git a/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTest.groovy b/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTest.groovy index 2019c1e489..400e52983b 100644 --- a/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTest.groovy +++ b/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTest.groovy @@ -15,7 +15,7 @@ */ package io.opentelemetry.auto.test.base -import io.opentelemetry.auto.decorator.HttpServerDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.HttpServerDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.instrumentation.api.SpanTypes import io.opentelemetry.auto.instrumentation.api.Tags @@ -47,7 +47,7 @@ import static io.opentelemetry.auto.test.utils.TraceUtils.runUnderTrace import static org.junit.Assume.assumeTrue @Unroll -abstract class HttpServerTest extends AgentTestRunner { +abstract class HttpServerTest extends AgentTestRunner { @Shared SERVER server @@ -63,7 +63,7 @@ abstract class HttpServerTest ext } @Shared - DECORATOR serverDecorator = decorator() + String component = component() def setupSpec() { server = startServer(port) @@ -84,7 +84,7 @@ abstract class HttpServerTest ext abstract void stopServer(SERVER server) - abstract DECORATOR decorator() + abstract String component() String expectedOperationName(String method) { return method != null ? "HTTP $method" : HttpServerDecorator.DEFAULT_SPAN_NAME @@ -98,10 +98,6 @@ abstract class HttpServerTest ext false } - boolean hasDispatchSpan(ServerEndpoint endpoint) { - false - } - boolean redirectHasBody() { false } @@ -354,9 +350,6 @@ abstract class HttpServerTest ext void assertTheTraces(int size, String traceID = null, String parentID = null, String method = "GET", ServerEndpoint endpoint = SUCCESS, String errorMessage = null) { def spanCount = 1 // server span - if (hasDispatchSpan(endpoint)) { - spanCount++ - } if (hasHandlerSpan()) { spanCount++ } @@ -374,14 +367,11 @@ abstract class HttpServerTest ext trace(it * 2 + 1, spanCount) { def spanIndex = 0 serverSpan(it, spanIndex++, traceID, parentID, method, endpoint) - if (hasDispatchSpan(endpoint)) { - dispatchSpan(it, spanIndex++, span(0), method, endpoint) - } if (hasHandlerSpan()) { handlerSpan(it, spanIndex++, span(0), method, endpoint) } if (endpoint != NOT_FOUND) { - if (hasHandlerSpan() || hasDispatchSpan(endpoint)) { // currently there are no tests which have both + if (hasHandlerSpan()) { controllerSpan(it, spanIndex++, span(1), errorMessage) } else { controllerSpan(it, spanIndex++, span(0), errorMessage) @@ -416,10 +406,6 @@ abstract class HttpServerTest ext throw new UnsupportedOperationException("renderSpan not implemented in " + getClass().name) } - void dispatchSpan(TraceAssert trace, int index, Object parent, String method = "GET", ServerEndpoint endpoint = SUCCESS) { - throw new UnsupportedOperationException("dispatchSpan not implemented in " + getClass().name) - } - // parent span must be cast otherwise it breaks debugging classloading (junit loads it early) void serverSpan(TraceAssert trace, int index, String traceID = null, String parentID = null, String method = "GET", ServerEndpoint endpoint = SUCCESS) { trace.span(index) { @@ -434,7 +420,7 @@ abstract class HttpServerTest ext } tags { "$MoreTags.SPAN_TYPE" SpanTypes.HTTP_SERVER - "$Tags.COMPONENT" serverDecorator.getComponentName() + "$Tags.COMPONENT" component "$MoreTags.NET_PEER_PORT" Long "$MoreTags.NET_PEER_IP" { it == null || it == "127.0.0.1" } // Optional "$Tags.HTTP_URL" { it == "${endpoint.resolve(address)}" || it == "${endpoint.resolveWithoutFragment(address)}" } diff --git a/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTestAdvice.java b/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTestAdvice.java index 244349ab26..e9b920ef37 100644 --- a/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTestAdvice.java +++ b/testing/src/main/groovy/io/opentelemetry/auto/test/base/HttpServerTestAdvice.java @@ -46,7 +46,7 @@ public abstract class HttpServerTestAdvice { } } - @Advice.OnMethodExit(onThrowable = Throwable.class) + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit(@Advice.Enter final SpanWithScope spanWithScope) { if (spanWithScope != null) { spanWithScope.getSpan().end(); diff --git a/testing/src/main/groovy/io/opentelemetry/auto/test/utils/TraceUtils.groovy b/testing/src/main/groovy/io/opentelemetry/auto/test/utils/TraceUtils.groovy index 2b62bfa492..c5fda50cf0 100644 --- a/testing/src/main/groovy/io/opentelemetry/auto/test/utils/TraceUtils.groovy +++ b/testing/src/main/groovy/io/opentelemetry/auto/test/utils/TraceUtils.groovy @@ -16,7 +16,7 @@ package io.opentelemetry.auto.test.utils import io.opentelemetry.OpenTelemetry -import io.opentelemetry.auto.decorator.BaseDecorator +import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator import io.opentelemetry.auto.instrumentation.api.MoreTags import io.opentelemetry.auto.test.asserts.TraceAssert import io.opentelemetry.context.Scope diff --git a/testing/src/test/groovy/server/ServerTest.groovy b/testing/src/test/groovy/server/ServerTest.groovy index 460c5eec08..26902bd6be 100644 --- a/testing/src/test/groovy/server/ServerTest.groovy +++ b/testing/src/test/groovy/server/ServerTest.groovy @@ -333,6 +333,60 @@ class ServerTest extends AgentTestRunner { server.stop() } + + def "calling send() twice is an error"() { + setup: + def server = httpServer { + handlers { + all { + response.send() + response.send() + } + } + } + + when: + def request = new Request.Builder() + .url("$server.address") + .get() + .build() + + def response = client.newCall(request).execute() + + then: + response.code() == 500 + response.message().startsWith("Server Error") + + cleanup: + server.stop() + } + + def "calling send() with null is an error"() { + setup: + def server = httpServer { + handlers { + all { + response.send(null) + } + } + } + + when: + def request = new Request.Builder() + .url("$server.address") + .get() + .build() + + def response = client.newCall(request).execute() + + then: + response.code() == 500 + response.message().startsWith("Server Error") + + cleanup: + server.stop() + } + def body() { return new MultipartBody.Builder().addFormDataPart("key", "value").build() } diff --git a/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/CommonTaskExecutor.java b/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/CommonTaskExecutor.java index 2172d6a027..8547c49108 100644 --- a/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/CommonTaskExecutor.java +++ b/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/CommonTaskExecutor.java @@ -81,7 +81,7 @@ public final class CommonTaskExecutor extends AbstractExecutorService { private final ScheduledExecutorService executorService; private ShutdownCallback(final ScheduledExecutorService executorService) { - super("dd-exec-shutdown-hook"); + super("agent-exec-shutdown-hook"); this.executorService = executorService; } diff --git a/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/DaemonThreadFactory.java b/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/DaemonThreadFactory.java index 80e316b775..69f758a809 100644 --- a/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/DaemonThreadFactory.java +++ b/utils/thread-utils/src/main/java/io/opentelemetry/auto/common/exec/DaemonThreadFactory.java @@ -19,11 +19,8 @@ import java.util.concurrent.ThreadFactory; /** A {@link ThreadFactory} implementation that starts all {@link Thread} as daemons. */ public final class DaemonThreadFactory implements ThreadFactory { - public static final DaemonThreadFactory TRACE_PROCESSOR = - new DaemonThreadFactory("dd-trace-processor"); - public static final DaemonThreadFactory TRACE_WRITER = new DaemonThreadFactory("dd-trace-writer"); public static final DaemonThreadFactory TASK_SCHEDULER = - new DaemonThreadFactory("dd-task-scheduler"); + new DaemonThreadFactory("agent-task-scheduler"); private final String threadName;