From 62bd2c03eb4481967ddefa29af019cf8a6665019 Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Tue, 12 Jan 2021 17:01:41 +0900 Subject: [PATCH] =?UTF-8?q?Update=20Armeria=20instrumentation=20to=20match?= =?UTF-8?q?=20latest=20decorator=20order=20and=20re=E2=80=A6=20(#2021)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update Armeria instrumentation to match latest decorator order and remove dedupe logic for now. * git add * Revert unused --- README.md | 2 +- .../v1_0/ArmeriaInstrumentationModule.java | 28 -------- .../ArmeriaServerBuilderInstrumentation.java | 71 ------------------- ...meriaNoDuplicateInstrumentationTest.groovy | 33 --------- .../javaagent/armeria-1.3-javaagent.gradle} | 9 +-- .../armeria/v1_3}/ArmeriaDecorators.java | 6 +- .../v1_3/ArmeriaInstrumentationModule.java | 34 +++++++++ .../ArmeriaServerBuilderInstrumentation.java} | 20 +++--- ...rmeriaWebClientBuilderInstrumentation.java | 2 +- .../armeria/v1_3}/ArmeriaTest.groovy | 4 +- .../library/armeria-1.3-library.gradle} | 4 +- .../v1_3}/client/ArmeriaClientTracer.java | 2 +- .../v1_3}/client/OpenTelemetryClient.java | 2 +- .../v1_3}/server/ArmeriaServerTracer.java | 2 +- .../v1_3}/server/OpenTelemetryService.java | 2 +- .../armeria/v1_3}/ArmeriaTest.groovy | 6 +- .../testing/armeria-1.3-testing.gradle} | 4 +- .../armeria/v1_3}/AbstractArmeriaTest.groovy | 41 ++++++++++- settings.gradle | 6 +- 19 files changed, 109 insertions(+), 169 deletions(-) delete mode 100644 instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaInstrumentationModule.java delete mode 100644 instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerBuilderInstrumentation.java delete mode 100644 instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaNoDuplicateInstrumentationTest.groovy rename instrumentation/{armeria-1.0/javaagent/armeria-1.0-javaagent.gradle => armeria-1.3/javaagent/armeria-1.3-javaagent.gradle} (54%) rename instrumentation/{armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0 => armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3}/ArmeriaDecorators.java (79%) create mode 100644 instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java rename instrumentation/{armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerInstrumentation.java => armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaServerBuilderInstrumentation.java} (58%) rename instrumentation/{armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0 => armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3}/ArmeriaWebClientBuilderInstrumentation.java (97%) rename instrumentation/{armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0 => armeria-1.3/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_3}/ArmeriaTest.groovy (83%) rename instrumentation/{armeria-1.0/library/armeria-1.0-library.gradle => armeria-1.3/library/armeria-1.3-library.gradle} (70%) rename instrumentation/{armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0 => armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3}/client/ArmeriaClientTracer.java (97%) rename instrumentation/{armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0 => armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3}/client/OpenTelemetryClient.java (98%) rename instrumentation/{armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0 => armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3}/server/ArmeriaServerTracer.java (98%) rename instrumentation/{armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0 => armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3}/server/OpenTelemetryService.java (98%) rename instrumentation/{armeria-1.0/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_0 => armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3}/ArmeriaTest.groovy (80%) rename instrumentation/{armeria-1.0/testing/armeria-1.0-testing.gradle => armeria-1.3/testing/armeria-1.3-testing.gradle} (93%) rename instrumentation/{armeria-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_0 => armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3}/AbstractArmeriaTest.groovy (71%) diff --git a/README.md b/README.md index 709ad54089..11797881f2 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,7 @@ These are the supported libraries and frameworks: | [Akka HTTP](https://doc.akka.io/docs/akka-http/current/index.html) | 10.0+ | | [Apache HttpAsyncClient](https://hc.apache.org/index.html) | 4.1+ | | [Apache HttpClient](https://hc.apache.org/index.html) | 2.0+ | -| [Armeria](https://armeria.dev) | 0.99.8+ | +| [Armeria](https://armeria.dev) | 1.3+ | | [AsyncHttpClient](https://github.com/AsyncHttpClient/async-http-client) | 1.9+ (not including 2.x yet) | | [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/java-handler.html) | 1.0+ | | [AWS SDK](https://aws.amazon.com/sdk-for-java/) | 1.11.x and 2.2.0+ | diff --git a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaInstrumentationModule.java b/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaInstrumentationModule.java deleted file mode 100644 index a58c2c8134..0000000000 --- a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaInstrumentationModule.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0; - -import static java.util.Arrays.asList; - -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.InstrumentationModule; -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.List; - -@AutoService(InstrumentationModule.class) -public class ArmeriaInstrumentationModule extends InstrumentationModule { - public ArmeriaInstrumentationModule() { - super("armeria", "armeria-1.0"); - } - - @Override - public List typeInstrumentations() { - return asList( - new ArmeriaWebClientBuilderInstrumentation(), - new ArmeriaServerInstrumentation(), - new ArmeriaServerBuilderInstrumentation()); - } -} diff --git a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerBuilderInstrumentation.java b/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerBuilderInstrumentation.java deleted file mode 100644 index 9830ddbe89..0000000000 --- a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerBuilderInstrumentation.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0; - -import static net.bytebuddy.matcher.ElementMatchers.isConstructor; -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.takesArgument; - -import com.linecorp.armeria.server.ServerBuilder; -import io.opentelemetry.instrumentation.armeria.v1_0.server.OpenTelemetryService; -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Function; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -public class ArmeriaServerBuilderInstrumentation implements TypeInstrumentation { - - @Override - public ElementMatcher typeMatcher() { - return named("com.linecorp.armeria.server.ServerBuilder"); - } - - @Override - public Map, String> transformers() { - Map, String> transformers = new HashMap<>(); - transformers.put( - isConstructor(), - ArmeriaServerBuilderInstrumentation.class.getName() + "$ConstructorAdvice"); - transformers.put( - isMethod().and(isPublic()).and(named("decorator").and(takesArgument(0, Function.class))), - ArmeriaServerBuilderInstrumentation.class.getName() + "$SuppressDecoratorAdvice"); - return transformers; - } - - public static class ConstructorAdvice { - @Advice.OnMethodExit - public static void construct(@Advice.This ServerBuilder builder) { - builder.decorator(OpenTelemetryService.newDecorator()); - } - } - - // Intercept calls from app to register decorator and suppress them to avoid registering - // multiple decorators, one from user app and one from our auto instrumentation. Otherwise, we - // will end up with double telemetry. - // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/903 - public static class SuppressDecoratorAdvice { - @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) - public static boolean suppressDecorator(@Advice.Argument(0) Function decorator) { - return decorator != ArmeriaDecorators.SERVER_DECORATOR; - } - - @Advice.OnMethodExit - public static void handleSuppression( - @Advice.This ServerBuilder builder, - @Advice.Enter boolean suppressed, - @Advice.Return(readOnly = false) ServerBuilder returned) { - if (suppressed) { - returned = builder; - } - } - } -} diff --git a/instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaNoDuplicateInstrumentationTest.groovy b/instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaNoDuplicateInstrumentationTest.groovy deleted file mode 100644 index 3e0d42f8de..0000000000 --- a/instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaNoDuplicateInstrumentationTest.groovy +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0 - -import com.linecorp.armeria.client.WebClientBuilder -import com.linecorp.armeria.server.ServerBuilder -import io.opentelemetry.instrumentation.armeria.v1_0.AbstractArmeriaTest -import io.opentelemetry.instrumentation.armeria.v1_0.client.OpenTelemetryClient -import io.opentelemetry.instrumentation.armeria.v1_0.server.OpenTelemetryService -import io.opentelemetry.instrumentation.test.AgentTestTrait - -class ArmeriaNoDuplicateInstrumentationTest extends AbstractArmeriaTest implements AgentTestTrait { - @Override - ServerBuilder configureServer(ServerBuilder sb) { - return sb.decorator(OpenTelemetryService.newDecorator()) - } - - @Override - WebClientBuilder configureClient(WebClientBuilder clientBuilder) { - return clientBuilder.decorator(OpenTelemetryClient.newDecorator()) - } - - def childSetupSpec() { - server.before() - } - - def childCleanupSpec() { - server.after() - } -} diff --git a/instrumentation/armeria-1.0/javaagent/armeria-1.0-javaagent.gradle b/instrumentation/armeria-1.3/javaagent/armeria-1.3-javaagent.gradle similarity index 54% rename from instrumentation/armeria-1.0/javaagent/armeria-1.0-javaagent.gradle rename to instrumentation/armeria-1.3/javaagent/armeria-1.3-javaagent.gradle index ad37a906da..fc10d2b885 100644 --- a/instrumentation/armeria-1.0/javaagent/armeria-1.0-javaagent.gradle +++ b/instrumentation/armeria-1.3/javaagent/armeria-1.3-javaagent.gradle @@ -4,14 +4,15 @@ muzzle { pass { group = "com.linecorp.armeria" module = "armeria" - versions = "[0.99.8,)" + versions = "[1.3.0,)" + assertInverse = true } } dependencies { - implementation project(':instrumentation:armeria-1.0:library') + implementation project(':instrumentation:armeria-1.3:library') - library group: 'com.linecorp.armeria', name: 'armeria', version: '0.99.8' + library group: 'com.linecorp.armeria', name: 'armeria', version: '1.3.0' - testImplementation project(':instrumentation:armeria-1.0:testing') + testImplementation project(':instrumentation:armeria-1.3:testing') } diff --git a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaDecorators.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java similarity index 79% rename from instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaDecorators.java rename to instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java index 322d8216d3..93704af953 100644 --- a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaDecorators.java +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaDecorators.java @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0; +package io.opentelemetry.javaagent.instrumentation.armeria.v1_3; import com.linecorp.armeria.client.HttpClient; import com.linecorp.armeria.server.HttpService; -import io.opentelemetry.instrumentation.armeria.v1_0.client.OpenTelemetryClient; -import io.opentelemetry.instrumentation.armeria.v1_0.server.OpenTelemetryService; +import io.opentelemetry.instrumentation.armeria.v1_3.client.OpenTelemetryClient; +import io.opentelemetry.instrumentation.armeria.v1_3.server.OpenTelemetryService; import java.util.function.Function; // Holds singleton references to decorators to match against during suppression. diff --git a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java new file mode 100644 index 0000000000..e6f3d19a7c --- /dev/null +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.armeria.v1_3; + +import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class ArmeriaInstrumentationModule extends InstrumentationModule { + public ArmeriaInstrumentationModule() { + super("armeria", "armeria-1.3"); + } + + @Override + public ElementMatcher.Junction classLoaderMatcher() { + // Unrelated class which was added in Armeria 1.3.0, the minimum version we support. + return hasClassesNamed("com.linecorp.armeria.server.metric.PrometheusExpositionServiceBuilder"); + } + + @Override + public List typeInstrumentations() { + return asList( + new ArmeriaWebClientBuilderInstrumentation(), new ArmeriaServerBuilderInstrumentation()); + } +} diff --git a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerInstrumentation.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaServerBuilderInstrumentation.java similarity index 58% rename from instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerInstrumentation.java rename to instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaServerBuilderInstrumentation.java index e9efad9b15..7bf18c45c5 100644 --- a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaServerInstrumentation.java +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaServerBuilderInstrumentation.java @@ -3,11 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0; +package io.opentelemetry.javaagent.instrumentation.armeria.v1_3; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.isStatic; import static net.bytebuddy.matcher.ElementMatchers.named; import com.linecorp.armeria.server.ServerBuilder; @@ -19,23 +18,24 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -public class ArmeriaServerInstrumentation implements TypeInstrumentation { +public class ArmeriaServerBuilderInstrumentation implements TypeInstrumentation { + @Override public ElementMatcher typeMatcher() { - return named("com.linecorp.armeria.server.Server"); + return named("com.linecorp.armeria.server.ServerBuilder"); } @Override public Map, String> transformers() { return Collections.singletonMap( - isMethod().and(isPublic()).and(isStatic()).and(named("builder")), - ArmeriaServerInstrumentation.class.getName() + "$AddDecoratorAdvice"); + isMethod().and(isPublic()).and(named("build")), + ArmeriaServerBuilderInstrumentation.class.getName() + "$BuildAdvice"); } - public static class AddDecoratorAdvice { - @Advice.OnMethodExit - public static void addDecorator(@Advice.Return ServerBuilder sb) { - sb.decorator(ArmeriaDecorators.SERVER_DECORATOR); + public static class BuildAdvice { + @Advice.OnMethodEnter + public static void onEnter(@Advice.This ServerBuilder builder) { + builder.decorator(ArmeriaDecorators.SERVER_DECORATOR); } } } diff --git a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaWebClientBuilderInstrumentation.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaWebClientBuilderInstrumentation.java similarity index 97% rename from instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaWebClientBuilderInstrumentation.java rename to instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaWebClientBuilderInstrumentation.java index 258538694c..ea7b2ad958 100644 --- a/instrumentation/armeria-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaWebClientBuilderInstrumentation.java +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaWebClientBuilderInstrumentation.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0; +package io.opentelemetry.javaagent.instrumentation.armeria.v1_3; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; diff --git a/instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaTest.groovy b/instrumentation/armeria-1.3/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaTest.groovy similarity index 83% rename from instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaTest.groovy rename to instrumentation/armeria-1.3/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaTest.groovy index e24d6c0473..27a6665647 100644 --- a/instrumentation/armeria-1.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_0/ArmeriaTest.groovy +++ b/instrumentation/armeria-1.3/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaTest.groovy @@ -3,11 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.javaagent.instrumentation.armeria.v1_0 +package io.opentelemetry.javaagent.instrumentation.armeria.v1_3 import com.linecorp.armeria.client.WebClientBuilder import com.linecorp.armeria.server.ServerBuilder -import io.opentelemetry.instrumentation.armeria.v1_0.AbstractArmeriaTest +import io.opentelemetry.instrumentation.armeria.v1_3.AbstractArmeriaTest import io.opentelemetry.instrumentation.test.AgentTestTrait class ArmeriaTest extends AbstractArmeriaTest implements AgentTestTrait { diff --git a/instrumentation/armeria-1.0/library/armeria-1.0-library.gradle b/instrumentation/armeria-1.3/library/armeria-1.3-library.gradle similarity index 70% rename from instrumentation/armeria-1.0/library/armeria-1.0-library.gradle rename to instrumentation/armeria-1.3/library/armeria-1.3-library.gradle index 7af95f4a68..7e15d729b5 100644 --- a/instrumentation/armeria-1.0/library/armeria-1.0-library.gradle +++ b/instrumentation/armeria-1.3/library/armeria-1.3-library.gradle @@ -2,7 +2,7 @@ apply from: "$rootDir/gradle/instrumentation-library.gradle" apply plugin: "net.ltgt.errorprone" dependencies { - library group: 'com.linecorp.armeria', name: 'armeria', version: '0.99.8' + library group: 'com.linecorp.armeria', name: 'armeria', version: '1.3.0' - testImplementation project(':instrumentation:armeria-1.0:testing') + testImplementation project(':instrumentation:armeria-1.3:testing') } diff --git a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/client/ArmeriaClientTracer.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/client/ArmeriaClientTracer.java similarity index 97% rename from instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/client/ArmeriaClientTracer.java rename to instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/client/ArmeriaClientTracer.java index 6c254b4801..b77a72c762 100644 --- a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/client/ArmeriaClientTracer.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/client/ArmeriaClientTracer.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.armeria.v1_0.client; +package io.opentelemetry.instrumentation.armeria.v1_3.client; import com.linecorp.armeria.client.ClientRequestContext; import com.linecorp.armeria.common.HttpRequest; diff --git a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/client/OpenTelemetryClient.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/client/OpenTelemetryClient.java similarity index 98% rename from instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/client/OpenTelemetryClient.java rename to instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/client/OpenTelemetryClient.java index 9fb0e63749..33d9b0846a 100644 --- a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/client/OpenTelemetryClient.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/client/OpenTelemetryClient.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.armeria.v1_0.client; +package io.opentelemetry.instrumentation.armeria.v1_3.client; import com.linecorp.armeria.client.ClientRequestContext; import com.linecorp.armeria.client.HttpClient; diff --git a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/server/ArmeriaServerTracer.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/server/ArmeriaServerTracer.java similarity index 98% rename from instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/server/ArmeriaServerTracer.java rename to instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/server/ArmeriaServerTracer.java index 70cdb45a66..1de23bc20d 100644 --- a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/server/ArmeriaServerTracer.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/server/ArmeriaServerTracer.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.armeria.v1_0.server; +package io.opentelemetry.instrumentation.armeria.v1_3.server; import com.linecorp.armeria.common.HttpRequest; import com.linecorp.armeria.common.logging.RequestLog; diff --git a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/server/OpenTelemetryService.java b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/server/OpenTelemetryService.java similarity index 98% rename from instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/server/OpenTelemetryService.java rename to instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/server/OpenTelemetryService.java index 636eed5772..15448aab6d 100644 --- a/instrumentation/armeria-1.0/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_0/server/OpenTelemetryService.java +++ b/instrumentation/armeria-1.3/library/src/main/java/io/opentelemetry/instrumentation/armeria/v1_3/server/OpenTelemetryService.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.armeria.v1_0.server; +package io.opentelemetry.instrumentation.armeria.v1_3.server; import com.linecorp.armeria.common.HttpRequest; import com.linecorp.armeria.common.HttpResponse; diff --git a/instrumentation/armeria-1.0/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_0/ArmeriaTest.groovy b/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTest.groovy similarity index 80% rename from instrumentation/armeria-1.0/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_0/ArmeriaTest.groovy rename to instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTest.groovy index 5cfc6fab7f..32fd4c2d88 100644 --- a/instrumentation/armeria-1.0/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_0/ArmeriaTest.groovy +++ b/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaTest.groovy @@ -3,12 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.armeria.v1_0 +package io.opentelemetry.instrumentation.armeria.v1_3 import com.linecorp.armeria.client.WebClientBuilder import com.linecorp.armeria.server.ServerBuilder -import io.opentelemetry.instrumentation.armeria.v1_0.client.OpenTelemetryClient -import io.opentelemetry.instrumentation.armeria.v1_0.server.OpenTelemetryService +import io.opentelemetry.instrumentation.armeria.v1_3.client.OpenTelemetryClient +import io.opentelemetry.instrumentation.armeria.v1_3.server.OpenTelemetryService import io.opentelemetry.instrumentation.test.InstrumentationTestTrait class ArmeriaTest extends AbstractArmeriaTest implements InstrumentationTestTrait { diff --git a/instrumentation/armeria-1.0/testing/armeria-1.0-testing.gradle b/instrumentation/armeria-1.3/testing/armeria-1.3-testing.gradle similarity index 93% rename from instrumentation/armeria-1.0/testing/armeria-1.0-testing.gradle rename to instrumentation/armeria-1.3/testing/armeria-1.3-testing.gradle index 9d6c8b29b1..5ea3416ece 100644 --- a/instrumentation/armeria-1.0/testing/armeria-1.0-testing.gradle +++ b/instrumentation/armeria-1.3/testing/armeria-1.3-testing.gradle @@ -3,8 +3,8 @@ apply from: "$rootDir/gradle/java.gradle" dependencies { api project(':testing-common') - api group: 'com.linecorp.armeria', name: 'armeria', version: '0.99.8' - api group: 'com.linecorp.armeria', name: 'armeria-junit4', version: '0.99.8' + api group: 'com.linecorp.armeria', name: 'armeria', version: '1.3.0' + api group: 'com.linecorp.armeria', name: 'armeria-junit4', version: '1.3.0' implementation deps.guava diff --git a/instrumentation/armeria-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_0/AbstractArmeriaTest.groovy b/instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaTest.groovy similarity index 71% rename from instrumentation/armeria-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_0/AbstractArmeriaTest.groovy rename to instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaTest.groovy index 8da528b3f3..4416dd423f 100644 --- a/instrumentation/armeria-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_0/AbstractArmeriaTest.groovy +++ b/instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaTest.groovy @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.armeria.v1_0 +package io.opentelemetry.instrumentation.armeria.v1_3 import static io.opentelemetry.api.trace.Span.Kind.CLIENT import static io.opentelemetry.api.trace.Span.Kind.SERVER @@ -14,10 +14,15 @@ import com.linecorp.armeria.common.HttpMethod import com.linecorp.armeria.common.HttpRequest import com.linecorp.armeria.common.HttpResponse import com.linecorp.armeria.common.HttpStatus +import com.linecorp.armeria.server.DecoratingHttpServiceFunction +import com.linecorp.armeria.server.HttpService import com.linecorp.armeria.server.ServerBuilder +import com.linecorp.armeria.server.ServiceRequestContext import com.linecorp.armeria.testing.junit4.server.ServerRule +import io.opentelemetry.api.trace.Span import io.opentelemetry.api.trace.attributes.SemanticAttributes import io.opentelemetry.instrumentation.test.InstrumentationSpecification +import java.util.function.Function import spock.lang.Shared import spock.lang.Unroll @@ -34,11 +39,41 @@ abstract class AbstractArmeriaTest extends InstrumentationSpecification { protected ServerRule server = new ServerRule() { @Override protected void configure(ServerBuilder sb) throws Exception { - sb = configureServer(sb) sb.service("/exact", { ctx, req -> HttpResponse.of(HttpStatus.OK) }) sb.service("/items/{itemsId}", { ctx, req -> HttpResponse.of(HttpStatus.OK) }) sb.service("/httperror", { ctx, req -> HttpResponse.of(HttpStatus.NOT_IMPLEMENTED) }) sb.service("/exception", { ctx, req -> throw new IllegalStateException("illegal") }) + + // Make sure user decorators see spans. + sb.decorator(new DecoratingHttpServiceFunction() { + @Override + HttpResponse serve(HttpService delegate, ServiceRequestContext ctx, HttpRequest req) throws Exception { + if (!Span.current().spanContext.isValid()) { + // Return an invalid code to fail any assertion + return HttpResponse.of(600) + } + ctx.addAdditionalResponseHeader("decoratinghttpservicefunction", "ok") + return delegate.serve(ctx, req) + } + }) + sb.decorator(new Function() { + @Override + HttpService apply(HttpService delegate) { + return new HttpService() { + @Override + HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception { + if (!Span.current().spanContext.isValid()) { + // Return an invalid code to fail any assertion + return HttpResponse.of(601) + } + ctx.addAdditionalResponseHeader("decoratingfunction", "ok") + return delegate.serve(ctx, req) + } + } + } + }) + + sb = configureServer(sb) } } @@ -47,6 +82,8 @@ abstract class AbstractArmeriaTest extends InstrumentationSpecification { def "HTTP #method #path"() { when: def response = client.execute(HttpRequest.of(method, path)).aggregate().join() + response.headers().get("decoratinghttpservicefunction") == "ok" + response.headers().get("decoratingfunction") == "ok" then: response.status().code() == code diff --git a/settings.gradle b/settings.gradle index 2564a81ec8..9c3c7780dd 100644 --- a/settings.gradle +++ b/settings.gradle @@ -60,9 +60,9 @@ include ':instrumentation:apache-camel-2.20:javaagent' include ':instrumentation:apache-httpasyncclient-4.1:javaagent' include ':instrumentation:apache-httpclient:apache-httpclient-2.0:javaagent' include ':instrumentation:apache-httpclient:apache-httpclient-4.0:javaagent' -include ':instrumentation:armeria-1.0:javaagent' -include ':instrumentation:armeria-1.0:library' -include ':instrumentation:armeria-1.0:testing' +include ':instrumentation:armeria-1.3:javaagent' +include ':instrumentation:armeria-1.3:library' +include ':instrumentation:armeria-1.3:testing' include ':instrumentation:async-http-client-1.9:javaagent' include ':instrumentation:aws-lambda-1.0:javaagent' include ':instrumentation:aws-lambda-1.0:library'