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:06 UTC

[camel-quarkus] branch main updated (fab4b76 -> 9344d52)

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git.


    from fab4b76  Updated CHANGELOG.md
     new 5e07d0c  Test OpenTracing @Traced beans in conjunction with Camel routes
     new 9344d52  Test OpenTelemetry invocation of Camel routes from JAX-RS services

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 integration-tests/opentelemetry/pom.xml            | 34 ++++++++++++
 .../opentelemetry/it/OpenTelemetryResource.java    | 36 +++----------
 .../it/OpenTelemetryRouteBuilder.java              |  6 +++
 ...etryResource.java => SpanExporterResource.java} | 30 +++++++----
 .../src/main/resources/application.properties      |  6 ++-
 .../opentelemetry/it/OpenTelemetryTest.java        | 52 +++++++++++++-----
 integration-tests/opentracing/pom.xml              | 17 ++++++
 .../opentracing/it/OpenTracingResource.java        | 23 ++++++++
 .../opentracing/it/OpenTracingRouteBuilder.java    | 29 ++++++++++
 .../component/opentracing/it/TracedBean.java}      | 13 +++--
 .../opentracing/it/TracedBeanProducer.java}        | 11 ++--
 .../component/opentracing/it/OpenTracingTest.java  | 61 ++++++++++++++++++----
 12 files changed, 245 insertions(+), 73 deletions(-)
 copy integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/{OpenTelemetryResource.java => SpanExporterResource.java} (70%)
 copy integration-tests/opentracing/src/{test/java/org/apache/camel/quarkus/component/opentracing/it/OpenTracingIT.java => main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBean.java} (76%)
 copy integration-tests/{opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/SpanExporterProducer.java => opentracing/src/main/java/org/apache/camel/quarkus/component/opentracing/it/TracedBeanProducer.java} (78%)

[camel-quarkus] 02/02: Test OpenTelemetry invocation of Camel routes from JAX-RS services

Posted by ja...@apache.org.
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 9344d527b2979a859e3678746bb55e54fa1abcc5
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Jul 12 13:18:16 2021 +0100

    Test OpenTelemetry invocation of Camel routes from JAX-RS services
---
 integration-tests/opentelemetry/pom.xml            | 34 ++++++++++++++
 .../opentelemetry/it/OpenTelemetryResource.java    | 36 +++------------
 .../it/OpenTelemetryRouteBuilder.java              |  6 +++
 ...etryResource.java => SpanExporterResource.java} | 30 ++++++++-----
 .../src/main/resources/application.properties      |  6 ++-
 .../opentelemetry/it/OpenTelemetryTest.java        | 52 ++++++++++++++++------
 6 files changed, 109 insertions(+), 55 deletions(-)

diff --git a/integration-tests/opentelemetry/pom.xml b/integration-tests/opentelemetry/pom.xml
index 81095d2..863db79 100644
--- a/integration-tests/opentelemetry/pom.xml
+++ b/integration-tests/opentelemetry/pom.xml
@@ -47,6 +47,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-opentelemetry</artifactId>
         </dependency>
         <dependency>
@@ -54,6 +58,10 @@
             <artifactId>camel-quarkus-platform-http</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-timer</artifactId>
+        </dependency>
+        <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
         </dependency>
@@ -81,6 +89,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-opentelemetry-deployment</artifactId>
             <version>${project.version}</version>
             <type>pom</type>
@@ -105,6 +126,19 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-timer-deployment</artifactId>
+            <version>${project.version}</version>
+            <type>pom</type>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>*</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 
     <profiles>
diff --git a/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java b/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java
index 4525aab..06e8bc2 100644
--- a/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java
+++ b/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java
@@ -16,50 +16,26 @@
  */
 package org.apache.camel.quarkus.component.opentelemetry.it;
 
-import java.util.Map;
-
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
-import javax.json.Json;
-import javax.json.JsonArray;
-import javax.json.JsonArrayBuilder;
-import javax.json.JsonObjectBuilder;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
-import io.opentelemetry.api.common.AttributeKey;
-import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
-import io.opentelemetry.sdk.trace.data.SpanData;
+import org.apache.camel.ProducerTemplate;
 
 @Path("/opentelemetry")
 @ApplicationScoped
 public class OpenTelemetryResource {
 
     @Inject
-    InMemorySpanExporter exporter;
+    ProducerTemplate producerTemplate;
 
-    @Path("/spans")
+    @Path("/trace")
     @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public JsonArray getSpans() {
-        JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
-
-        for (SpanData span : exporter.getFinishedSpanItems()) {
-
-            Map<AttributeKey<?>, Object> attributes = span.getAttributes().asMap();
-            if (attributes.containsKey(AttributeKey.stringKey("component"))) {
-                JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
-                objectBuilder.add("spanId", span.getSpanId());
-                objectBuilder.add("traceId", span.getTraceId());
-
-                attributes.forEach((k, v) -> objectBuilder.add(String.valueOf(k), v.toString()));
-
-                arrayBuilder.add(objectBuilder.build());
-            }
-        }
-
-        return arrayBuilder.build();
+    @Produces(MediaType.TEXT_PLAIN)
+    public String traceRoute() {
+        return producerTemplate.requestBody("direct:start", null, String.class);
     }
 }
diff --git a/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryRouteBuilder.java b/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryRouteBuilder.java
index 12a3a0e..375b71f 100644
--- a/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryRouteBuilder.java
+++ b/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryRouteBuilder.java
@@ -29,5 +29,11 @@ public class OpenTelemetryRouteBuilder extends RouteBuilder {
 
         from("platform-http:/opentelemetry/test/trace/filtered")
                 .setBody(constant("GET: /opentelemetry/test/trace/filtered"));
+
+        from("direct:start")
+                .setBody().constant("Traced direct:start");
+
+        from("timer:filtered?repeatCount=5&delay=-1")
+                .setBody().constant("Route filtered from tracing");
     }
 }
