From aa2a35a425c09de669b60228bbf72acf04a261e6 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Thu, 20 Jul 2023 14:09:19 +0300 Subject: [PATCH] Fix http.route tracing attribute reporting We know properly report the root path whereas previously it was being ignored Fixes: #34778 --- extensions/opentelemetry/deployment/pom.xml | 5 + .../OpenTelemetryReactiveRoutesTest.java | 95 +++++++++++++++++++ .../vertx/HttpInstrumenterVertxTracer.java | 2 +- .../it/opentelemetry/OpenTelemetryTest.java | 9 +- 4 files changed, 105 insertions(+), 6 deletions(-) create mode 100644 extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryReactiveRoutesTest.java diff --git a/extensions/opentelemetry/deployment/pom.xml b/extensions/opentelemetry/deployment/pom.xml index bb030a1ca3769..6642c020a48ef 100644 --- a/extensions/opentelemetry/deployment/pom.xml +++ b/extensions/opentelemetry/deployment/pom.xml @@ -86,6 +86,11 @@ vertx-web-client test + + io.quarkus + quarkus-reactive-routes-deployment + test + io.quarkus quarkus-resteasy-deployment diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryReactiveRoutesTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryReactiveRoutesTest.java new file mode 100644 index 0000000000000..e127973ea23cc --- /dev/null +++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetryReactiveRoutesTest.java @@ -0,0 +1,95 @@ +package io.quarkus.opentelemetry.deployment; + +import static io.opentelemetry.api.trace.SpanKind.SERVER; +import static io.quarkus.opentelemetry.deployment.common.TestSpanExporter.getSpanByKindAndParentId; +import static io.quarkus.opentelemetry.deployment.common.TestUtil.assertStringAttribute; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.List; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.opentelemetry.sdk.trace.data.SpanData; +import io.opentelemetry.semconv.trace.attributes.SemanticAttributes; +import io.quarkus.opentelemetry.deployment.common.TestSpanExporter; +import io.quarkus.opentelemetry.deployment.common.TestSpanExporterProvider; +import io.quarkus.opentelemetry.deployment.common.TestUtil; +import io.quarkus.test.QuarkusUnitTest; +import io.quarkus.vertx.web.Route; +import io.restassured.RestAssured; +import io.vertx.ext.web.RoutingContext; + +public class OpenTelemetryReactiveRoutesTest { + @RegisterExtension + static final QuarkusUnitTest TEST = new QuarkusUnitTest().setArchiveProducer( + () -> ShrinkWrap.create(JavaArchive.class) + .addClass(TestUtil.class) + .addClass(TestSpanExporter.class) + .addClass(TestSpanExporterProvider.class) + .addAsResource("resource-config/application.properties", "application.properties") + .addAsResource( + "META-INF/services-config/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider", + "META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider")); + @Inject + TestSpanExporter spanExporter; + + @AfterEach + void tearDown() { + spanExporter.reset(); + } + + @Test + void root() { + RestAssured.when() + .get("/").then() + .statusCode(200) + .body(is("hello")); + + List spans = spanExporter.getFinishedSpanItems(1); + + final SpanData server = getSpanByKindAndParentId(spans, SERVER, "0000000000000000"); + assertEquals("GET /", server.getName()); + assertStringAttribute(server, SemanticAttributes.HTTP_ROUTE, "/"); + } + + @Test + void nonRoot() { + RestAssured.when() + .get("/hello").then() + .statusCode(200) + .body(is("hello world")); + + List spans = spanExporter.getFinishedSpanItems(1); + + final SpanData server = getSpanByKindAndParentId(spans, SERVER, "0000000000000000"); + assertEquals("GET /hello", server.getName()); + assertStringAttribute(server, SemanticAttributes.HTTP_ROUTE, "/hello"); + } + + @ApplicationScoped + public static class Routes { + + @Route(path = "/", methods = Route.HttpMethod.GET) + public void root(RoutingContext rc) { + rc.response().end("hello"); + } + + @Route(path = "/hello", methods = Route.HttpMethod.GET) + public void hello(RoutingContext rc) { + String name = rc.request().getParam("name"); + if (name == null) { + name = "world"; + } + rc.response().end("hello " + name); + } + } +} diff --git a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/vertx/HttpInstrumenterVertxTracer.java b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/vertx/HttpInstrumenterVertxTracer.java index 254504abe1607..78e33ea8d8abf 100644 --- a/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/vertx/HttpInstrumenterVertxTracer.java +++ b/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/intrumentation/vertx/HttpInstrumenterVertxTracer.java @@ -156,7 +156,7 @@ public String get(final io.opentelemetry.context.Context context, final HttpRequ route = requestSpan.getContext().getLocal("VertxRoute"); } - if (route != null && route.length() > 1) { + if (route != null && route.length() >= 1) { return route; } diff --git a/integration-tests/opentelemetry/src/test/java/io/quarkus/it/opentelemetry/OpenTelemetryTest.java b/integration-tests/opentelemetry/src/test/java/io/quarkus/it/opentelemetry/OpenTelemetryTest.java index f830b94590efa..f88b3366885d4 100644 --- a/integration-tests/opentelemetry/src/test/java/io/quarkus/it/opentelemetry/OpenTelemetryTest.java +++ b/integration-tests/opentelemetry/src/test/java/io/quarkus/it/opentelemetry/OpenTelemetryTest.java @@ -15,7 +15,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; @@ -153,7 +152,7 @@ void testEmptyClientPath() { Map clientServer = getSpanByKindAndParentId(spans, SERVER, client.get("spanId")); assertEquals(SERVER.toString(), clientServer.get("kind")); verifyResource(clientServer); - assertEquals("GET", clientServer.get("name")); + assertEquals("GET /", clientServer.get("name")); assertEquals(SERVER.toString(), clientServer.get("kind")); assertTrue((Boolean) clientServer.get("ended")); assertTrue((Boolean) clientServer.get("parent_valid")); @@ -163,7 +162,7 @@ void testEmptyClientPath() { assertEquals(pathParamUrl.getHost(), server.get("attr_net.host.name")); assertEquals(pathParamUrl.getPort(), Integer.valueOf((String) server.get("attr_net.host.port"))); assertEquals("http", clientServer.get("attr_http.scheme")); - assertNull(clientServer.get("attr_http.route")); + assertEquals("/", clientServer.get("attr_http.route")); assertEquals("200", clientServer.get("attr_http.status_code")); assertNotNull(clientServer.get("attr_http.client_ip")); assertNotNull(clientServer.get("attr_user_agent.original")); @@ -219,7 +218,7 @@ void testSlashClientPath() { Map clientServer = getSpanByKindAndParentId(spans, SERVER, client.get("spanId")); assertEquals(SERVER.toString(), clientServer.get("kind")); verifyResource(clientServer); - assertEquals("GET", clientServer.get("name")); + assertEquals("GET /", clientServer.get("name")); assertEquals(SERVER.toString(), clientServer.get("kind")); assertTrue((Boolean) clientServer.get("ended")); assertTrue((Boolean) clientServer.get("parent_valid")); @@ -229,7 +228,7 @@ void testSlashClientPath() { assertEquals(pathParamUrl.getHost(), server.get("attr_net.host.name")); assertEquals(pathParamUrl.getPort(), Integer.valueOf((String) server.get("attr_net.host.port"))); assertEquals("http", clientServer.get("attr_http.scheme")); - assertNull(clientServer.get("attr_http.route")); + assertEquals("/", clientServer.get("attr_http.route")); assertEquals("200", clientServer.get("attr_http.status_code")); assertNotNull(clientServer.get("attr_http.client_ip")); assertNotNull(clientServer.get("attr_user_agent.original"));