From bcbb1e8fe5ab53190e757e35f819fd90bb3e93b6 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Fri, 12 May 2023 22:41:50 +0300 Subject: [PATCH 1/3] Add instrumentation for quarkus-resteasy-reactive --- .../common-testing/build.gradle.kts | 7 ++ .../reactive/AbstractQuarkusJaxRsTest.java | 99 +++++++++++++++++++ .../javaagent/build.gradle.kts | 16 +++ .../InvocationHandlerInstrumentation.java | 40 ++++++++ ...ResteasyReactiveInstrumentationModule.java | 26 +++++ .../reactive/ResteasyReactiveSpanName.java | 59 +++++++++++ .../quarkus2-testing/build.gradle.kts | 29 ++++++ .../reactive/v2_0/GreetingResource.java | 24 +++++ .../v2_0/SubResourceLocatorTestResource.java | 26 +++++ .../reactive/v2_0/TestRootResource.java | 19 ++++ .../src/main/resources/application.properties | 1 + .../reactive/v2_0/QuarkusJaxRsTest.java | 12 +++ .../quarkus3-testing/build.gradle.kts | 29 ++++++ .../reactive/v3_0/GreetingResource.java | 24 +++++ .../v3_0/SubResourceLocatorTestResource.java | 26 +++++ .../reactive/v3_0/TestRootResource.java | 19 ++++ .../src/main/resources/application.properties | 1 + .../reactive/v3_0/QuarkusJaxRsTest.java | 12 +++ settings.gradle.kts | 4 + 19 files changed, 473 insertions(+) create mode 100644 instrumentation/quarkus-resteasy-reactive/common-testing/build.gradle.kts create mode 100644 instrumentation/quarkus-resteasy-reactive/common-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/AbstractQuarkusJaxRsTest.java create mode 100644 instrumentation/quarkus-resteasy-reactive/javaagent/build.gradle.kts create mode 100644 instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/InvocationHandlerInstrumentation.java create mode 100644 instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/QuarkusResteasyReactiveInstrumentationModule.java create mode 100644 instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/GreetingResource.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/SubResourceLocatorTestResource.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/TestRootResource.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/resources/application.properties create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/QuarkusJaxRsTest.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/GreetingResource.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/SubResourceLocatorTestResource.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/TestRootResource.java create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/resources/application.properties create mode 100644 instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/QuarkusJaxRsTest.java diff --git a/instrumentation/quarkus-resteasy-reactive/common-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/common-testing/build.gradle.kts new file mode 100644 index 000000000000..023a880876af --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/common-testing/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("otel.java-conventions") +} + +dependencies { + implementation(project(":testing-common")) +} diff --git a/instrumentation/quarkus-resteasy-reactive/common-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/AbstractQuarkusJaxRsTest.java b/instrumentation/quarkus-resteasy-reactive/common-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/AbstractQuarkusJaxRsTest.java new file mode 100644 index 000000000000..058a2c3e1608 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/common-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/AbstractQuarkusJaxRsTest.java @@ -0,0 +1,99 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive; + +import static org.assertj.core.api.Assertions.assertThat; + +import io.opentelemetry.api.trace.SpanKind; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.testing.internal.armeria.client.ClientFactory; +import io.opentelemetry.testing.internal.armeria.client.WebClient; +import io.opentelemetry.testing.internal.armeria.client.logging.LoggingClient; +import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpRequest; +import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpMethod; +import java.time.Duration; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +public abstract class AbstractQuarkusJaxRsTest { + + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + private static WebClient client; + private static int port; + + @BeforeAll + static void setUp() { + client = + WebClient.builder() + .responseTimeout(Duration.ofMinutes(1)) + .writeTimeout(Duration.ofMinutes(1)) + .factory(ClientFactory.builder().connectTimeout(Duration.ofMinutes(1)).build()) + .decorator(LoggingClient.newDecorator()) + .build(); + port = Integer.parseInt(System.getProperty("quarkus.http.test-port")); + } + + private static AggregatedHttpResponse request(String path) { + AggregatedHttpRequest request = + AggregatedHttpRequest.of(HttpMethod.GET, "h1c://localhost:" + port + path); + return client.execute(request).aggregate().join(); + } + + @Test + void testPathOnMethod() { + AggregatedHttpResponse response = request("/test"); + assertThat(response.status().code()).isEqualTo(200); + assertThat(response.contentUtf8()).isEqualTo("success"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("GET /test").hasKind(SpanKind.SERVER))); + } + + @Test + void testPathOnClass() { + AggregatedHttpResponse response = request("/hello"); + assertThat(response.status().code()).isEqualTo(200); + assertThat(response.contentUtf8()).isEqualTo("hello"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("GET /hello").hasKind(SpanKind.SERVER))); + } + + @Test + void testPathParameter() { + AggregatedHttpResponse response = request("/hello/greeting/test"); + assertThat(response.status().code()).isEqualTo(200); + assertThat(response.contentUtf8()).isEqualTo("hello test"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("GET /hello/greeting/{name}").hasKind(SpanKind.SERVER))); + } + + @Test + void testSubResourceLocator() { + AggregatedHttpResponse response = request("/test-sub-resource-locator/call/sub"); + assertThat(response.status().code()).isEqualTo(200); + assertThat(response.contentUtf8()).isEqualTo("success"); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("GET /test-sub-resource-locator/call/sub") + .hasKind(SpanKind.SERVER))); + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/javaagent/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/javaagent/build.gradle.kts new file mode 100644 index 000000000000..656de8bce7d6 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/javaagent/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("otel.javaagent-instrumentation") +} + +muzzle { + pass { + group.set("io.quarkus") + module.set("quarkus-resteasy-reactive") + versions.set("(,)") + } +} + +dependencies { + compileOnly("io.quarkus:quarkus-resteasy-reactive:1.11.0.Final") + implementation(project(":instrumentation:jaxrs:jaxrs-common:javaagent")) +} diff --git a/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/InvocationHandlerInstrumentation.java b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/InvocationHandlerInstrumentation.java new file mode 100644 index 000000000000..204ac9eee860 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/InvocationHandlerInstrumentation.java @@ -0,0 +1,40 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.quarkus.resteasy.reactive; + +import static net.bytebuddy.matcher.ElementMatchers.named; + +import io.opentelemetry.context.Scope; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext; + +public class InvocationHandlerInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("org.jboss.resteasy.reactive.server.handlers.InvocationHandler"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod( + named("handle"), InvocationHandlerInstrumentation.class.getName() + "$HandleAdvice"); + } + + @SuppressWarnings("unused") + public static class HandleAdvice { + + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Argument(0) ResteasyReactiveRequestContext requestContext, + @Advice.Local("otelScope") Scope scope) { + ResteasyReactiveSpanName.INSTANCE.updateServerSpanName(requestContext); + } + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/QuarkusResteasyReactiveInstrumentationModule.java b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/QuarkusResteasyReactiveInstrumentationModule.java new file mode 100644 index 000000000000..ecc32a279d10 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/QuarkusResteasyReactiveInstrumentationModule.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.quarkus.resteasy.reactive; + +import static java.util.Collections.singletonList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class QuarkusResteasyReactiveInstrumentationModule extends InstrumentationModule { + + public QuarkusResteasyReactiveInstrumentationModule() { + super("quarkus", "jaxrs", "quarkus-resteasy-reactive", "quarkus-resteasy-reactive-3.0"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new InvocationHandlerInstrumentation()); + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java new file mode 100644 index 000000000000..62d825c19ac4 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java @@ -0,0 +1,59 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.quarkus.resteasy.reactive; + +import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath; + +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder; +import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import javax.annotation.Nullable; +import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext; +import org.jboss.resteasy.reactive.server.mapping.RuntimeResource; +import org.jboss.resteasy.reactive.server.mapping.URITemplate; + +public class ResteasyReactiveSpanName implements HttpRouteGetter { + // remember previous path to handle sub path locators + private static final VirtualField pathField = + VirtualField.find(ResteasyReactiveRequestContext.class, String.class); + + public static final ResteasyReactiveSpanName INSTANCE = new ResteasyReactiveSpanName(); + + public void updateServerSpanName(ResteasyReactiveRequestContext requestContext) { + Context context = Context.current(); + String jaxRsName = calculateJaxRsName(requestContext); + HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.NESTED_CONTROLLER, this, jaxRsName); + pathField.set(requestContext, jaxRsName); + } + + private static String calculateJaxRsName(ResteasyReactiveRequestContext requestContext) { + RuntimeResource target = requestContext.getTarget(); + URITemplate classPath = target.getClassPath(); + URITemplate path = target.getPath(); + String name = normalize(classPath) + normalize(path); + if (name.isEmpty()) { + return null; + } + String existingPath = pathField.get(requestContext); + return existingPath == null || existingPath.isEmpty() ? name : existingPath + name; + } + + @Override + @Nullable + public String get(Context context, String jaxRsName) { + return jaxRsName; + } + + private static String normalize(URITemplate uriTemplate) { + if (uriTemplate == null) { + return ""; + } + + return normalizePath(uriTemplate.template); + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts new file mode 100644 index 000000000000..46bd107c8eaa --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("otel.javaagent-testing") + + id("io.quarkus") version "2.16.7.Final" +} + +dependencies { + implementation(enforcedPlatform("io.quarkus.platform:quarkus-bom:2.16.7.Final")) + implementation("io.quarkus:quarkus-resteasy-reactive") + + testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) + testInstrumentation(project(":instrumentation:quarkus-resteasy-reactive:javaagent")) + + testImplementation(project(":instrumentation:quarkus-resteasy-reactive:common-testing")) + testImplementation("io.quarkus:quarkus-junit5") +} + +tasks.named("compileJava").configure { + dependsOn(tasks.named("compileQuarkusGeneratedSourcesJava")) +} +tasks.named("sourcesJar").configure { + dependsOn(tasks.named("compileQuarkusGeneratedSourcesJava")) +} +tasks.named("checkstyleTest").configure { + dependsOn(tasks.named("compileQuarkusGeneratedSourcesJava")) +} +tasks.named("compileTestJava").configure { + dependsOn(tasks.named("compileQuarkusTestGeneratedSourcesJava")) +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/GreetingResource.java b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/GreetingResource.java new file mode 100644 index 000000000000..ae1e21e6705f --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/GreetingResource.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v2_0; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/hello") +public class GreetingResource { + + @GET + @Path("/greeting/{name}") + public String greeting(String name) { + return "hello " + name; + } + + @GET + public String hello() { + return "hello"; + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/SubResourceLocatorTestResource.java b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/SubResourceLocatorTestResource.java new file mode 100644 index 000000000000..8f17929447de --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/SubResourceLocatorTestResource.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v2_0; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("test-sub-resource-locator") +public class SubResourceLocatorTestResource { + + @Path("call") + public Object call() { + return new SubResource(); + } + + public static class SubResource { + @Path("sub") + @GET + public String call() { + return "success"; + } + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/TestRootResource.java b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/TestRootResource.java new file mode 100644 index 000000000000..f7580362925a --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/TestRootResource.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v2_0; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("") +public class TestRootResource { + + @GET + @Path("test") + public String test() { + return "success"; + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/resources/application.properties b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/resources/application.properties new file mode 100644 index 000000000000..74870ba986cd --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/main/resources/application.properties @@ -0,0 +1 @@ +quarkus.http.test-port=0 diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/QuarkusJaxRsTest.java b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/QuarkusJaxRsTest.java new file mode 100644 index 000000000000..df7c7e83f57b --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v2_0/QuarkusJaxRsTest.java @@ -0,0 +1,12 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v2_0; + +import io.opentelemetry.instrumentation.quarkus.resteasy.reactive.AbstractQuarkusJaxRsTest; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +class QuarkusJaxRsTest extends AbstractQuarkusJaxRsTest {} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts new file mode 100644 index 000000000000..16b151b7744d --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + id("otel.javaagent-testing") + + id("io.quarkus") version "3.0.0.Final" +} + +// io.quarkus.platform:quarkus-bom is missing for 3.0.0.Final +var quarkusVersion = "3.0.1.Final" +if (findProperty("testLatestDeps") as Boolean) { + quarkusVersion = "+" +} + +dependencies { + implementation(enforcedPlatform("io.quarkus.platform:quarkus-bom:$quarkusVersion")) + implementation("io.quarkus:quarkus-resteasy-reactive") + + testInstrumentation(project(":instrumentation:netty:netty-4.1:javaagent")) + testInstrumentation(project(":instrumentation:quarkus-resteasy-reactive:javaagent")) + + testImplementation(project(":instrumentation:quarkus-resteasy-reactive:common-testing")) + testImplementation("io.quarkus:quarkus-junit5") +} + +tasks.named("compileJava").configure { + dependsOn(tasks.named("compileQuarkusGeneratedSourcesJava")) +} +tasks.named("sourcesJar").configure { + dependsOn(tasks.named("compileQuarkusGeneratedSourcesJava")) +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/GreetingResource.java b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/GreetingResource.java new file mode 100644 index 000000000000..927e11e2e6c4 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/GreetingResource.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v3_0; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@Path("/hello") +public class GreetingResource { + + @GET + @Path("/greeting/{name}") + public String greeting(String name) { + return "hello " + name; + } + + @GET + public String hello() { + return "hello"; + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/SubResourceLocatorTestResource.java b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/SubResourceLocatorTestResource.java new file mode 100644 index 000000000000..a83ca230f064 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/SubResourceLocatorTestResource.java @@ -0,0 +1,26 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v3_0; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@Path("test-sub-resource-locator") +public class SubResourceLocatorTestResource { + + @Path("call") + public Object call() { + return new SubResource(); + } + + public static class SubResource { + @Path("sub") + @GET + public String call() { + return "success"; + } + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/TestRootResource.java b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/TestRootResource.java new file mode 100644 index 000000000000..1b2c2d3971dc --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/TestRootResource.java @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v3_0; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +@Path("") +public class TestRootResource { + + @GET + @Path("test") + public String test() { + return "success"; + } +} diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/resources/application.properties b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/resources/application.properties new file mode 100644 index 000000000000..74870ba986cd --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/main/resources/application.properties @@ -0,0 +1 @@ +quarkus.http.test-port=0 diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/QuarkusJaxRsTest.java b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/QuarkusJaxRsTest.java new file mode 100644 index 000000000000..2ca9063721b9 --- /dev/null +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/src/test/java/io/opentelemetry/instrumentation/quarkus/resteasy/reactive/v3_0/QuarkusJaxRsTest.java @@ -0,0 +1,12 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.quarkus.resteasy.reactive.v3_0; + +import io.opentelemetry.instrumentation.quarkus.resteasy.reactive.AbstractQuarkusJaxRsTest; +import io.quarkus.test.junit.QuarkusTest; + +@QuarkusTest +class QuarkusJaxRsTest extends AbstractQuarkusJaxRsTest {} diff --git a/settings.gradle.kts b/settings.gradle.kts index 07dae712ce10..7039e21f8d75 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -454,6 +454,10 @@ hideFromDependabot(":instrumentation:rxjava:rxjava-3.1.1:library") hideFromDependabot(":instrumentation:rxjava:rxjava-3.1.1:javaagent") hideFromDependabot(":instrumentation:rxjava:rxjava-3-common:library") hideFromDependabot(":instrumentation:rxjava:rxjava-3-common:testing") +hideFromDependabot(":instrumentation:quarkus-resteasy-reactive:javaagent") +hideFromDependabot(":instrumentation:quarkus-resteasy-reactive:common-testing") +hideFromDependabot(":instrumentation:quarkus-resteasy-reactive:quarkus2-testing") +hideFromDependabot(":instrumentation:quarkus-resteasy-reactive:quarkus3-testing") hideFromDependabot(":instrumentation:scala-fork-join-2.8:javaagent") hideFromDependabot(":instrumentation:servlet:servlet-common:bootstrap") hideFromDependabot(":instrumentation:servlet:servlet-common:javaagent") From 5582f6751edbaa73e1cf88b0e7e58aa50d10ed02 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Sat, 13 May 2023 00:11:08 +0300 Subject: [PATCH 2/3] set min java version to 11 --- .../quarkus2-testing/build.gradle.kts | 4 ++++ .../quarkus3-testing/build.gradle.kts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts index 46bd107c8eaa..cad9462ca63d 100644 --- a/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts +++ b/instrumentation/quarkus-resteasy-reactive/quarkus2-testing/build.gradle.kts @@ -4,6 +4,10 @@ plugins { id("io.quarkus") version "2.16.7.Final" } +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_11) +} + dependencies { implementation(enforcedPlatform("io.quarkus.platform:quarkus-bom:2.16.7.Final")) implementation("io.quarkus:quarkus-resteasy-reactive") diff --git a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts index 16b151b7744d..0da5e8ff54c7 100644 --- a/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts +++ b/instrumentation/quarkus-resteasy-reactive/quarkus3-testing/build.gradle.kts @@ -4,6 +4,10 @@ plugins { id("io.quarkus") version "3.0.0.Final" } +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_11) +} + // io.quarkus.platform:quarkus-bom is missing for 3.0.0.Final var quarkusVersion = "3.0.1.Final" if (findProperty("testLatestDeps") as Boolean) { From 831b882ae7fb42b7443bbf328ba5077ad8166f1f Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Mon, 15 May 2023 15:29:14 +0300 Subject: [PATCH 3/3] address review comment --- .../reactive/ResteasyReactiveSpanName.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java index 62d825c19ac4..d1e47490fe56 100644 --- a/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java +++ b/instrumentation/quarkus-resteasy-reactive/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/quarkus/resteasy/reactive/ResteasyReactiveSpanName.java @@ -8,16 +8,14 @@ import static io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsPathUtil.normalizePath; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteGetter; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteHolder; import io.opentelemetry.instrumentation.api.instrumenter.http.HttpRouteSource; import io.opentelemetry.instrumentation.api.util.VirtualField; -import javax.annotation.Nullable; import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext; import org.jboss.resteasy.reactive.server.mapping.RuntimeResource; import org.jboss.resteasy.reactive.server.mapping.URITemplate; -public class ResteasyReactiveSpanName implements HttpRouteGetter { +public final class ResteasyReactiveSpanName { // remember previous path to handle sub path locators private static final VirtualField pathField = VirtualField.find(ResteasyReactiveRequestContext.class, String.class); @@ -27,7 +25,7 @@ public class ResteasyReactiveSpanName implements HttpRouteGetter { public void updateServerSpanName(ResteasyReactiveRequestContext requestContext) { Context context = Context.current(); String jaxRsName = calculateJaxRsName(requestContext); - HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.NESTED_CONTROLLER, this, jaxRsName); + HttpRouteHolder.updateHttpRoute(context, HttpRouteSource.NESTED_CONTROLLER, jaxRsName); pathField.set(requestContext, jaxRsName); } @@ -43,12 +41,6 @@ private static String calculateJaxRsName(ResteasyReactiveRequestContext requestC return existingPath == null || existingPath.isEmpty() ? name : existingPath + name; } - @Override - @Nullable - public String get(Context context, String jaxRsName) { - return jaxRsName; - } - private static String normalize(URITemplate uriTemplate) { if (uriTemplate == null) { return ""; @@ -56,4 +48,6 @@ private static String normalize(URITemplate uriTemplate) { return normalizePath(uriTemplate.template); } + + private ResteasyReactiveSpanName() {} }