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 <[email protected]> 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 <[email protected]> --- .../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")); } }
