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 2026/06/19 08:45:47 UTC
(camel-quarkus) 05/07: feat(extensions): support telemetry include processor field
This is an automated email from the ASF dual-hosted git repository.
jamesnetherton pushed a commit to branch camel-main
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 307c621399ac4ef5de1bfca0ccf8f331f21b04a4
Author: Pasquale Congiusti <pa...@gmail.com>
AuthorDate: Tue May 26 09:16:11 2026 +0200
feat(extensions): support telemetry include processor field
Ref https://github.com/apache/camel/pull/23500
Co-Authored-By: James Netherton <ja...@gmail.com>
---
.../pages/reference/extensions/opentelemetry2.adoc | 7 ++++
.../pages/reference/extensions/telemetry-dev.adoc | 7 ++++
.../deployment/Opentelemetry2Test.java | 3 ++
extensions/opentelemetry2/runtime/pom.xml | 5 +++
.../graal/OpenTelemetryTracerSubstitutions.java | 41 ++++++++++++++++++++++
.../opentelemetry2/CamelOpenTelemetry2Config.java | 8 +++++
.../OpenTelemetry2TracerProducer.java | 1 +
.../telemetry/dev/CamelTelemetryDevConfig.java | 8 +++++
.../telemetry/dev/TelemetryDevTracerProducer.java | 4 +++
.../opentelemetry2/it/Opentelemetry2Test.java | 19 +++++-----
10 files changed, 94 insertions(+), 9 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc b/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
index da7d5d96c9..4adb5723e4 100644
--- a/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
@@ -136,6 +136,13 @@ pattern can take the following forms:
| `string`
|
+a| [[quarkus-camel-opentelemetry2-include-patterns]]`link:#quarkus-camel-opentelemetry2-include-patterns[quarkus.camel.opentelemetry2.include-patterns]`
+
+Sets include pattern(s) that will explicitly enable tracing for Camel processors that matches the pattern.
+Multiple patterns can be separated by comma. All processors included by default if nothing is specified.
+| `string`
+|
+
a| [[quarkus-camel-opentelemetry2-trace-processors]]`link:#quarkus-camel-opentelemetry2-trace-processors[quarkus.camel.opentelemetry2.trace-processors]`
Sets whether to create new telemetry spans for each Camel custom Processor. Use the excludePatterns property to
diff --git a/docs/modules/ROOT/pages/reference/extensions/telemetry-dev.adoc b/docs/modules/ROOT/pages/reference/extensions/telemetry-dev.adoc
index b7ec28941c..cc8bef3020 100644
--- a/docs/modules/ROOT/pages/reference/extensions/telemetry-dev.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/telemetry-dev.adoc
@@ -65,6 +65,13 @@ pattern can take the following forms:
| `string`
|
+a| [[quarkus-camel-telemetrydev-include-patterns]]`link:#quarkus-camel-telemetrydev-include-patterns[quarkus.camel.telemetryDev.include-patterns]`
+
+Sets include pattern(s) that will explicitly enable tracing for Camel processors that matches the pattern.
+Multiple patterns can be separated by comma. All processors included by default if nothing is specified.
+| `string`
+|
+
a| [[quarkus-camel-telemetrydev-trace-processors]]`link:#quarkus-camel-telemetrydev-trace-processors[quarkus.camel.telemetryDev.trace-processors]`
Sets whether to create new telemetry spans for each Camel custom Processor. Use the excludePatterns property to
diff --git a/extensions/opentelemetry2/deployment/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/deployment/Opentelemetry2Test.java b/extensions/opentelemetry2/deployment/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/deployment/Opentelemetry2Test.java
index b11feb3c54..8962e701bf 100644
--- a/extensions/opentelemetry2/deployment/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/deployment/Opentelemetry2Test.java
+++ b/extensions/opentelemetry2/deployment/src/test/java/org/apache/camel/quarkus/component/opentelemetry2/deployment/Opentelemetry2Test.java
@@ -34,10 +34,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public class Opentelemetry2Test {
+ private static final String INCLUDE_PATTERNS = "netty-http:*,netty-http:/prefix/.*";
private static final String EXCLUDE_PATTERNS = "platform-http:*,platform-http:/prefix/.*";
@RegisterExtension
static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
+ .overrideConfigKey("quarkus.camel.opentelemetry2.include-patterns", INCLUDE_PATTERNS)
.overrideConfigKey("quarkus.camel.opentelemetry2.exclude-patterns", EXCLUDE_PATTERNS)
.overrideConfigKey("quarkus.camel.opentelemetry2.trace-processors", "true")
.overrideConfigKey("quarkus.camel.opentelemetry2.trace-headers-inclusion", "true")
@@ -53,6 +55,7 @@ public class Opentelemetry2Test {
OpenTelemetryTracer tracer = tracers.iterator().next();
assertInstanceOf(OpenTelemetryTracer.class, tracer);
+ assertEquals(INCLUDE_PATTERNS, tracer.getIncludePatterns());
assertEquals(EXCLUDE_PATTERNS, tracer.getExcludePatterns());
assertTrue(tracer.isTraceProcessors());
assertTrue(tracer.isTraceHeadersInclusion());
diff --git a/extensions/opentelemetry2/runtime/pom.xml b/extensions/opentelemetry2/runtime/pom.xml
index 379ffdd560..26709cb152 100644
--- a/extensions/opentelemetry2/runtime/pom.xml
+++ b/extensions/opentelemetry2/runtime/pom.xml
@@ -58,6 +58,11 @@
<groupId>org.apache.camel</groupId>
<artifactId>camel-opentelemetry2</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.graalvm.sdk</groupId>
+ <artifactId>nativeimage</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
<build>
diff --git a/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/opentelemetry2/graal/OpenTelemetryTracerSubstitutions.java b/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/opentelemetry2/graal/OpenTelemetryTracerSubstitutions.java
new file mode 100644
index 0000000000..0a61229d57
--- /dev/null
+++ b/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/opentelemetry2/graal/OpenTelemetryTracerSubstitutions.java
@@ -0,0 +1,41 @@
+/*
+ * 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.opentelemetry2.graal;
+
+import com.oracle.svm.core.annotate.Substitute;
+import com.oracle.svm.core.annotate.TargetClass;
+import org.apache.camel.opentelemetry2.OpenTelemetryTracer;
+
+/**
+ * Disables native-unfriendly code meant for Camel JBang dev mode.
+ * The initDevSpanExporter and initOtlpReceiver methods initialize development/debugging
+ * features that are not needed in native mode and rely on dynamic features unsuitable
+ * for native compilation.
+ */
+@TargetClass(OpenTelemetryTracer.class)
+final class OpenTelemetryTracerSubstitutions {
+
+ @Substitute
+ private void initDevSpanExporter() {
+ // No-op in native mode
+ }
+
+ @Substitute
+ private void initOtlpReceiver() {
+ // No-op in native mode
+ }
+}
diff --git a/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/CamelOpenTelemetry2Config.java b/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/CamelOpenTelemetry2Config.java
index 4b38327425..5486c03a47 100644
--- a/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/CamelOpenTelemetry2Config.java
+++ b/extensions/opentelemetry2/runtime/src/main/java/org/apache/camel/quarkus/component/opentelemetry2/CamelOpenTelemetry2Config.java
@@ -40,6 +40,14 @@ public interface CamelOpenTelemetry2Config {
*/
Optional<String> excludePatterns();
+ /**
+ * Sets include pattern(s) that will explicitly enable tracing for Camel processors that matches the pattern.
+ * Multiple patterns can be separated by comma. All processors included by default if nothing is specified.
+ *
+ * @asciidoclet
+ */
+ Optional<String> includePatterns();
+
/**
* Sets whether to create new telemetry spans for each Camel custom Processor. Use the excludePatterns property to
* filter
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 4d1ed9733c..69e597d64c 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
@@ -40,6 +40,7 @@ public class OpenTelemetry2TracerProducer {
if (!oTelRuntimeConfig.sdkDisabled()) {
OpenTelemetryTracer openTelemetryTracer = new OpenTelemetryTracer();
config.excludePatterns().ifPresent(openTelemetryTracer::setExcludePatterns);
+ config.includePatterns().ifPresent(openTelemetryTracer::setIncludePatterns);
openTelemetryTracer.setTraceProcessors(config.traceProcessors());
openTelemetryTracer.setDisableCoreProcessors(config.disableCoreProcessors());
openTelemetryTracer.setTraceHeadersInclusion(config.traceHeadersInclusion());
diff --git a/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/CamelTelemetryDevConfig.java b/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/CamelTelemetryDevConfig.java
index 66c7bbd304..193f1de9b8 100644
--- a/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/CamelTelemetryDevConfig.java
+++ b/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/CamelTelemetryDevConfig.java
@@ -41,6 +41,14 @@ public interface CamelTelemetryDevConfig {
*/
Optional<String> excludePatterns();
+ /**
+ * Sets include pattern(s) that will explicitly enable tracing for Camel processors that matches the pattern.
+ * Multiple patterns can be separated by comma. All processors included by default if nothing is specified.
+ *
+ * @asciidoclet
+ */
+ Optional<String> includePatterns();
+
/**
* Sets whether to create new telemetry spans for each Camel custom Processor. Use the excludePatterns property to
* filter
diff --git a/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/TelemetryDevTracerProducer.java b/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/TelemetryDevTracerProducer.java
index 186475ac43..60a2b065b4 100644
--- a/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/TelemetryDevTracerProducer.java
+++ b/extensions/telemetry-dev/runtime/src/main/java/org/apache/camel/quarkus/component/telemetry/dev/TelemetryDevTracerProducer.java
@@ -37,6 +37,10 @@ public class TelemetryDevTracerProducer {
telemetryDevTracer.setExcludePatterns(config.excludePatterns().get());
}
+ if (config.includePatterns().isPresent()) {
+ telemetryDevTracer.setIncludePatterns(config.includePatterns().get());
+ }
+
if (config.traceProcessors()) {
telemetryDevTracer.setTraceProcessors(config.traceProcessors());
}
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 0b033e0aa3..a900ab63d0 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
@@ -139,7 +139,7 @@ class Opentelemetry2Test {
@Test
public void testTracedBeanTo() {
- int spanPerTrace = 6;
+ int spanPerTrace = 5;
String name = "Camel Quarkus OpenTelemetry";
RestAssured.get("/opentelemetry2/greet/" + name)
.then()
@@ -152,12 +152,13 @@ class Opentelemetry2Test {
List<Map<String, String>> spans = getSpans();
assertEquals(spanPerTrace, spans.size());
- // The inner span generated will depend on the "to" processor node
+ // Span 0 and 1 (bean EVENT_SENT and bean method) both have the same parent (direct endpoint span)
+ // because bean method's parent is set by OTel context from scope wrapper, not the event span
assertEquals(spans.get(2).get("spanId"), spans.get(0).get("parentId"));
assertEquals(spans.get(2).get("spanId"), spans.get(1).get("parentId"));
assertEquals(spans.get(3).get("spanId"), spans.get(2).get("parentId"));
- assertEquals(SpanKind.INTERNAL.name(), spans.get(4).get("kind"));
- assertEquals(SpanKind.SERVER.name(), spans.get(5).get("kind"));
+ assertEquals(SpanKind.INTERNAL.name(), spans.get(3).get("kind"));
+ assertEquals(SpanKind.SERVER.name(), spans.get(4).get("kind"));
}
@Test
@@ -214,7 +215,7 @@ class Opentelemetry2Test {
@ParameterizedTest
@ValueSource(strings = { "http", "vertx-http" })
void testHttpInvocation(String httpComponent) {
- int spanPerTrace = 10;
+ int spanPerTrace = 9;
RestAssured.given()
.queryParam("httpComponent", httpComponent)
.get("/greeting")
@@ -228,20 +229,20 @@ class Opentelemetry2Test {
assertEquals(spanPerTrace, spans.size());
// Verify root doesn't have parent
- assertEquals("0000000000000000", spans.get(9).get("parentId"));
+ assertEquals("0000000000000000", spans.get(8).get("parentId"));
// Verify the span hierarchy
- assertEquals(spans.get(8).get("parentId"), spans.get(9).get("spanId"));
assertEquals(spans.get(7).get("parentId"), spans.get(8).get("spanId"));
+ assertEquals(spans.get(6).get("parentId"), spans.get(7).get("spanId"));
// Last two spans have the same parent
// For /greeting there is no existing tracing in progress. For /greeting-provider there is, so its related to the trace propagation
assertEquals(spans.get(1).get("parentId"), spans.get(2).get("spanId"));
assertEquals(spans.get(0).get("parentId"), spans.get(2).get("spanId"));
- assertEquals(SpanKind.SERVER.name(), spans.get(9).get("kind"));
+ assertEquals(SpanKind.SERVER.name(), spans.get(8).get("kind"));
assertEquals(SpanKind.SERVER.name(), spans.get(2).get("kind"));
assertEquals(SpanKind.SERVER.name(), spans.get(3).get("kind"));
assertEquals(SpanKind.CLIENT.name(), spans.get(4).get("kind"));
- assertEquals(SpanKind.SERVER.name(), spans.get(8).get("kind"));
+ assertEquals(SpanKind.SERVER.name(), spans.get(7).get("kind"));
}
}