diff --git a/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java b/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/SpanExporterResource.java
similarity index 70%
copy from integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java
copy to integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/SpanExporterResource.java
index 4525aab..0fc85b4 100644
--- a/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryResource.java
+++ b/integration-tests/opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry/it/SpanExporterResource.java
@@ -18,13 +18,13 @@ package org.apache.camel.quarkus.component.opentelemetry.it;
 
 import java.util.Map;
 
-import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
 import javax.json.Json;
 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;
@@ -33,9 +33,8 @@ import io.opentelemetry.api.common.AttributeKey;
 import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
 import io.opentelemetry.sdk.trace.data.SpanData;
 
-@Path("/opentelemetry")
-@ApplicationScoped
-public class OpenTelemetryResource {
+@Path("/opentelemetry/exporter")
+public class SpanExporterResource {
 
     @Inject
     InMemorySpanExporter exporter;
@@ -47,19 +46,28 @@ public class OpenTelemetryResource {
         JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
 
         for (SpanData span : exporter.getFinishedSpanItems()) {
+            if (span.getName().contains("exporter")) {
+                // Ignore any trace events on this resource
+                continue;
+            }
 
             Map<AttributeKey<?>, Object> attributes = span.getAttributes().asMap();
-            if (attributes.containsKey(AttributeKey.stringKey("component"))) {
-                JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
-                objectBuilder.add("spanId", span.getSpanId());
-                objectBuilder.add("traceId", span.getTraceId());
+            JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
+            objectBuilder.add("spanId", span.getSpanId());
+            objectBuilder.add("traceId", span.getTraceId());
+            objectBuilder.add("parentId", span.getParentSpanId());
 
-                attributes.forEach((k, v) -> objectBuilder.add(String.valueOf(k), v.toString()));
+            attributes.forEach((k, v) -> objectBuilder.add(String.valueOf(k), v.toString()));
 
-                arrayBuilder.add(objectBuilder.build());
-            }
+            arrayBuilder.add(objectBuilder.build());
         }
 
         return arrayBuilder.build();
     }
+
+    @POST
+    @Path("/spans/reset")
+    public void resetSpanExporter() {
+        exporter.reset();
+    }
 }
diff --git a/integration-tests/opentelemetry/src/main/resources/application.properties b/integration-tests/opentelemetry/src/main/resources/application.properties
index 0d36a0a..e819cd6 100644
--- a/integration-tests/opentelemetry/src/main/resources/application.properties
+++ b/integration-tests/opentelemetry/src/main/resources/application.properties
@@ -15,4 +15,8 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 
-quarkus.camel.opentelemetry.exclude-patterns = platform-http:/opentelemetry/test/trace/filtered
+# TODO: Reinstate this when platform-http route excludes are fixed
+# https://github.com/apache/camel-quarkus/issues/2897
+#quarkus.camel.opentelemetry.exclude-patterns = platform-http:/opentelemetry/test/trace/filtered
+
+quarkus.camel.opentelemetry.exclude-patterns = timer:filtered*
diff --git a/integration-tests/opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryTest.java b/integration-tests/opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryTest.java
index 3419a4c..3e78556 100644
--- a/integration-tests/opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryTest.java
+++ b/integration-tests/opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryTest.java
@@ -21,15 +21,23 @@ import java.util.Map;
 
 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 OpenTelemetryTest {
 
+    @AfterEach
+    public void afterEach() {
+        RestAssured.post("/opentelemetry/exporter/spans/reset")
+                .then()
+                .statusCode(204);
+    }
+
     @Test
     public void testTraceRoute() {
         // Generate messages
@@ -40,21 +48,15 @@ class OpenTelemetryTest {
 
             // No spans should be recorded for this route as they are excluded by camel.opentelemetry.exclude-patterns in
             // application.properties
-            RestAssured.get("/opentelemetry/test/trace/filtered")
-                    .then()
-                    .statusCode(200);
+            // 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("/opentelemetry/test/trace/filtered")
+            //        .then()
+            //        .statusCode(200);
         }
 
         // Retrieve recorded spans
-        JsonPath jsonPath = RestAssured.given()
-                .get("/opentelemetry/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) {
@@ -65,4 +67,28 @@ class OpenTelemetryTest {
             assertTrue(span.get("http.url").endsWith("/opentelemetry/test/trace/"));
         }
     }
+
+    @Test
+    public void testTracedCamelRouteInvokedFromJaxRsService() {
+        RestAssured.get("/opentelemetry/trace")
+                .then()
+                .statusCode(200)
+                .body(equalTo("Traced direct:start"));
+
+        // Verify the span hierarchy is JAX-RS Service -> Direct Endpoint
+        List<Map<String, String>> spans = getSpans();
+        assertEquals(2, spans.size());
+        assertEquals(spans.get(0).get("parentId"), spans.get(1).get("spanId"));
+    }
+
+    private List<Map<String, String>> getSpans() {
+        return RestAssured.given()
+                .get("/opentelemetry/exporter/spans")
+                .then()
+                .statusCode(200)
+                .extract()
+                .body()
+                .jsonPath()
+                .get();
+    }
 }

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

Posted by ja...@apache.org.
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();
+    }
 }