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 5e07d0c438c9206f9c29338cdf39ff75072e6ef6 Author: James Netherton <[email protected]> AuthorDate: Mon Jul 12 09:15:22 2021 +0100 Test OpenTracing @Traced beans in conjunction with Camel routes --- integration-tests/opentracing/pom.xml | 17 ++++++ .../opentracing/it/OpenTracingResource.java | 23 ++++++++ .../opentracing/it/OpenTracingRouteBuilder.java | 29 ++++++++++ ...penTracingRouteBuilder.java => TracedBean.java} | 18 +++---- ...ngRouteBuilder.java => TracedBeanProducer.java} | 21 ++++---- .../component/opentracing/it/OpenTracingTest.java | 61 ++++++++++++++++++---- 6 files changed, 139 insertions(+), 30 deletions(-) diff --git a/integration-tests/opentracing/pom.xml b/integration-tests/opentracing/pom.xml index 8d2572a..bbba36c 100644 --- a/integration-tests/opentracing/pom.xml +++ b/integration-tests/opentracing/pom.xml @@ -32,6 +32,10 @@ <dependencies> <dependency> <groupId>org.apache.camel.quarkus</groupId> + <artifactId>camel-quarkus-direct</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-opentracing</artifactId> </dependency> <dependency> @@ -66,6 +70,19 @@ <!-- 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-direct-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-opentracing-deployment</artifactId> <version>${project.version}</version> <type>pom</type> diff --git a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingResource.java b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingResource.java index c8fc871..bff92a3 100644 --- a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingResource.java +++ b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingResource.java @@ -23,6 +23,7 @@ import javax.json.JsonArray; import javax.json.JsonArrayBuilder; import javax.json.JsonObjectBuilder; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @@ -30,14 +31,20 @@ import javax.ws.rs.core.MediaType; import io.opentracing.Tracer; import io.opentracing.mock.MockSpan; import io.opentracing.mock.MockTracer; +import org.apache.camel.ProducerTemplate; +import org.eclipse.microprofile.opentracing.Traced; @Path("/opentracing") @ApplicationScoped +@Traced(value = false) public class OpenTracingResource { @Inject Tracer tracer; + @Inject + ProducerTemplate producerTemplate; + @Path("/spans") @GET @Produces(MediaType.APPLICATION_JSON) @@ -51,6 +58,7 @@ public class OpenTracingResource { JsonObjectBuilder objectBuilder = Json.createObjectBuilder(); objectBuilder.add("spanId", context.spanId()); objectBuilder.add("traceId", context.traceId()); + objectBuilder.add("parentId", span.parentId()); span.tags().forEach((k, v) -> objectBuilder.add(k, v.toString())); @@ -59,4 +67,19 @@ public class OpenTracingResource { return arrayBuilder.build(); } + + @Traced + @Path("/trace") + @GET + @Produces(MediaType.TEXT_PLAIN) + public String traceRoute() { + return producerTemplate.requestBody("direct:start", null, String.class); + } + + @Path("/mock/tracer/reset") + @POST + public void resetMockTracer() { + MockTracer mockTracer = (MockTracer) tracer; + mockTracer.reset(); + } } diff --git a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java index d0a940e..51303d5 100644 --- a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java +++ b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java @@ -16,11 +16,21 @@ */ package org.apache.camel.quarkus.component.opentracing.it; +import javax.enterprise.context.ApplicationScoped; +import javax.inject.Inject; + +import io.opentracing.Span; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.opentracing.OpenTracingSpanAdapter; +import org.apache.camel.tracing.ActiveSpanManager; +@ApplicationScoped public class OpenTracingRouteBuilder extends RouteBuilder { + @Inject + TracedBean tracedBean; + @Override public void configure() throws Exception { from("platform-http:/opentracing/test/trace?httpMethodRestrict=GET") @@ -29,5 +39,24 @@ public class OpenTracingRouteBuilder extends RouteBuilder { from("platform-http:/opentracing/test/trace/filtered") .setBody(constant("GET: /opentracing/test/trace/filtered")); + + from("platform-http:/opentracing/test/bean") + .process(exchange -> { + Span span = getCurrentSpan(exchange); + tracedBean.doTrace(span); + }) + .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200)); + + from("direct:start") + .process(exchange -> { + Span span = getCurrentSpan(exchange); + tracedBean.doTrace(span); + }) + .setBody().constant("Traced direct:start"); + } + + private Span getCurrentSpan(Exchange exchange) { + OpenTracingSpanAdapter adapter = (OpenTracingSpanAdapter) ActiveSpanManager.getSpan(exchange); + return adapter.getOpenTracingSpan(); } } diff --git a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBean.java similarity index 61% copy from integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java copy to integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBean.java index d0a940e..82570c5 100644 --- a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java +++ b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBean.java @@ -16,18 +16,16 @@ */ package org.apache.camel.quarkus.component.opentracing.it; -import org.apache.camel.Exchange; -import org.apache.camel.builder.RouteBuilder; +import javax.enterprise.context.ApplicationScoped; -public class OpenTracingRouteBuilder extends RouteBuilder { +import io.opentracing.Span; +import org.eclipse.microprofile.opentracing.Traced; - @Override - public void configure() throws Exception { - from("platform-http:/opentracing/test/trace?httpMethodRestrict=GET") - .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200)) - .setBody(constant("GET: /opentracing/test/trace")); +@ApplicationScoped +public class TracedBean { - from("platform-http:/opentracing/test/trace/filtered") - .setBody(constant("GET: /opentracing/test/trace/filtered")); + @Traced + public void doTrace(Span span) { + span.log("Invoked doTrace"); } } diff --git a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBeanProducer.java similarity index 61% copy from integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java copy to integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBeanProducer.java index d0a940e..99a1400 100644 --- a/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingRouteBuilder.java +++ b/integration-tests/opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBeanProducer.java @@ -16,18 +16,19 @@ */ package org.apache.camel.quarkus.component.opentracing.it; -import org.apache.camel.Exchange; -import org.apache.camel.builder.RouteBuilder; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; +import javax.inject.Singleton; -public class OpenTracingRouteBuilder extends RouteBuilder { +import io.opentracing.Tracer; +import io.opentracing.mock.MockTracer; - @Override - public void configure() throws Exception { - from("platform-http:/opentracing/test/trace?httpMethodRestrict=GET") - .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(200)) - .setBody(constant("GET: /opentracing/test/trace")); +@ApplicationScoped +public class TracedBeanProducer { - from("platform-http:/opentracing/test/trace/filtered") - .setBody(constant("GET: /opentracing/test/trace/filtered")); + @Produces + @Singleton + public Tracer tracer() { + return new MockTracer(); } } diff --git a/integration-tests/opentracing/src/test/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingTest.java b/integration-tests/opentracing/src/test/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingTest.java index 5beed56..94042e7 100644 --- a/integration-tests/opentracing/src/test/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingTest.java +++ b/integration-tests/opentracing/src/test/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingTest.java @@ -22,15 +22,23 @@ import java.util.Map; import io.opentracing.tag.Tags; import io.quarkus.test.junit.QuarkusTest; import io.restassured.RestAssured; -import io.restassured.path.json.JsonPath; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @QuarkusTest class OpenTracingTest { + @AfterEach + public void afterEach() { + RestAssured.post("/opentracing/mock/tracer/reset") + .then() + .statusCode(204); + } + @Test public void testTraceRoute() { // Generate messages @@ -47,15 +55,7 @@ class OpenTracingTest { } // Retrieve recorded spans - JsonPath jsonPath = RestAssured.given() - .get("/opentracing/spans") - .then() - .statusCode(200) - .extract() - .body() - .jsonPath(); - - List<Map<String, String>> spans = jsonPath.get(); + List<Map<String, String>> spans = getSpans(); assertEquals(5, spans.size()); for (Map<String, String> span : spans) { @@ -67,4 +67,45 @@ class OpenTracingTest { assertTrue(span.get(Tags.HTTP_URL.getKey()).endsWith("/opentracing/test/trace")); } } + + @Test + public void testTracedBeanInvokedFromRoute() { + RestAssured.get("/opentracing/test/bean") + .then() + .statusCode(200); + + // Verify the span hierarchy is Platform HTTP Endpoint -> TracedBean + List<Map<String, String>> spans = getSpans(); + assertEquals(2, spans.size()); + assertEquals(spans.get(0).get("parentId"), spans.get(1).get("spanId")); + assertEquals(0, spans.get(1).get("parentId")); + assertEquals("camel-platform-http", spans.get(1).get(Tags.COMPONENT.getKey())); + } + + @Test + public void testTracedCamelRouteInvokedFromJaxRsService() { + RestAssured.get("/opentracing/trace") + .then() + .statusCode(200) + .body(equalTo("Traced direct:start")); + + // Verify the span hierarchy is JAX-RS Service -> Platform HTTP Endpoint -> TracedBean + List<Map<String, String>> spans = getSpans(); + assertEquals(3, 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(0, spans.get(2).get("parentId")); + assertEquals("jaxrs", spans.get(2).get(Tags.COMPONENT.getKey())); + } + + private List<Map<String, String>> getSpans() { + return RestAssured.given() + .get("/opentracing/spans") + .then() + .statusCode(200) + .extract() + .body() + .jsonPath() + .get(); + } }
