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 2023/04/17 20:14:54 UTC

[camel-quarkus] branch main updated: Test OpenTelemetry extension integration with opentelemetry-jdbc

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


The following commit(s) were added to refs/heads/main by this push:
     new de9e01ec3d Test OpenTelemetry extension integration with opentelemetry-jdbc
de9e01ec3d is described below

commit de9e01ec3dd7cd41e47a615674bbb169c140341f
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Apr 17 13:54:10 2023 +0100

    Test OpenTelemetry extension integration with opentelemetry-jdbc
    
    Fixes #4789
---
 integration-tests/opentelemetry/pom.xml            | 23 ++++++++++
 ...enTelemetryResource.java => JdbcQueryBean.java} | 50 +++++++++++-----------
 .../opentelemetry/it/OpenTelemetryResource.java    |  7 +++
 .../it/OpenTelemetryRouteBuilder.java              |  3 ++
 .../src/main/resources/application.properties      |  1 +
 .../opentelemetry/it/OpenTelemetryTest.java        | 31 ++++++++++++++
 6 files changed, 91 insertions(+), 24 deletions(-)

diff --git a/integration-tests/opentelemetry/pom.xml b/integration-tests/opentelemetry/pom.xml
index 643d7c3c90..61723f8db3 100644
--- a/integration-tests/opentelemetry/pom.xml
+++ b/integration-tests/opentelemetry/pom.xml
@@ -59,10 +59,22 @@
             <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>
         </dependency>
+        <dependency>
+            <groupId>io.opentelemetry.instrumentation</groupId>
+            <artifactId>opentelemetry-jdbc</artifactId>
+        </dependency>
 
         <!-- test dependencies -->
         <dependency>
@@ -186,6 +198,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/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/JdbcQueryBean.java
similarity index 50%
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/JdbcQueryBean.java
index 519a6bbcaa..ead2d1db0d 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/JdbcQueryBean.java
@@ -16,33 +16,35 @@
  */
 package org.apache.camel.quarkus.component.opentelemetry.it;
 
-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;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
 
-@Path("/opentelemetry")
-@ApplicationScoped
-public class OpenTelemetryResource {
+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;
-
-    @Path("/trace")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String traceRoute() {
-        return producerTemplate.requestBody("direct:start", null, String.class);
-    }
+    AgroalDataSource dataSource;
 
-    @Path("/greet/{name}")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String traceRoute(@PathParam("name") String name) {
-        return producerTemplate.requestBody("direct:greet", name, 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/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 519a6bbcaa..8540e55039 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
@@ -45,4 +45,11 @@ public class OpenTelemetryResource {
     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/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 3c3f7e662b..b414a0df31 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
@@ -38,5 +38,8 @@ public class OpenTelemetryRouteBuilder extends RouteBuilder {
 
         from("timer:filtered?repeatCount=5&delay=-1")
                 .setBody().constant("Route filtered from tracing");
+
+        from("direct:jdbcQuery")
+                .to("bean:jdbcQueryBean");
     }
 }
diff --git a/integration-tests/opentelemetry/src/main/resources/application.properties b/integration-tests/opentelemetry/src/main/resources/application.properties
index b227fdc725..7be84ab144 100644
--- a/integration-tests/opentelemetry/src/main/resources/application.properties
+++ b/integration-tests/opentelemetry/src/main/resources/application.properties
@@ -22,3 +22,4 @@
 quarkus.camel.opentelemetry.exclude-patterns = timer:filtered*
 quarkus.otel.bsp.schedule.delay=1
 quarkus.otel.bsp.export.timeout=5s
+quarkus.datasource.jdbc.telemetry=true
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 36913640a7..ce36394475 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
@@ -101,6 +101,37 @@ class OpenTelemetryTest {
         assertEquals(spans.get(1).get("parentId"), spans.get(2).get("spanId"));
     }
 
+    @Test
+    public void testTracedJdbcQuery() {
+        String timestamp = RestAssured.get("/opentelemetry/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() == 5);
+        List<Map<String, String>> spans = getSpans();
+        assertEquals(5, spans.size());
+        assertEquals(spans.get(0).get("parentId"), spans.get(1).get("parentId"));
+        assertEquals(spans.get(0).get("code.function"), "getConnection");
+
+        assertEquals(spans.get(1).get("parentId"), spans.get(2).get("spanId"));
+        assertEquals(spans.get(1).get("db.operation"), "SELECT");
+
+        assertEquals(spans.get(2).get("parentId"), spans.get(3).get("spanId"));
+        assertEquals(spans.get(2).get("camel.uri"), "bean://jdbcQueryBean");
+
+        assertEquals(spans.get(3).get("parentId"), spans.get(4).get("spanId"));
+        assertEquals(spans.get(3).get("camel.uri"), "direct://jdbcQuery");
+
+        assertEquals(spans.get(4).get("parentId"), "0000000000000000");
+        assertEquals(spans.get(4).get("code.function"), "jdbcQuery");
+    }
+
     private List<Map<String, String>> getSpans() {
         return RestAssured.given()
                 .get("/opentelemetry/exporter/spans")