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 2025/11/21 10:23:56 UTC

(camel-quarkus) branch 3.27.x updated (a1810ee632 -> 08bb38a8dc)

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

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


    from a1810ee632 Keep smooks-core and smooks-bom versions separate because they can be released separately
     new e99a02fa52 Eagerly initialize opentelemetry2 extension OpenTelemetryTracer bean
     new 01ed24a024 Port camel-quarkus-opentelemetry tests to camel-quarkus-opentelemetry2
     new 7642320800 Increase debezium-sqlserver init script wait time to 30 seconds
     new 8d9dbfa541 [fixes #3037] Use preferred way for handling gRPC onError
     new 08bb38a8dc Add camel. extension prefix for route resources supported for hot reload

The 5 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:
 .../quarkus/core/deployment/util/CamelSupport.java |   3 +-
 .../OpenTelemetry2TracerProducer.java              |   5 +-
 .../mssql/src/test/resources/initSqlserver.sql     |  12 +-
 integration-tests-jvm/main-devmode/pom.xml         |  17 +++
 ...ternWithSupportedFileExtensionsDevModeTest.java | 122 ++++++++++++++++++++
 integration-tests/grpc/README.adoc                 |  34 ++++++
 .../quarkus/component/grpc/it/PingPongImpl.java    |  74 ------------
 .../camel/quarkus/component/grpc/it/GrpcTest.java  |  29 ++---
 integration-tests/opentelemetry2/pom.xml           |  53 +++++++++
 .../opentelemetry2}/it/GreetingsBean.java          |   2 +-
 .../opentelemetry2}/it/JdbcQueryBean.java          |   2 +-
 .../opentelemetry2/it/OpenTelemetry2Resource.java  |  15 +++
 .../it/OpenTelemetry2RouteBuilder.java             |  20 +++-
 .../opentelemetry2/it/SpanExporterResource.java    |   2 +-
 .../src/main/resources/application.properties      |   5 +-
 .../it/OpenTelemetry2TestHelper.java}              |   8 +-
 ...T.java => OpenTelemetry2TraceProcessorsIT.java} |   3 +-
 .../it/OpenTelemetry2TraceProcessorsTest.java}     |  33 ++++--
 .../opentelemetry2/it/Opentelemetry2Test.java      | 124 ++++++++++++++++++---
 .../opentelemetry2/it/SpanExporterProducer.java    |  32 ------
 .../it/TraceProcessorsTestProfile.java             |   4 +-
 21 files changed, 434 insertions(+), 165 deletions(-)
 create mode 100644 integration-tests-jvm/main-devmode/src/test/java/org/apache/camel/quarkus/main/CamelMainRoutesIncludePatternWithSupportedFileExtensionsDevModeTest.java
 create mode 100644 integration-tests/grpc/README.adoc
 delete mode 100644 integration-tests/grpc/src/main/java/org/apache/camel/quarkus/component/grpc/it/PingPongImpl.java
 copy integration-tests/{opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry => opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2}/it/GreetingsBean.java (94%)
 copy integration-tests/{opentelemetry/src/main/java/org/apache/camel/quarkus/component/opentelemetry => opentelemetry2/src/main/java/org/apache/camel/quarkus/component/opentelemetry2}/it/JdbcQueryBean.java (96%)
 copy integration-tests/{opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryTestHelper.java => opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TestHelper.java} (85%)
 copy integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/{Opentelemetry2IT.java => OpenTelemetry2TraceProcessorsIT.java} (92%)
 copy integration-tests/{opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry/it/OpenTelemetryTraceProcessorsTest.java => opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/OpenTelemetry2TraceProcessorsTest.java} (64%)
 delete mode 100644 integration-tests/opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/it/SpanExporterProducer.java
 copy integration-tests/{opentelemetry/src/test/java/org/apache/camel/quarkus/component/opentelemetry => opentelemetry2/src/test/java/org/apache/camel/quarkus/component/opentelemetry2}/it/TraceProcessorsTestProfile.java (87%)


