This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch code-massel-CAMEL-23352 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1cd28d70eabe0191ae9626f98e8d4d7513e0649b Author: Pasquale Congiusti <[email protected]> AuthorDate: Thu May 7 10:32:59 2026 +0200 chore(components): opentelemetry2 core processors Ref CAMEL-23432 --- .../OpenTelemetryTracerConfigurer.java | 6 ++ .../src/main/docs/opentelemetry2.adoc | 4 +- .../apache/camel/opentelemetry2/AsyncCXFTest.java | 1 + .../camel/opentelemetry2/AsyncDirectTest.java | 1 + .../org/apache/camel/opentelemetry2/AsyncTest.java | 1 + .../camel/opentelemetry2/AsyncWiretapTest.java | 1 + .../camel/opentelemetry2/MDCHeadersTraceTest.java | 1 + .../opentelemetry2/OpenTelemetryTracerTest.java | 1 + ...nTelemetryTracerTest.java => SpanBeanTest.java} | 101 ++++++++++++--------- .../apache/camel/opentelemetry2/SpanKindTest.java | 1 + .../SpanPropagationDownstreamTest.java | 1 + .../SpanPropagationUpstreamTest.java | 1 + 12 files changed, 76 insertions(+), 44 deletions(-) diff --git a/components/camel-opentelemetry2/src/generated/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerConfigurer.java b/components/camel-opentelemetry2/src/generated/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerConfigurer.java index cc561a6e9841..61762fd7d712 100644 --- a/components/camel-opentelemetry2/src/generated/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerConfigurer.java +++ b/components/camel-opentelemetry2/src/generated/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerConfigurer.java @@ -25,6 +25,8 @@ public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.comp switch (ignoreCase ? name.toLowerCase() : name) { case "camelcontext": case "camelContext": target.setCamelContext(property(camelContext, org.apache.camel.CamelContext.class, value)); return true; + case "disablecoreprocessors": + case "disableCoreProcessors": target.setDisableCoreProcessors(property(camelContext, boolean.class, value)); return true; case "excludepatterns": case "excludePatterns": target.setExcludePatterns(property(camelContext, java.lang.String.class, value)); return true; case "spanlifecyclemanager": @@ -42,6 +44,8 @@ public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.comp switch (ignoreCase ? name.toLowerCase() : name) { case "camelcontext": case "camelContext": return org.apache.camel.CamelContext.class; + case "disablecoreprocessors": + case "disableCoreProcessors": return boolean.class; case "excludepatterns": case "excludePatterns": return java.lang.String.class; case "spanlifecyclemanager": @@ -60,6 +64,8 @@ public class OpenTelemetryTracerConfigurer extends org.apache.camel.support.comp switch (ignoreCase ? name.toLowerCase() : name) { case "camelcontext": case "camelContext": return target.getCamelContext(); + case "disablecoreprocessors": + case "disableCoreProcessors": return target.isDisableCoreProcessors(); case "excludepatterns": case "excludePatterns": return target.getExcludePatterns(); case "spanlifecyclemanager": diff --git a/components/camel-opentelemetry2/src/main/docs/opentelemetry2.adoc b/components/camel-opentelemetry2/src/main/docs/opentelemetry2.adoc index 5c06dd31bb50..e443cebd3e83 100644 --- a/components/camel-opentelemetry2/src/main/docs/opentelemetry2.adoc +++ b/components/camel-opentelemetry2/src/main/docs/opentelemetry2.adoc @@ -24,8 +24,10 @@ The configuration properties for the OpenTelemetry2 tracer are: [width="100%",cols="10%,10%,80%",options="header",] |======================================================================= | Option | Default | Description +|`enabled`| false | Turn the tracing on/off. +|`traceProcessors`| false | Trace inner custom processors (i.e., any `process` configured in the route). +|`disableCoreProcessors`| false | Disable any inner core processors (any core DSL processor provided in the route, for example `bean`, `log`, ...). | `excludePatterns` | | A comma-separated list of patterns (e.g., `log*,direct*,setBody*`) to exclude from tracing. Spans matching these patterns will be disabled. -| `traceProcessors` | `false` | If set to `true`, Camel creates OpenTelemetry Spans for each processor in your routes. You can use `excludePatterns` to filter which processors are traced. | `traceHeadersInclusion`| `false` | If set to `true`, adds the generated telemetry `CAMEL_TRACE_ID` and `CAMEL_SPAN_ID` Exchange headers. |======================================================================= diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncCXFTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncCXFTest.java index 278fddd9076f..59a5e5168d03 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncCXFTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncCXFTest.java @@ -50,6 +50,7 @@ public class AsyncCXFTest extends OpenTelemetryTracerTestSupport { OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncDirectTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncDirectTest.java index 4b010c617e1e..4d29fbb89ad1 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncDirectTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncDirectTest.java @@ -42,6 +42,7 @@ public class AsyncDirectTest extends OpenTelemetryTracerTestSupport { OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncTest.java index 546ef24c226e..e73af302fe8f 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncTest.java @@ -46,6 +46,7 @@ public class AsyncTest extends OpenTelemetryTracerTestSupport { OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncWiretapTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncWiretapTest.java index 6b1ced29627e..81075b3b82d4 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncWiretapTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/AsyncWiretapTest.java @@ -47,6 +47,7 @@ public class AsyncWiretapTest extends OpenTelemetryTracerTestSupport { OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/MDCHeadersTraceTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/MDCHeadersTraceTest.java index 0eab0a484a07..5d6cc8a46045 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/MDCHeadersTraceTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/MDCHeadersTraceTest.java @@ -40,6 +40,7 @@ public class MDCHeadersTraceTest extends OpenTelemetryTracerTestSupport { tst.setTraceHeadersInclusion(true); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); return context; diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java index 3b4118656f63..471151678ca4 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java @@ -43,6 +43,7 @@ public class OpenTelemetryTracerTest extends OpenTelemetryTracerTestSupport { OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanBeanTest.java similarity index 52% copy from components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java copy to components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanBeanTest.java index 3b4118656f63..a785de244f28 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/OpenTelemetryTracerTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanBeanTest.java @@ -21,10 +21,13 @@ import java.util.List; import java.util.Map; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.sdk.trace.data.SpanData; import org.apache.camel.CamelContext; import org.apache.camel.CamelContextAware; import org.apache.camel.Exchange; +import org.apache.camel.Processor; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.opentelemetry2.CamelOpenTelemetryExtension.OtelTrace; @@ -33,15 +36,16 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; -public class OpenTelemetryTracerTest extends OpenTelemetryTracerTestSupport { +public class SpanBeanTest extends OpenTelemetryTracerTestSupport { + + Tracer tracer = otelExtension.getOpenTelemetry().getTracer("spanInjection"); @Override protected CamelContext createCamelContext() throws Exception { OpenTelemetryTracer tst = new OpenTelemetryTracer(); - tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); + tst.setTracer(tracer); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); @@ -51,68 +55,59 @@ public class OpenTelemetryTracerTest extends OpenTelemetryTracerTestSupport { @Test void testRouteSingleRequest() throws IOException { - Exchange result = template.request("direct:start", null); - // Make sure the trace is propagated downstream - assertNotNull(result.getIn().getHeader("traceparent")); + template.sendBody("direct:start", "my-body"); Map<String, OtelTrace> traces = otelExtension.getTraces(); assertEquals(1, traces.size()); - checkTrace(traces.values().iterator().next(), null); - } - - @Test - void testRouteMultipleRequests() throws IOException { - for (int i = 1; i <= 10; i++) { - context.createProducerTemplate().sendBody("direct:start", "Hello!"); - } - Map<String, OtelTrace> traces = otelExtension.getTraces(); - // Each trace should have a unique trace id. It is enough to assert that - // the number of elements in the map is the same of the requests to prove - // all traces have been generated uniquely. - assertEquals(10, traces.size()); - // Each trace should have the same structure - for (OtelTrace trace : traces.values()) { - checkTrace(trace, "Hello!"); - } - + checkTrace(traces.values().iterator().next()); } - private void checkTrace(OtelTrace trace, String expectedBody) { + private void checkTrace(OtelTrace trace) { List<SpanData> spans = trace.getSpans(); - assertEquals(3, spans.size()); + assertEquals(7, spans.size()); SpanData testProducer = spans.get(0); SpanData direct = spans.get(1); - SpanData log = spans.get(2); + SpanData innerLog = spans.get(2); + SpanData beanProcessor = spans.get(3); + SpanData beanMethod = spans.get(4); + SpanData log = spans.get(5); + SpanData innerToLog = spans.get(6); // Validate span completion assertTrue(testProducer.hasEnded()); assertTrue(direct.hasEnded()); + assertTrue(innerLog.hasEnded()); + assertTrue(beanProcessor.hasEnded()); + assertTrue(beanMethod.hasEnded()); assertTrue(log.hasEnded()); + assertTrue(innerToLog.hasEnded()); // Validate same trace assertEquals(testProducer.getSpanContext().getTraceId(), direct.getSpanContext().getTraceId()); - assertEquals(direct.getSpanContext().getTraceId(), log.getSpanContext().getTraceId()); + assertEquals(testProducer.getSpanContext().getTraceId(), innerLog.getSpanContext().getTraceId()); + assertEquals(testProducer.getSpanContext().getTraceId(), beanProcessor.getSpanContext().getTraceId()); + assertEquals(testProducer.getSpanContext().getTraceId(), beanMethod.getSpanContext().getTraceId()); + assertEquals(testProducer.getSpanContext().getTraceId(), log.getSpanContext().getTraceId()); + assertEquals(testProducer.getSpanContext().getTraceId(), innerToLog.getSpanContext().getTraceId()); + + // Validate operations + assertEquals(Op.EVENT_RECEIVED.toString(), direct.getAttributes().get(AttributeKey.stringKey("op"))); + assertEquals(Op.EVENT_PROCESS.toString(), beanProcessor.getAttributes().get(AttributeKey.stringKey("op"))); // Validate hierarchy assertFalse(testProducer.getParentSpanContext().isValid()); + assertEquals(testProducer.getSpanContext().getSpanId(), direct.getParentSpanContext().getSpanId()); + assertEquals(direct.getSpanContext().getSpanId(), innerLog.getParentSpanContext().getSpanId()); + assertEquals(direct.getSpanContext().getSpanId(), beanProcessor.getParentSpanContext().getSpanId()); + assertEquals(beanProcessor.getSpanContext().getSpanId(), beanMethod.getParentSpanContext().getSpanId()); assertEquals(direct.getSpanContext().getSpanId(), log.getParentSpanContext().getSpanId()); - - // Validate operations - assertEquals(Op.EVENT_SENT.toString(), testProducer.getAttributes().get(AttributeKey.stringKey("op"))); - assertEquals(Op.EVENT_RECEIVED.toString(), direct.getAttributes().get(AttributeKey.stringKey("op"))); + assertEquals(log.getSpanContext().getSpanId(), innerToLog.getParentSpanContext().getSpanId()); // Validate message logging - assertEquals("A message", direct.getEvents().get(0).getAttributes().get(AttributeKey.stringKey("message"))); - if (expectedBody == null) { - assertEquals( - "Exchange[ExchangePattern: InOut, BodyType: null, Body: [Body is null]]", - log.getEvents().get(0).getAttributes().get(AttributeKey.stringKey("message"))); - } else { - assertEquals( - "Exchange[ExchangePattern: InOnly, BodyType: String, Body: " + expectedBody + "]", - log.getEvents().get(0).getAttributes().get(AttributeKey.stringKey("message"))); - } - + assertEquals("A message", innerLog.getEvents().get(0).getAttributes().get(AttributeKey.stringKey("message"))); + assertEquals( + "Exchange[ExchangePattern: InOnly, BodyType: String, Body: my-body]", + innerToLog.getEvents().get(0).getAttributes().get(AttributeKey.stringKey("message"))); } @Override @@ -120,12 +115,32 @@ public class OpenTelemetryTracerTest extends OpenTelemetryTracerTestSupport { return new RouteBuilder() { @Override public void configure() { + MyBean myBean = new MyBean(); + this.getCamelContext().getRegistry().bind("myBean", myBean); + from("direct:start") .routeId("start") .log("A message") + .bean(MyBean.class) + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + // noop + } + }) .to("log:info"); } }; } + class MyBean { + // NOTE: the commented annotation below would work only when an agent or a runtime framework (quarkus or spring) + // is available. We simulate it creating the Span by hand instead. + //@WithSpan + public void helloWorld() { + Span mySpan = tracer.spanBuilder("helloworld").startSpan(); + // Do the work here + mySpan.end(); + } + } } diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanKindTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanKindTest.java index 41e0d021d6d5..7746b7515bd3 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanKindTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanKindTest.java @@ -45,6 +45,7 @@ public class SpanKindTest extends OpenTelemetryTracerTestSupport { OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("spanKindTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); // Register mock HTTP component for testing diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationDownstreamTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationDownstreamTest.java index 0c28617a1ffc..1d99a67bf4d6 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationDownstreamTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationDownstreamTest.java @@ -32,6 +32,7 @@ public class SpanPropagationDownstreamTest extends OpenTelemetryTracerTestSuppor OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationUpstreamTest.java b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationUpstreamTest.java index 3938d39a3662..16d474d1da70 100644 --- a/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationUpstreamTest.java +++ b/components/camel-opentelemetry2/src/test/java/org/apache/camel/opentelemetry2/SpanPropagationUpstreamTest.java @@ -38,6 +38,7 @@ public class SpanPropagationUpstreamTest extends OpenTelemetryTracerTestSupport OpenTelemetryTracer tst = new OpenTelemetryTracer(); tst.setTracer(otelExtension.getOpenTelemetry().getTracer("traceTest")); tst.setContextPropagators(otelExtension.getOpenTelemetry().getPropagators()); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context);
