You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2021/07/13 06:22:07 UTC

[camel-quarkus] 01/02: Test OpenTracing @Traced beans in conjunction with Camel routes

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 <ja...@gmail.com>
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();
+    }
 }