(camel-quarkus) 04/05: [fixes #3037] Use preferred way for handling gRPC onError

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8d9dbfa541330239eed90b01bb74114ca3a0318d
Author: Lukas Lowinger <ll...@redhat.com>
AuthorDate: Fri Nov 14 16:31:42 2025 +0100

    [fixes #3037] Use preferred way for handling gRPC onError
---
 integration-tests/grpc/README.adoc                 | 34 ++++++++++
 .../quarkus/component/grpc/it/PingPongImpl.java    | 74 ----------------------
 .../camel/quarkus/component/grpc/it/GrpcTest.java  | 29 +++++----
 3 files changed, 50 insertions(+), 87 deletions(-)

diff --git a/integration-tests/grpc/README.adoc b/integration-tests/grpc/README.adoc
new file mode 100644
index 0000000000..1bee1528b1
--- /dev/null
+++ b/integration-tests/grpc/README.adoc
@@ -0,0 +1,34 @@
+== gRPC integration tests
+
+To generate implementation of GRPC stub (for eg. more detailed understanding of how it actually works under the hood), you can use `mvn clean install -DskipTests -Dquarkus.package.jar.decompiler.enabled=true` in this module.
+Then you can note `target/decompiler/generated-bytecode/org/apache/camel/quarkus/component/grpc/it/model/PingPongGrpc\$PingPongImplBaseQuarkusMethodHandler.java` which contains something like:
+
+[source,java]
+----
+@Dependent
+public class PingPongGrpc$PingPongImplBaseQuarkusMethodHandler extends PingPongImplBase implements CamelQuarkusBindableService {
+   private GrpcMethodHandler methodHandler;
+
+   public void setMethodHandler(GrpcMethodHandler var1) {
+      this.methodHandler = var1;
+   }
+
+   public StreamObserver pingAsyncAsync(StreamObserver var1) {
+      return this.methodHandler.handleForConsumerStrategy(var1, "pingAsyncAsync");
+   }
+
+   public StreamObserver pingAsyncSync(StreamObserver var1) {
+      return this.methodHandler.handleForConsumerStrategy(var1, "pingAsyncSync");
+   }
+
+   public void pingSyncAsync(PingRequest var1, StreamObserver var2) {
+      this.methodHandler.handle(var1, var2, "pingSyncAsync");
+   }
+
+   public void pingSyncSync(PingRequest var1, StreamObserver var2) {
+      this.methodHandler.handle(var1, var2, "pingSyncSync");
+   }
+}
+----
+
+where the `GrpcMethodHandler` is the bridge from gRPC into the Camel routing engine.
diff --git a/integration-tests/grpc/src/main/java/org/apache/camel/quarkus/component/grpc/it/PingPongImpl.java b/integration-tests/grpc/src/main/java/org/apache/camel/quarkus/component/grpc/it/PingPongImpl.java
deleted file mode 100644
index 40fb93b61c..0000000000
--- a/integration-tests/grpc/src/main/java/org/apache/camel/quarkus/component/grpc/it/PingPongImpl.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.grpc.it;
-
-import io.grpc.stub.StreamObserver;
-import org.apache.camel.quarkus.component.grpc.it.model.PingRequest;
-import org.apache.camel.quarkus.component.grpc.it.model.PongResponse;
-import org.jboss.logging.Logger;
-
-public class PingPongImpl extends org.apache.camel.quarkus.component.grpc.it.model.PingPongGrpc.PingPongImplBase {
-    private static final Logger LOG = Logger.getLogger(PingPongImpl.class);
-    static final String GRPC_TEST_PONG_VALUE = "PONG";
-
-    @Override
-    public void pingSyncSync(PingRequest request, StreamObserver<PongResponse> responseObserver) {
-        LOG.infof("gRPC server pingSyncSync received data from PingPong service PingId=%s PingName=%s", request.getPingId(),
-                request.getPingName());
-        PongResponse response = PongResponse.newBuilder().setPongName(request.getPingName() + GRPC_TEST_PONG_VALUE)
-                .setPongId(request.getPingId()).build();
-
-        responseObserver.onNext(response);
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public void pingSyncAsync(PingRequest request, StreamObserver<PongResponse> responseObserver) {
-        LOG.infof("gRPC server pingSyncAsync received data from PingPong service PingId=%s PingName=%s", request.getPingId(),
-                request.getPingName());
-        PongResponse response = PongResponse.newBuilder().setPongName(request.getPingName() + GRPC_TEST_PONG_VALUE)
-                .setPongId(request.getPingId()).build();
-
-        responseObserver.onNext(response);
-        responseObserver.onCompleted();
-    }
-
-    @Override
-    public StreamObserver<PingRequest> pingAsyncAsync(StreamObserver<PongResponse> responseObserver) {
-        return new StreamObserver<>() {
-            @Override
-            public void onNext(PingRequest request) {
-                LOG.infof("gRPC server pingAsyncAsync received data from PingPong service PingId=%s PingName=%s",
-                        request.getPingId(),
-                        request.getPingName());
-                PongResponse response = PongResponse.newBuilder().setPongName(request.getPingName() + GRPC_TEST_PONG_VALUE)
-                        .setPongId(request.getPingId()).build();
-                responseObserver.onNext(response);
-            }
-
-            @Override
-            public void onError(Throwable throwable) {
-                responseObserver.onError(throwable);
-            }
-
-            @Override
-            public void onCompleted() {
-                responseObserver.onCompleted();
-            }
-        };
-    }
-}
diff --git a/integration-tests/grpc/src/test/java/org/apache/camel/quarkus/component/grpc/it/GrpcTest.java b/integration-tests/grpc/src/test/java/org/apache/camel/quarkus/component/grpc/it/GrpcTest.java
index acfd42b6d7..961807b4cc 100644
--- a/integration-tests/grpc/src/test/java/org/apache/camel/quarkus/component/grpc/it/GrpcTest.java
+++ b/integration-tests/grpc/src/test/java/org/apache/camel/quarkus/component/grpc/it/GrpcTest.java
@@ -63,7 +63,6 @@ import static org.apache.camel.component.grpc.GrpcConstants.GRPC_EVENT_TYPE_ON_E
 import static org.apache.camel.component.grpc.GrpcConstants.GRPC_EVENT_TYPE_ON_NEXT;
 import static org.apache.camel.component.grpc.GrpcConstants.GRPC_METHOD_NAME_HEADER;
 import static org.apache.camel.quarkus.component.grpc.it.GrpcRoute.GRPC_JWT_SECRET;
-import static org.apache.camel.quarkus.component.grpc.it.PingPongImpl.GRPC_TEST_PONG_VALUE;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -81,6 +80,7 @@ import static org.junit.jupiter.api.Assertions.fail;
 class GrpcTest {
 
     private static final String GRPC_TEST_PING_VALUE = "PING";
+    private static final String GRPC_TEST_PONG_VALUE = "PONG";
     private static final int GRPC_TEST_PING_ID = 1234;
     private static final Logger LOG = Logger.getLogger(GrpcTest.class);
 
@@ -198,15 +198,27 @@ class GrpcTest {
         Config config = ConfigProvider.getConfig();
         Integer port = config.getValue("camel.grpc.test.forward.error.server.port", Integer.class);
         CountDownLatch latch = new CountDownLatch(1);
+        PingRequest pingRequest = PingRequest.newBuilder()
+                .setPingName(GRPC_TEST_PING_VALUE)
+                .setPingId(GRPC_TEST_PING_ID)
+                .build();
 
         ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", port).usePlaintext().build();
         try {
             PingPongStub pingPongStub = PingPongGrpc.newStub(channel);
             LOG.info("forwardOnError: preparing observers");
-            PongResponseStreamObserver responseObserver = new PongResponseStreamObserver(latch, true);
+            PongResponseStreamObserver responseObserver = new PongResponseStreamObserver(latch);
             StreamObserver<PingRequest> requestObserver = pingPongStub.pingAsyncAsync(responseObserver);
-            LOG.info("forwardOnError: calling onNext(null)");
-            requestObserver.onNext(null);
+            // GRPC uses DelayedClientCall, which queues requests before real call is ready.
+            // Thus we first need to establish real call with calling eg. `onNext` and wait for its response.
+            requestObserver.onNext(pingRequest);
+            Awaitility.await().atMost(5, TimeUnit.SECONDS).until(() -> responseObserver.getPongResponse() != null);
+            // Then we can finally mimic failure by calling `onError`.
+            // If we wouldn't establish the real call first, the DelayedClientCall would just call `onError` on ResponseObserver immediately without propagating it to real call
+            // (which we need for testing forwardOnError option on camel server side).
+            // More details in: https://github.com/grpc/grpc-java/blob/v1.76.0/core/src/main/java/io/grpc/internal/DelayedClientCall.java#L256
+            // Also note this comment https://github.com/apache/camel-quarkus/issues/7897#issuecomment-3480980023
+            requestObserver.onError(new IllegalStateException("Forced exception"));
 
             LOG.info("forwardOnError: waiting latch.await(5s)");
             assertTrue(latch.await(5, TimeUnit.SECONDS));
@@ -657,17 +669,11 @@ class GrpcTest {
 
     static final class PongResponseStreamObserver implements StreamObserver<PongResponse> {
         private final CountDownLatch latch;
-        private final boolean simulateError;
         private PongResponse pongResponse;
         private volatile Throwable errorResponse;
 
         public PongResponseStreamObserver(CountDownLatch latch) {
-            this(latch, false);
-        }
-
-        public PongResponseStreamObserver(CountDownLatch latch, boolean simulateError) {
             this.latch = latch;
-            this.simulateError = simulateError;
         }
 
         public PongResponse getPongResponse() {
@@ -682,9 +688,6 @@ class GrpcTest {
         public void onNext(PongResponse value) {
             LOG.infof("PongResponseStreamObserver#onNext:%s", value);
             pongResponse = value;
-            if (simulateError) {
-                throw new IllegalStateException("Forced exception");
-            }
         }
 
         @Override


(camel-quarkus) 03/05: Increase debezium-sqlserver init script wait time to 30 seconds

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 764232080063ed89507336cacca6897e3ec78898
Author: James Netherton <ja...@gmail.com>
AuthorDate: Fri Nov 14 07:48:10 2025 +0000

    Increase debezium-sqlserver init script wait time to 30 seconds
---
 .../debezium/mssql/src/test/resources/initSqlserver.sql      | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/integration-test-groups/debezium/mssql/src/test/resources/initSqlserver.sql b/integration-test-groups/debezium/mssql/src/test/resources/initSqlserver.sql
index 8120a878c4..31f2e94705 100644
--- a/integration-test-groups/debezium/mssql/src/test/resources/initSqlserver.sql
+++ b/integration-test-groups/debezium/mssql/src/test/resources/initSqlserver.sql
@@ -19,6 +19,13 @@
 CREATE DATABASE testDB;
 
 USE testDB;
+
+-- sql agent is started by providing of the system property, but it could happen that it is still starting during this
+-- execution. In that case, this script fails during setting of cdc for table. In case of failure because of:
+-- 'The error returned was 14258: Cannot perform this operation while SQLServerAgent is starting.'
+-- please increase following delay accordingly
+WAITFOR DELAY '00:00:30'
+
 EXEC sys.sp_cdc_enable_db;
 
 CREATE SCHEMA Test;
@@ -28,11 +35,6 @@ CREATE TABLE Test.COMPANY(
     CITY  varchar(255),
     PRIMARY KEY (NAME)
 );
--- sql agent is started by providing of the system property, but it could happen that it is still starting during this
--- execution. In that case, this script fails during setting of cdc for table. In case of failure because of:
--- 'The error returned was 14258: Cannot perform this operation while SQLServerAgent is starting.'
--- please increase following delay accordingly
-WAITFOR DELAY '00:00:10'
 
 EXEC sys.sp_cdc_enable_table @source_schema=N'Test', @source_name=N'COMPANY', @role_name = NULL,@filegroup_name=N'PRIMARY', @supports_net_changes=0;
 INSERT INTO Test.COMPANY (name, city) VALUES ('init', 'init');


(camel-quarkus) 02/05: Port camel-quarkus-opentelemetry tests to camel-quarkus-opentelemetry2

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 01ed24a024c2e451d40295dc591261c6b384c990
Author: Lukas Lowinger <ll...@redhat.com>
AuthorDate: Thu Nov 13 14:10:42 2025 +0000

    Port camel-quarkus-opentelemetry tests to camel-quarkus-opentelemetry2
    
    Fixes #7806
    
    Co-authored-by: jamesnetherton <ja...@gmail.com>
---
 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 b5fbc85c1e..5b8f43a43d 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..8a2f758e90 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;
+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("jdbcQuery",
+                spans.get(5).get(CODE_FUNCTION.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");
     }
 }


(camel-quarkus) 05/05: Add camel. extension prefix for route resources supported for hot reload

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 08bb38a8dc03b51003ce327615428ea9f5c75b7c
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Nov 17 08:16:38 2025 +0000

    Add camel. extension prefix for route resources supported for hot reload
    
    Fixes #7971
---
 .../quarkus/core/deployment/util/CamelSupport.java |   3 +-
 integration-tests-jvm/main-devmode/pom.xml         |  17 +++
 ...ternWithSupportedFileExtensionsDevModeTest.java | 122 +++++++++++++++++++++
 3 files changed, 141 insertions(+), 1 deletion(-)

diff --git a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java
index 3429a0b215..b103c8751f 100644
--- a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java
+++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/util/CamelSupport.java
@@ -162,11 +162,12 @@ public final class CamelSupport {
         Set<String> extensions = new HashSet<>();
         if (capabilities.isPresent(CamelCapabilities.XML_JAXB) || capabilities.isPresent(CamelCapabilities.XML_IO_DSL)) {
             extensions.add("xml");
+            extensions.add("camel.xml");
         }
 
         if (capabilities.isPresent(CamelCapabilities.YAML_DSL)) {
             extensions.add("yaml");
-            extensions.add("yml");
+            extensions.add("camel.yaml");
         }
 
         if (capabilities.isPresent(CamelCapabilities.JAVA_JOOR_DSL)) {
diff --git a/integration-tests-jvm/main-devmode/pom.xml b/integration-tests-jvm/main-devmode/pom.xml
index aaa8d517f2..41953ed7c1 100644
--- a/integration-tests-jvm/main-devmode/pom.xml
+++ b/integration-tests-jvm/main-devmode/pom.xml
@@ -35,6 +35,10 @@
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-xml-io-dsl</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-yaml-dsl</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
             <artifactId>camel-quarkus-direct</artifactId>
@@ -171,6 +175,19 @@
                         </exclusion>
                     </exclusions>
                 </dependency>
+                <dependency>
+                    <groupId>org.apache.camel.quarkus</groupId>
+                    <artifactId>camel-quarkus-yaml-dsl-deployment</artifactId>
+                    <version>${project.version}</version>
+                    <type>pom</type>
+                    <scope>test</scope>
+                    <exclusions>
+                        <exclusion>
+                            <groupId>*</groupId>
+                            <artifactId>*</artifactId>
+                        </exclusion>
+                    </exclusions>
+                </dependency>
             </dependencies>
         </profile>
     </profiles>
diff --git a/integration-tests-jvm/main-devmode/src/test/java/org/apache/camel/quarkus/main/CamelMainRoutesIncludePatternWithSupportedFileExtensionsDevModeTest.java b/integration-tests-jvm/main-devmode/src/test/java/org/apache/camel/quarkus/main/CamelMainRoutesIncludePatternWithSupportedFileExtensionsDevModeTest.java
new file mode 100644
index 0000000000..485dda75b3
--- /dev/null
+++ b/integration-tests-jvm/main-devmode/src/test/java/org/apache/camel/quarkus/main/CamelMainRoutesIncludePatternWithSupportedFileExtensionsDevModeTest.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.main;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import io.quarkus.test.QuarkusDevModeTest;
+import io.restassured.RestAssured;
+import io.restassured.response.Response;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.Asset;
+import org.jboss.shrinkwrap.api.asset.StringAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
+
+public class CamelMainRoutesIncludePatternWithSupportedFileExtensionsDevModeTest {
+    static final String ROUTE_ID_BASE = "route";
+    static final String XML_ROUTE_ID = "xml-" + ROUTE_ID_BASE;
+    static final String CAMEL_XML_ROUTE_ID = "camel-" + XML_ROUTE_ID;
+    static final String YAML_ROUTE_ID = "yaml-" + ROUTE_ID_BASE;
+    static final String CAMEL_YAML_ROUTE_ID = "camel-" + YAML_ROUTE_ID;
+
+    @RegisterExtension
+    static final QuarkusDevModeTest TEST = new QuarkusDevModeTest()
+            .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
+                    .addClass(CamelSupportResource.class)
+                    .addAsResource(routeXml(XML_ROUTE_ID), "camel/routes.xml")
+                    .addAsResource(routeXml(CAMEL_XML_ROUTE_ID), "camel/routes.camel.xml")
+                    .addAsResource(routeYaml(YAML_ROUTE_ID), "camel/routes.yaml")
+                    .addAsResource(routeYaml(CAMEL_YAML_ROUTE_ID), "camel/routes.camel.yaml")
+                    .addAsResource(applicationProperties(), "application.properties"));
+
+    public static Asset routeXml(String routeId) {
+        String xml = """
+                <?xml version="1.0" encoding="UTF-8"?>
+                    <routes>
+                        <route id="%s">
+                            <from uri="direct:%s"/>
+                            <setBody><constant>Hello World</constant></setBody>
+                        </route>
+                    </routes>""".formatted(routeId, routeId);
+        return new StringAsset(xml);
+    }
+
+    public static Asset routeYaml(String routeId) {
+        String yaml = """
+                    - route:
+                        id: "%s"
+                        from:
+                          uri: "direct:%s"
+                          steps:
+                            - setBody:
+                                constant: "Hello World"
+                """.formatted(routeId, routeId);
+        return new StringAsset(yaml);
+    }
+
+    public static Asset applicationProperties() {
+        Writer writer = new StringWriter();
+
+        Properties props = new Properties();
+        props.setProperty("quarkus.banner.enabled", "false");
+
+        try {
+            props.store(writer, "");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        return new StringAsset(writer.toString());
+    }
+
+    @Test
+    void routesDiscoveryWithSupportedFileExtensions() {
+        await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
+            Response res = RestAssured.when().get("/test/describe").thenReturn();
+
+            assertThat(res.statusCode()).isEqualTo(200);
+            assertThat(res.body().jsonPath().getList("routes", String.class)).containsOnly(XML_ROUTE_ID, CAMEL_XML_ROUTE_ID,
+                    YAML_ROUTE_ID, CAMEL_YAML_ROUTE_ID);
+        });
+
+        Map<String, String> fileToRouteIdMappings = Map.of("camel/routes.xml", XML_ROUTE_ID,
+                "camel/routes.camel.xml", CAMEL_XML_ROUTE_ID,
+                "camel/routes.yaml", YAML_ROUTE_ID,
+                "camel/routes.camel.yaml", CAMEL_YAML_ROUTE_ID);
+
+        fileToRouteIdMappings.forEach((path, routeId) -> {
+            TEST.modifyResourceFile(path, route -> route.replaceAll(routeId, routeId + "-updated"));
+
+            await().atMost(10, TimeUnit.SECONDS).untilAsserted(() -> {
+                Response res = RestAssured.when().get("/test/describe").thenReturn();
+
+                assertThat(res.statusCode()).isEqualTo(200);
+                assertThat(res.body().jsonPath().getList("routes", String.class)).contains(routeId + "-updated");
+            });
+        });
+    }
+}


(camel-quarkus) 01/05: Eagerly initialize opentelemetry2 extension OpenTelemetryTracer bean

Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e99a02fa52113ae663fab7ce0b8a3027359624e9
Author: James Netherton <ja...@gmail.com>
AuthorDate: Thu Nov 13 14:07:30 2025 +0000

    Eagerly initialize opentelemetry2 extension OpenTelemetryTracer bean
    
    Fixes #7964
---
 .../component/opentelemetry2/OpenTelemetry2TracerProducer.java       | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/OpenTelemetry2TracerProducer.java b/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/OpenTelemetry2TracerProducer.java
index fdc4c67b41..385a77de25 100644
--- a/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/OpenTelemetry2TracerProducer.java
+++ b/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/OpenTelemetry2TracerProducer.java
@@ -21,6 +21,7 @@ import io.quarkus.opentelemetry.runtime.config.runtime.OTelRuntimeConfig;
 import jakarta.enterprise.inject.Produces;
 import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
+import org.apache.camel.CamelContext;
 import org.apache.camel.opentelemetry2.OpenTelemetryTracer;
 
 @Singleton
@@ -35,7 +36,7 @@ public class OpenTelemetry2TracerProducer {
     @Produces
     @Singleton
     @DefaultBean
-    public OpenTelemetryTracer getOpenTelemetry() {
+    public OpenTelemetryTracer getOpenTelemetry(CamelContext camelContext) {
         if (!oTelRuntimeConfig.sdkDisabled()) {
             OpenTelemetryTracer openTelemetryTracer = new OpenTelemetryTracer();
             if (config.excludePatterns().isPresent()) {
@@ -46,6 +47,8 @@ public class OpenTelemetry2TracerProducer {
                 openTelemetryTracer.setTraceProcessors(config.traceProcessors());
             }
 
+            openTelemetryTracer.init(camelContext);
+
             return openTelemetryTracer;
         }
         return null;