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 8ea7bacc58 Add support for opentelemetry2 traceHeadersInclusion tracer
option
8ea7bacc58 is described below
commit 8ea7bacc583edd37d02319e8d5167bf715d97030
Author: James Netherton <[email protected]>
AuthorDate: Thu Feb 5 09:56:04 2026 +0000
Add support for opentelemetry2 traceHeadersInclusion tracer option
Fixes #8250
---
.../ROOT/pages/reference/extensions/opentelemetry2.adoc | 6 ++++++
.../opentelemetry2/deployment/Opentelemetry2Test.java | 2 ++
.../opentelemetry2/CamelOpenTelemetry2Config.java | 8 ++++++++
.../opentelemetry2/OpenTelemetry2TracerProducer.java | 12 +++---------
.../opentelemetry2/it/OpenTelemetry2Resource.java | 14 ++++++++++++++
.../opentelemetry2/it/OpenTelemetry2RouteBuilder.java | 3 +++
.../src/main/resources/application.properties | 1 +
.../component/opentelemetry2/it/Opentelemetry2Test.java | 11 +++++++++++
8 files changed, 48 insertions(+), 9 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
b/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
index cc033fc7fd..77a5f4da20 100644
--- a/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/opentelemetry2.adoc
@@ -142,6 +142,12 @@ Sets whether to create new OpenTelemetry spans for each
Camel Processor. Use the
out Processors.
| `boolean`
| `false`
+
+a|
[[quarkus-camel-opentelemetry2-trace-headers-inclusion]]`link:#quarkus-camel-opentelemetry2-trace-headers-inclusion[quarkus.camel.opentelemetry2.trace-headers-inclusion]`
+
+If set to `true`, adds the generated telemetry `CAMEL_TRACE_ID` and
`CAMEL_SPAN_ID` Exchange headers.
+| `boolean`
+| `false`
|===
[.configuration-legend]
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 5306f0a529..b11feb3c54 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
@@ -40,6 +40,7 @@ public class Opentelemetry2Test {
static final QuarkusUnitTest CONFIG = new QuarkusUnitTest()
.overrideConfigKey("quarkus.camel.opentelemetry2.exclude-patterns",
EXCLUDE_PATTERNS)
.overrideConfigKey("quarkus.camel.opentelemetry2.trace-processors", "true")
+
.overrideConfigKey("quarkus.camel.opentelemetry2.trace-headers-inclusion",
"true")
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class));
@Inject
@@ -54,5 +55,6 @@ public class Opentelemetry2Test {
assertInstanceOf(OpenTelemetryTracer.class, tracer);
assertEquals(EXCLUDE_PATTERNS, tracer.getExcludePatterns());
assertTrue(tracer.isTraceProcessors());
+ assertTrue(tracer.isTraceHeadersInclusion());
}
}
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 f310af6c42..6bbcb4cb5a 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
@@ -48,4 +48,12 @@ public interface CamelOpenTelemetry2Config {
*/
@WithDefault("false")
boolean traceProcessors();
+
+ /**
+ * If set to `true`, adds the generated telemetry `CAMEL_TRACE_ID` and
`CAMEL_SPAN_ID` Exchange headers.
+ *
+ * @asciidoclet
+ */
+ @WithDefault("false")
+ boolean traceHeadersInclusion();
}
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 385a77de25..4457ab406d 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
@@ -39,16 +39,10 @@ public class OpenTelemetry2TracerProducer {
public OpenTelemetryTracer getOpenTelemetry(CamelContext camelContext) {
if (!oTelRuntimeConfig.sdkDisabled()) {
OpenTelemetryTracer openTelemetryTracer = new
OpenTelemetryTracer();
- if (config.excludePatterns().isPresent()) {
-
openTelemetryTracer.setExcludePatterns(config.excludePatterns().get());
- }
-
- if (config.traceProcessors()) {
-
openTelemetryTracer.setTraceProcessors(config.traceProcessors());
- }
-
+
config.excludePatterns().ifPresent(openTelemetryTracer::setExcludePatterns);
+ openTelemetryTracer.setTraceProcessors(config.traceProcessors());
+
openTelemetryTracer.setTraceHeadersInclusion(config.traceHeadersInclusion());
openTelemetryTracer.init(camelContext);
-
return openTelemetryTracer;
}
return null;
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 fadf1361f1..9038dc22c8 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
@@ -23,7 +23,11 @@ import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
import org.apache.camel.ProducerTemplate;
+import org.apache.camel.telemetry.Tracer;
@Path("/opentelemetry2")
@ApplicationScoped
@@ -53,4 +57,14 @@ public class OpenTelemetry2Resource {
return producerTemplate.requestBody("direct:jdbcQuery", null,
Long.class);
}
+ @Path("/trace/headers")
+ @GET
+ public Response traceHeaders() {
+ Exchange result =
producerTemplate.request("direct:traceHeaderInclusion", null);
+ Message message = result.getMessage();
+ return Response.noContent()
+ .header("spanId", message.getHeader(Tracer.SPAN_HEADER,
String.class))
+ .header("traceId", message.getHeader(Tracer.TRACE_HEADER,
String.class))
+ .build();
+ }
}
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 b21980d090..ac5acfa933 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
@@ -41,5 +41,8 @@ public class OpenTelemetry2RouteBuilder extends RouteBuilder {
from("direct:jdbcQuery")
.to("bean:jdbcQueryBean");
+
+ from("direct:traceHeaderInclusion")
+ .log("Trace info: CAMEL_SPAN_ID=${header.CAMEL_SPAN_ID},
CAMEL_TRACE_ID=${header.CAMEL_TRACE_ID}");
}
}
diff --git
a/integration-tests/opentelemetry2/src/main/resources/application.properties
b/integration-tests/opentelemetry2/src/main/resources/application.properties
index 0be4baca18..ae57815127 100644
--- a/integration-tests/opentelemetry2/src/main/resources/application.properties
+++ b/integration-tests/opentelemetry2/src/main/resources/application.properties
@@ -15,6 +15,7 @@
## limitations under the License.
## ---------------------------------------------------------------------------
quarkus.camel.opentelemetry2.exclude-patterns = timer*
+quarkus.camel.opentelemetry2.trace-headers-inclusion=true
quarkus.otel.bsp.schedule.delay=1
quarkus.otel.bsp.export.timeout=5s
quarkus.datasource.db-kind=postgresql
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 a55c143632..4a5fde8c2b 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
@@ -31,6 +31,8 @@ import static
io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_
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.hamcrest.CoreMatchers.not;
+import static org.hamcrest.Matchers.emptyOrNullString;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -152,4 +154,13 @@ class Opentelemetry2Test {
assertEquals("org.apache.camel.quarkus.component.opentelemetry2.it.OpenTelemetry2Resource.jdbcQuery",
spans.get(5).get(CODE_FUNCTION_NAME.getKey()));
}
+
+ @Test
+ void traceHeaderInclusion() {
+ RestAssured.get("/opentelemetry2/trace/headers")
+ .then()
+ .statusCode(204)
+ .header("spanId", not(emptyOrNullString()))
+ .header("traceId", not(emptyOrNullString()));
+ }
}