This is an automated email from the ASF dual-hosted git repository. jamesnetherton pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit ba244d64fb424f66b200aa132ebda492b01373ea Author: Lukas Lowinger <[email protected]> AuthorDate: Thu Nov 13 14:10:42 2025 +0000 Port camel-quarkus-opentelemetry tests to camel-quarkus-opentelemetry2 Fixes #7806 Co-authored-by: jamesnetherton <[email protected]> --- integration-tests/opentelemetry2/pom.xml | 53 +++++++++ .../opentelemetry2/it/GreetingsBean.java} | 15 ++- ...nTelemetry2Resource.java => JdbcQueryBean.java} | 43 ++++--- .../opentelemetry2/it/OpenTelemetry2Resource.java | 15 +++ .../it/OpenTelemetry2RouteBuilder.java | 20 +++- .../opentelemetry2/it/SpanExporterResource.java | 2 +- .../src/main/resources/application.properties | 5 +- .../it/OpenTelemetry2TestHelper.java} | 24 ++-- .../it/OpenTelemetry2TraceProcessorsIT.java} | 12 +- ...java => OpenTelemetry2TraceProcessorsTest.java} | 51 +++++---- .../opentelemetry2/it/Opentelemetry2Test.java | 124 ++++++++++++++++++--- .../it/TraceProcessorsTestProfile.java} | 11 +- 12 files changed, 286 insertions(+), 89 deletions(-) diff --git a/integration-tests/opentelemetry2/pom.xml b/integration-tests/opentelemetry2/pom.xml index 5da20d1f3e..094a95a2b5 100644 --- a/integration-tests/opentelemetry2/pom.xml +++ b/integration-tests/opentelemetry2/pom.xml @@ -31,10 +31,18 @@ <description>Integration tests for Camel Quarkus Opentelemetry2 extension</description> <dependencies> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-bean</artifactId> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-direct</artifactId> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-platform-http</artifactId> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-timer</artifactId> @@ -55,6 +63,14 @@ <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-jsonb</artifactId> </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-agroal</artifactId> + </dependency> + <dependency> + <groupId>io.quarkus</groupId> + <artifactId>quarkus-jdbc-postgresql</artifactId> + </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-testing</artifactId> @@ -115,6 +131,19 @@ </activation> <dependencies> <!-- The following dependencies guarantee that this module is built after them. You can update them by running `mvn process-resources -Pformat -N` from the source tree root directory --> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-bean-deployment</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-direct-deployment</artifactId> @@ -154,6 +183,19 @@ </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-platform-http-deployment</artifactId> + <version>${project.version}</version> + <type>pom</type> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>*</groupId> + <artifactId>*</artifactId> + </exclusion> + </exclusions> + </dependency> <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-timer-deployment</artifactId> @@ -169,6 +211,17 @@ </dependency> </dependencies> </profile> + <profile> + <id>skip-testcontainers-tests</id> + <activation> + <property> + <name>skip-testcontainers-tests</name> + </property> + </activation> + <properties> + <skipTests>true</skipTests> + </properties> + </profile> </profiles> </project> diff --git a/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterProducer.java b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/GreetingsBean.java similarity index 75% rename from integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterProducer.java rename to integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/GreetingsBean.java index 9262412a6e..0f910528b9 100644 --- a/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterProducer.java +++ b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/GreetingsBean.java @@ -16,17 +16,16 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter; +import io.opentelemetry.instrumentation.annotations.WithSpan; import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Produces; -import jakarta.inject.Singleton; +import jakarta.inject.Named; @ApplicationScoped -public class SpanExporterProducer { +@Named("greetingsBean") +public class GreetingsBean { - @Produces - @Singleton - public InMemorySpanExporter createInMemoryExporter() { - return InMemorySpanExporter.create(); + @WithSpan + public String greet(String name) { + return "Hello " + name; } } diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/JdbcQueryBean.java similarity index 50% copy from integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java copy to integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/JdbcQueryBean.java index 8b3dfee289..c5240f3c70 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java +++ b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/JdbcQueryBean.java @@ -16,26 +16,35 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; -import org.apache.camel.ProducerTemplate; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; -@Path("/opentelemetry2") -@ApplicationScoped -public class OpenTelemetry2Resource { +import io.agroal.api.AgroalDataSource; +import io.quarkus.runtime.annotations.RegisterForReflection; +import jakarta.inject.Inject; +import jakarta.inject.Named; +import jakarta.inject.Singleton; +@Singleton +@Named("jdbcQueryBean") +@RegisterForReflection(fields = false) +public class JdbcQueryBean { @Inject - ProducerTemplate producerTemplate; + AgroalDataSource dataSource; - @Path("/trace") - @GET - @Produces(MediaType.TEXT_PLAIN) - public String traceRoute() { - return producerTemplate.requestBody("direct:start", null, String.class); + public long getNowTimestamp() { + try (Connection connection = dataSource.getConnection()) { + try (Statement statement = connection.createStatement()) { + ResultSet resultSet = statement.executeQuery("SELECT EXTRACT(EPOCH FROM NOW());"); + if (resultSet.next()) { + return resultSet.getLong(1); + } + return 0; + } + } catch (SQLException e) { + throw new RuntimeException(e); + } } - } diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java index 8b3dfee289..fadf1361f1 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java +++ b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2Resource.java @@ -20,6 +20,7 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import org.apache.camel.ProducerTemplate; @@ -38,4 +39,18 @@ public class OpenTelemetry2Resource { return producerTemplate.requestBody("direct:start", null, String.class); } + @Path("/greet/{name}") + @GET + @Produces(MediaType.TEXT_PLAIN) + public String traceRoute(@PathParam("name") String name) { + return producerTemplate.requestBody("direct:greet", name, String.class); + } + + @Path("/jdbc/query") + @GET + @Produces(MediaType.TEXT_PLAIN) + public long jdbcQuery() { + return producerTemplate.requestBody("direct:jdbcQuery", null, Long.class); + } + } diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java index 7722741cf6..b21980d090 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java +++ b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java @@ -16,14 +16,30 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; +import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; public class OpenTelemetry2RouteBuilder extends RouteBuilder { @Override public void configure() throws Exception { + from("platform-http:/opentelemetry2/test/trace?httpMethodRestrict=GET") + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200)) + .setBody(constant("GET: /opentelemetry2/test/trace")); + + from("platform-http:/opentelemetry2/test/trace/filtered") + .setBody(constant("GET: /opentelemetry2/test/trace/filtered")); + from("direct:start") - .setBody().constant("Traced direct:start") - .to("log:info"); + .setBody().constant("Traced direct:start"); + + from("direct:greet") + .to("bean:greetingsBean"); + + from("timer:filtered?repeatCount=5&delay=-1") + .setBody().constant("Route filtered from tracing").id("timer-setbody"); + + from("direct:jdbcQuery") + .to("bean:jdbcQueryBean"); } } diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterResource.java b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterResource.java index cf90908882..ca24be4e25 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterResource.java +++ b/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterResource.java @@ -45,7 +45,7 @@ public class SpanExporterResource { JsonArrayBuilder arrayBuilder = Json.createArrayBuilder(); for (SpanData span : exporter.getFinishedSpanItems()) { - if (span.getName().contains("GET /")) { + if (span.getName().contains("/opentelemetry2/exporter")) { // Ignore any trace events on this resource continue; } diff --git a/integration-tests/opentelemetry2/src/main/resources/application.properties b/integration-tests/opentelemetry2/src/main/resources/application.properties index 968c0b4d2c..304b685a99 100644 --- a/integration-tests/opentelemetry2/src/main/resources/application.properties +++ b/integration-tests/opentelemetry2/src/main/resources/application.properties @@ -14,5 +14,8 @@ ## See the License for the specific language governing permissions and ## limitations under the License. ## --------------------------------------------------------------------------- +quarkus.camel.opentelemetry2.exclude-patterns = timer* quarkus.otel.bsp.schedule.delay=1 -quarkus.otel.bsp.export.timeout=5s \ No newline at end of file +quarkus.otel.bsp.export.timeout=5s +quarkus.datasource.jdbc.telemetry=true +quarkus.datasource.devservices.image-name=${postgres.container.image} \ No newline at end of file diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TestHelper.java similarity index 64% copy from integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java copy to integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TestHelper.java index 7722741cf6..05fab0d6ac 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java +++ b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TestHelper.java @@ -16,14 +16,24 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import org.apache.camel.builder.RouteBuilder; +import java.util.List; +import java.util.Map; -public class OpenTelemetry2RouteBuilder extends RouteBuilder { +import io.restassured.RestAssured; - @Override - public void configure() throws Exception { - from("direct:start") - .setBody().constant("Traced direct:start") - .to("log:info"); +class OpenTelemetry2TestHelper { + private OpenTelemetry2TestHelper() { + // Utility class + } + + static List<Map<String, String>> getSpans() { + return RestAssured.given() + .get("/opentelemetry2/exporter/spans") + .then() + .statusCode(200) + .extract() + .body() + .jsonPath() + .get(); } } diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsIT.java similarity index 74% copy from integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java copy to integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsIT.java index 7722741cf6..512e2c2c85 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java +++ b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsIT.java @@ -16,14 +16,8 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import org.apache.camel.builder.RouteBuilder; +import io.quarkus.test.junit.QuarkusIntegrationTest; -public class OpenTelemetry2RouteBuilder extends RouteBuilder { - - @Override - public void configure() throws Exception { - from("direct:start") - .setBody().constant("Traced direct:start") - .to("log:info"); - } +@QuarkusIntegrationTest +class OpenTelemetry2TraceProcessorsIT extends OpenTelemetry2TraceProcessorsTest { } diff --git a/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsTest.java similarity index 53% copy from integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java copy to integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsTest.java index f1f0ff8287..5ad4c87340 100644 --- a/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java +++ b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsTest.java @@ -16,50 +16,59 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import io.opentelemetry.api.trace.SpanKind; import io.quarkus.test.junit.QuarkusTest; +import io.quarkus.test.junit.TestProfile; import io.restassured.RestAssured; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import static org.apache.camel.quarkus.component.opentelemetry2.it.OpenTelemetry2TestHelper.getSpans; import static org.awaitility.Awaitility.await; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; +@TestProfile(TraceProcessorsTestProfile.class) @QuarkusTest -class Opentelemetry2Test { - - static List<Map<String, String>> getSpans() { - return RestAssured.given() - .get("/opentelemetry2/exporter/spans") +class OpenTelemetry2TraceProcessorsTest { + @AfterEach + public void afterEach() { + RestAssured.post("/opentelemetry2/exporter/spans/reset") .then() - .statusCode(200) - .extract() - .body() - .jsonPath() - .get(); + .statusCode(204); } @Test - public void testTracedCamelRoute() throws IOException, InterruptedException { + void traceProcessors() { RestAssured.get("/opentelemetry2/trace") .then() .statusCode(200) .body(equalTo("Traced direct:start")); - await().atMost(30, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> getSpans().size() == 3); + // Verify the span hierarchy is JAX-RS Service -> Direct Endpoint -> SetBody + await().atMost(30, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> { + List<Map<String, String>> spans = getSpans(); + return spans.size() == 4; + }); + List<Map<String, String>> spans = getSpans(); - assertEquals(3, spans.size()); - //Same trace - assertEquals(spans.get(2).get("traceId"), spans.get(1).get("traceId")); - assertEquals(spans.get(2).get("traceId"), spans.get(0).get("traceId")); - // Parent relationship - assertEquals("0000000000000000", spans.get(2).get("parentId")); - assertEquals(spans.get(2).get("spanId"), spans.get(1).get("parentId")); + assertEquals(4, spans.size()); + assertEquals(SpanKind.INTERNAL.name(), spans.get(0).get("kind")); + assertEquals("setBody3-setBody", spans.get(0).get("component")); assertEquals(spans.get(1).get("spanId"), spans.get(0).get("parentId")); - } + assertEquals(SpanKind.INTERNAL.name(), spans.get(1).get("kind")); + assertEquals(spans.get(2).get("spanId"), spans.get(1).get("parentId")); + assertEquals(SpanKind.INTERNAL.name(), spans.get(2).get("kind")); + // TODO: Restore this assertion - https://github.com/apache/camel-quarkus/issues/7813 + // assertEquals(spans.get(2).get("parentId"), spans.get(3).get("spanId")); + + // TODO: See above - remove this assertion. For now we expect the the JAX-RS service span to be disconnected + assertEquals(spans.get(3).get("parentId"), "0000000000000000"); + assertEquals(SpanKind.SERVER.name(), spans.get(3).get("kind")); + } } diff --git a/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java index f1f0ff8287..a55c143632 100644 --- a/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java +++ b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/Opentelemetry2Test.java @@ -16,50 +16,140 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import io.opentelemetry.api.trace.SpanKind; import io.quarkus.test.junit.QuarkusTest; import io.restassured.RestAssured; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION_NAME; +import static org.apache.camel.quarkus.component.opentelemetry2.it.OpenTelemetry2TestHelper.getSpans; import static org.awaitility.Awaitility.await; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @QuarkusTest class Opentelemetry2Test { - static List<Map<String, String>> getSpans() { - return RestAssured.given() - .get("/opentelemetry2/exporter/spans") + @AfterEach + public void afterEach() { + RestAssured.post("/opentelemetry2/exporter/spans/reset") .then() - .statusCode(200) - .extract() - .body() - .jsonPath() - .get(); + .statusCode(204); + } + + @Disabled("https://github.com/apache/camel-quarkus/issues/7813") + @Test + public void testTraceRoute() { + // Generate messages + for (int i = 0; i < 5; i++) { + RestAssured.get("/opentelemetry2/test/trace/") + .then() + .statusCode(200); + + // No spans should be recorded for this route as they are excluded by camel.opentelemetry2.exclude-patterns in + // application.properties + // TODO: Reinstate this when platform-http route excludes are fixed. For now, a timer endpoint stands in for filter tests + // https://github.com/apache/camel-quarkus/issues/2897 + // RestAssured.get("/opentelemetry2/test/trace/filtered") + // .then() + // .statusCode(200); + } + + // Retrieve recorded spans + await().atMost(30, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> getSpans().size() == 5); + List<Map<String, String>> spans = getSpans(); + assertEquals(5, spans.size()); + + for (Map<String, String> span : spans) { + assertEquals("camel-platform-http", span.get("component")); + assertEquals("200", span.get("http.status_code")); + assertEquals("GET", span.get("http.method")); + assertEquals("platform-http:///opentelemetry2/test/trace?httpMethodRestrict=GET", span.get("camel.uri")); + assertTrue(span.get("http.url").endsWith("/opentelemetry2/test/trace/")); + } } + @Disabled("https://github.com/apache/camel-quarkus/issues/7813") @Test - public void testTracedCamelRoute() throws IOException, InterruptedException { + public void testTracedCamelRouteInvokedFromJaxRsService() { RestAssured.get("/opentelemetry2/trace") .then() .statusCode(200) .body(equalTo("Traced direct:start")); + // Verify the span hierarchy is JAX-RS Service -> Direct Endpoint await().atMost(30, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> getSpans().size() == 3); List<Map<String, String>> spans = getSpans(); assertEquals(3, spans.size()); - //Same trace - assertEquals(spans.get(2).get("traceId"), spans.get(1).get("traceId")); - assertEquals(spans.get(2).get("traceId"), spans.get(0).get("traceId")); - // Parent relationship - assertEquals("0000000000000000", spans.get(2).get("parentId")); - assertEquals(spans.get(2).get("spanId"), spans.get(1).get("parentId")); - assertEquals(spans.get(1).get("spanId"), spans.get(0).get("parentId")); + assertEquals(spans.get(0).get("parentId"), spans.get(1).get("spanId")); + assertEquals(SpanKind.CLIENT.name(), spans.get(1).get("kind")); + assertEquals(SpanKind.SERVER.name(), spans.get(2).get("kind")); + } + + @Test + public void testTracedBean() { + String name = "Camel Quarkus OpenTelemetry"; + RestAssured.get("/opentelemetry2/greet/" + name) + .then() + .statusCode(200) + .body(equalTo("Hello " + name)); + + // Verify the span hierarchy is JAX-RS Service -> Direct Endpoint -> Bean Method + await().atMost(30, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> getSpans().size() == 5); + List<Map<String, String>> spans = getSpans(); + assertEquals(5, spans.size()); + assertEquals(spans.get(0).get("parentId"), spans.get(1).get("spanId")); + assertEquals(spans.get(1).get("parentId"), spans.get(2).get("spanId")); + assertEquals(spans.get(2).get("parentId"), spans.get(3).get("spanId")); + assertEquals(SpanKind.INTERNAL.name(), spans.get(3).get("kind")); + assertEquals(SpanKind.SERVER.name(), spans.get(4).get("kind")); } + @Test + public void testTracedJdbcQuery() { + String timestamp = RestAssured.get("/opentelemetry2/jdbc/query") + .then() + .statusCode(200) + .extract() + .body() + .asString(); + + assertTrue(Long.parseLong(timestamp) > 0); + + // Verify the span hierarchy is JAX-RS Service -> Direct Endpoint -> Bean Endpoint -> Bean method -> JDBC query + await().atMost(30, TimeUnit.SECONDS).pollDelay(50, TimeUnit.MILLISECONDS).until(() -> getSpans().size() == 6); + List<Map<String, String>> spans = getSpans(); + assertEquals(6, spans.size()); + assertEquals(spans.get(0).get("parentId"), spans.get(1).get("parentId")); + assertEquals("getConnection", spans.get(0).get("code.function")); + + assertEquals(spans.get(1).get("parentId"), spans.get(2).get("spanId")); + assertEquals("SELECT", spans.get(1).get("db.operation")); + + assertEquals(spans.get(2).get("parentId"), spans.get(3).get("spanId")); + assertEquals("bean://jdbcQueryBean", spans.get(2).get("camel.uri")); + + assertEquals(spans.get(3).get("parentId"), spans.get(4).get("spanId")); + assertEquals("direct://jdbcQuery", spans.get(3).get("camel.uri")); + assertEquals("EVENT_RECEIVED", spans.get(3).get("op")); + + // TODO: Restore this assertion - https://github.com/apache/camel-quarkus/issues/7813 + // assertEquals(spans.get(4).get("parentId"), spans.get(5).get("spanId")); + + // TODO: See above - remove this assertion. For now we expect the the JAX-RS service and the direct:jdbcQuery spans to be disconnected + assertEquals(spans.get(4).get("parentId"), "0000000000000000"); + assertEquals("direct://jdbcQuery", spans.get(4).get("camel.uri")); + assertEquals("EVENT_SENT", spans.get(4).get("op")); + + assertEquals(spans.get(5).get("parentId"), "0000000000000000"); + assertEquals("org.apache.camel.quarkus.component.opentelemetry2.it.OpenTelemetry2Resource.jdbcQuery", + spans.get(5).get(CODE_FUNCTION_NAME.getKey())); + } } diff --git a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/TraceProcessorsTestProfile.java similarity index 76% copy from integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java copy to integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/TraceProcessorsTestProfile.java index 7722741cf6..7a8056215b 100644 --- a/integration-tests/opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2RouteBuilder.java +++ b/integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/TraceProcessorsTestProfile.java @@ -16,14 +16,13 @@ */ package org.apache.camel.quarkus.component.opentelemetry2.it; -import org.apache.camel.builder.RouteBuilder; +import java.util.Map; -public class OpenTelemetry2RouteBuilder extends RouteBuilder { +import io.quarkus.test.junit.QuarkusTestProfile; +public class TraceProcessorsTestProfile implements QuarkusTestProfile { @Override - public void configure() throws Exception { - from("direct:start") - .setBody().constant("Traced direct:start") - .to("log:info"); + public Map<String, String> getConfigOverrides() { + return Map.of("quarkus.camel.opentelemetry2.trace-processors", "true"); } }
