From 9f806c0b7f25aa79f8a70fdce67d66e30d7a90bf Mon Sep 17 00:00:00 2001 From: brunobat Date: Wed, 15 Jan 2025 11:25:13 +0000 Subject: [PATCH] Test for non app uris --- extensions/opentelemetry/deployment/pom.xml | 5 + .../OpenTelemetrySuppressNonAppUriTest.java | 103 ++++++++++++++++++ .../common/exporter/TestSpanExporter.java | 19 +++- 3 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetrySuppressNonAppUriTest.java diff --git a/extensions/opentelemetry/deployment/pom.xml b/extensions/opentelemetry/deployment/pom.xml index f0b9e0ef6d2a4..306f138c26fcd 100644 --- a/extensions/opentelemetry/deployment/pom.xml +++ b/extensions/opentelemetry/deployment/pom.xml @@ -145,6 +145,11 @@ quarkus-security-deployment test + + io.quarkus + quarkus-vertx-http-dev-ui-tests + test + io.opentelemetry opentelemetry-sdk-testing diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetrySuppressNonAppUriTest.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetrySuppressNonAppUriTest.java new file mode 100644 index 0000000000000..6a6e314aa3f48 --- /dev/null +++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/OpenTelemetrySuppressNonAppUriTest.java @@ -0,0 +1,103 @@ +package io.quarkus.opentelemetry.deployment; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.List; + +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; + +import org.jboss.shrinkwrap.api.asset.StringAsset; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.opentelemetry.sdk.trace.data.SpanData; +import io.quarkus.opentelemetry.deployment.common.exporter.TestSpanExporter; +import io.quarkus.opentelemetry.deployment.common.exporter.TestSpanExporterProvider; +import io.quarkus.test.QuarkusDevModeTest; +import io.restassured.RestAssured; + +public class OpenTelemetrySuppressNonAppUriTest { + + @RegisterExtension + final static QuarkusDevModeTest TEST = new QuarkusDevModeTest() + .withApplicationRoot((jar) -> jar + .addClasses(HelloResource.class, TestSpanExporter.class, TestSpanExporterProvider.class) + .addAsResource(new StringAsset(TestSpanExporterProvider.class.getCanonicalName()), + "META-INF/services/io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSpanExporterProvider") + .add(new StringAsset( + """ + quarkus.otel.traces.exporter=test-span-exporter + quarkus.otel.metrics.exporter=none + quarkus.otel.bsp.export.timeout=1s + quarkus.otel.bsp.schedule.delay=50 + """), + "application.properties")); + + @Test + void test() { + + // Must not be traced + RestAssured.given() + .get("/q/health/") + .then() + .statusCode(200); + RestAssured.given() + .get("/q/dev-ui") + .then() + .statusCode(200); + RestAssured.given() + .get("/q/dev-ui/icon/font-awesome.js") + .then() + .statusCode(200); + // Valid trace + RestAssured.given() + .get("/hello") + .then() + .statusCode(200); + // Get span names + List spans = Arrays.asList( + RestAssured.given() + .get("/hello/spans") + .then() + .statusCode(200) + .extract().body() + .asString() + .split(";")); + + assertThat(spans.size()) + .withFailMessage("Expected only one span but found: " + spans) + .isEqualTo(1); + + assertThat(spans).contains("GET /hello"); + } + + @Path("/hello") + public static class HelloResource { + + @Inject + TestSpanExporter spanExporter; + + @GET + public String greetings() { + return "Hello test"; + } + + /** + * Gets a string with the received spans names concatenated by ; + * + * @return + */ + @GET + @Path("/spans") + public String greetingsInsertAtLeast() { + String spanNames = spanExporter.getFinishedSpanItemsAtLeast(1).stream() + .map(SpanData::getName) + .reduce((s1, s2) -> s1 + ";" + s2).orElse(""); + System.out.println(spanNames); + return spanNames; + } + } +} diff --git a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/common/exporter/TestSpanExporter.java b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/common/exporter/TestSpanExporter.java index 573816c3ed9d0..c55856ea52c1e 100644 --- a/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/common/exporter/TestSpanExporter.java +++ b/extensions/opentelemetry/deployment/src/test/java/io/quarkus/opentelemetry/deployment/common/exporter/TestSpanExporter.java @@ -4,6 +4,7 @@ import static java.util.stream.Collectors.toList; import static org.awaitility.Awaitility.await; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Collection; import java.util.List; @@ -50,11 +51,27 @@ public List getFinishedSpanItems(int spanCount) { return finishedSpanItems.stream().collect(toList()); } + /** + * Careful when retrieving the list of finished spans. There is a chance when the response is already sent to the + * client and Vert.x still writing the end of the spans. This means that a response is available to assert from the + * test side but not all spans may be available yet. For this reason, this method requires the number of expected + * spans. + */ + public List getFinishedSpanItemsAtLeast(int spanCount) { + assertSpanAtLeast(spanCount); + return finishedSpanItems; + } + public void assertSpanCount(int spanCount) { - await().atMost(30, SECONDS).untilAsserted( + await().atMost(5, SECONDS).untilAsserted( () -> assertEquals(spanCount, finishedSpanItems.size(), "Spans: " + finishedSpanItems.toString())); } + public void assertSpanAtLeast(int spanCount) { + await().atMost(5, SECONDS).untilAsserted( + () -> assertTrue(spanCount < finishedSpanItems.size(), "Spans: " + finishedSpanItems.toString())); + } + public void reset() { finishedSpanItems.clear(); }