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 3f8acc3da4d3abcee0b95e5d4d660ff34f00de77 Author: Pasquale Congiusti <[email protected]> AuthorDate: Thu May 7 09:42:53 2026 +0200 chore(components): telemetry dev core processors Ref CAMEL-23432 --- .../telemetrydev/TelemetryDevTracerConfigurer.java | 6 ++ .../src/main/docs/telemetry-dev.adoc | 3 +- .../apache/camel/telemetrydev/AsyncCXFTest.java | 1 + .../apache/camel/telemetrydev/AsyncDirectTest.java | 1 + .../org/apache/camel/telemetrydev/AsyncTest.java | 1 + .../camel/telemetrydev/AsyncWiretapTest.java | 1 + .../camel/telemetrydev/MDCHeadersTraceTest.java | 1 + ...lemetryDevTracerTest.java => SpanBeanTest.java} | 88 +++++++++++++--------- .../SpanPropagationDownstreamTest.java | 1 + .../telemetrydev/SpanPropagationUpstreamTest.java | 1 + .../camel/telemetrydev/TelemetryDevTracerTest.java | 1 + .../apache/camel/telemetry/mock/MockTracer.java | 5 +- 12 files changed, 69 insertions(+), 41 deletions(-) diff --git a/components/camel-telemetry-dev/src/generated/java/org/apache/camel/telemetrydev/TelemetryDevTracerConfigurer.java b/components/camel-telemetry-dev/src/generated/java/org/apache/camel/telemetrydev/TelemetryDevTracerConfigurer.java index 20d9f04a5fee..ba9d4911c60d 100644 --- a/components/camel-telemetry-dev/src/generated/java/org/apache/camel/telemetrydev/TelemetryDevTracerConfigurer.java +++ b/components/camel-telemetry-dev/src/generated/java/org/apache/camel/telemetrydev/TelemetryDevTracerConfigurer.java @@ -25,6 +25,8 @@ public class TelemetryDevTracerConfigurer extends org.apache.camel.support.compo 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": @@ -44,6 +46,8 @@ public class TelemetryDevTracerConfigurer extends org.apache.camel.support.compo 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": @@ -64,6 +68,8 @@ public class TelemetryDevTracerConfigurer extends org.apache.camel.support.compo 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-telemetry-dev/src/main/docs/telemetry-dev.adoc b/components/camel-telemetry-dev/src/main/docs/telemetry-dev.adoc index d3d9894814be..2eba44a3a767 100644 --- a/components/camel-telemetry-dev/src/main/docs/telemetry-dev.adoc +++ b/components/camel-telemetry-dev/src/main/docs/telemetry-dev.adoc @@ -28,7 +28,8 @@ The configuration properties for the Telemetry component are: |Option |Default |Description |`enabled`| false | Turn the tracing on/off. |`traceFormat`| default | The format used to trace in the log (default, tree, json). -|`traceProcessors`| false | Trace inner processors. +|`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` | | Sets exclude pattern that will disable tracing for those spans that matches the pattern. The variable is a comma separated values of filters to execute (eg, `log*,direct*,setBody*`, ...) |`traceHeadersInclusion`| false | Add the generated telemetry `CAMEL_TRACE_ID` and `CAMEL_SPAN_ID` Exchange headers. |======================================================================= diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncCXFTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncCXFTest.java index 2ca776917e17..a2887afead91 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncCXFTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncCXFTest.java @@ -45,6 +45,7 @@ public class AsyncCXFTest extends TelemetryDevTracerTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncDirectTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncDirectTest.java index d41399686f84..0fc1c1731da8 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncDirectTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncDirectTest.java @@ -37,6 +37,7 @@ public class AsyncDirectTest extends TelemetryDevTracerTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncTest.java index ff794ef5a348..c8fc668b02e3 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncTest.java @@ -41,6 +41,7 @@ public class AsyncTest extends TelemetryDevTracerTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncWiretapTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncWiretapTest.java index 67fd4384ddab..3f08e4f18f13 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncWiretapTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/AsyncWiretapTest.java @@ -42,6 +42,7 @@ public class AsyncWiretapTest extends TelemetryDevTracerTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/MDCHeadersTraceTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/MDCHeadersTraceTest.java index 2e9472aece6b..0bfe182dd0dd 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/MDCHeadersTraceTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/MDCHeadersTraceTest.java @@ -38,6 +38,7 @@ public class MDCHeadersTraceTest extends TelemetryDevTracerTestSupport { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); tst.setTraceHeadersInclusion(true); + tst.setDisableCoreProcessors(true); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); return context; diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanBeanTest.java similarity index 52% copy from components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java copy to components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanBeanTest.java index 6fea7695553d..b0f02f990bda 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanBeanTest.java @@ -26,21 +26,25 @@ import org.apache.camel.Exchange; import org.apache.camel.RoutesBuilder; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.telemetry.Op; +import org.apache.camel.telemetry.Span; +import org.apache.camel.telemetry.SpanStorageManagerExchange; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -public class TelemetryDevTracerTest extends TelemetryDevTracerTestSupport { +public class SpanBeanTest extends TelemetryDevTracerTestSupport { + + TelemetryDevTracer tracer; @Override protected CamelContext createCamelContext() throws Exception { - TelemetryDevTracer tst = new TelemetryDevTracer(); - tst.setTraceFormat("json"); + tracer = new TelemetryDevTracer(); + tracer.setTraceFormat("json"); CamelContext context = super.createCamelContext(); - CamelContextAware.trySetCamelContext(tst, context); - tst.init(context); + CamelContextAware.trySetCamelContext(tracer, context); + tracer.init(context); return context; } @@ -54,59 +58,52 @@ public class TelemetryDevTracerTest extends TelemetryDevTracerTestSupport { 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, DevTrace> traces = tracesFromLog(); - // 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 (DevTrace trace : traces.values()) { - checkTrace(trace, "Hello!"); - } - - } - private void checkTrace(DevTrace trace, String expectedBody) { List<DevSpanAdapter> spans = trace.getSpans(); - assertEquals(3, spans.size()); + assertEquals(7, spans.size()); DevSpanAdapter testProducer = spans.get(0); DevSpanAdapter direct = spans.get(1); - DevSpanAdapter log = spans.get(2); + DevSpanAdapter logProcessor = spans.get(2); + DevSpanAdapter beanProcessor = spans.get(3); + DevSpanAdapter beanMySpan = spans.get(4); + DevSpanAdapter to = spans.get(5); + DevSpanAdapter toProcessor = spans.get(6); // Validate span completion assertEquals("true", testProducer.getTag("isDone")); assertEquals("true", direct.getTag("isDone")); - assertEquals("true", log.getTag("isDone")); + assertEquals("true", logProcessor.getTag("isDone")); + assertEquals("true", beanProcessor.getTag("isDone")); + assertEquals("true", beanMySpan.getTag("isDone")); + assertEquals("true", to.getTag("isDone")); + assertEquals("true", toProcessor.getTag("isDone")); // Validate same trace assertEquals(testProducer.getTag("traceid"), direct.getTag("traceid")); - assertEquals(direct.getTag("traceid"), log.getTag("traceid")); + assertEquals(direct.getTag("traceid"), to.getTag("traceid")); + assertEquals(testProducer.getTag("traceid"), logProcessor.getTag("traceid")); + assertEquals(testProducer.getTag("traceid"), toProcessor.getTag("traceid")); + assertEquals(testProducer.getTag("traceid"), beanProcessor.getTag("traceid")); + assertEquals(testProducer.getTag("traceid"), beanMySpan.getTag("traceid")); // Validate hierarchy assertNull(testProducer.getTag("parentSpan")); assertEquals(testProducer.getTag("spanid"), direct.getTag("parentSpan")); - assertEquals(direct.getTag("spanid"), log.getTag("parentSpan")); + assertEquals(direct.getTag("spanid"), logProcessor.getTag("parentSpan")); + assertEquals(direct.getTag("spanid"), beanProcessor.getTag("parentSpan")); + assertEquals(beanProcessor.getTag("spanid"), beanMySpan.getTag("parentSpan")); + assertEquals(direct.getTag("spanid"), to.getTag("parentSpan")); + assertEquals(to.getTag("spanid"), toProcessor.getTag("parentSpan")); // Validate operations assertEquals(Op.EVENT_SENT.toString(), testProducer.getTag("op")); assertEquals(Op.EVENT_RECEIVED.toString(), direct.getTag("op")); // Validate message logging - assertEquals("A message", direct.getLogEntries().get(0).getFields().get("message")); - if (expectedBody == null) { - assertEquals( - "Exchange[ExchangePattern: InOut, BodyType: null, Body: [Body is null]]", - log.getLogEntries().get(0).getFields().get("message")); - } else { - assertEquals( - "Exchange[ExchangePattern: InOnly, BodyType: String, Body: " + expectedBody + "]", - log.getLogEntries().get(0).getFields().get("message")); - } + assertEquals("A message", logProcessor.getLogEntries().get(0).getFields().get("message")); + assertEquals( + "Exchange[ExchangePattern: InOut, BodyType: null, Body: [Body is null]]", + toProcessor.getLogEntries().get(0).getFields().get("message")); } @@ -115,12 +112,29 @@ public class TelemetryDevTracerTest extends TelemetryDevTracerTestSupport { 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) .to("log:info"); } }; } + class MyBean { + // We simulate the creation of a Span by hand. + public void helloWorld(Exchange exchange) { + // We just simulate the creation of a span and proper nesting. In a real implementation + // it is up to the telemetry technology to do so (for example, via method annotations) + Span parentSpan = new SpanStorageManagerExchange().peek(exchange); + Span span = tracer.getSpanLifecycleManager().create("mySpan", "empty", parentSpan, null); + tracer.getSpanLifecycleManager().activate(span); + tracer.getSpanLifecycleManager().deactivate(span); + tracer.getSpanLifecycleManager().close(span); + } + } + } diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationDownstreamTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationDownstreamTest.java index 840a3b2e1800..09b43abf3bfb 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationDownstreamTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationDownstreamTest.java @@ -32,6 +32,7 @@ public class SpanPropagationDownstreamTest extends ExchangeTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationUpstreamTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationUpstreamTest.java index 19af81965cc1..44c8b3b6b40a 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationUpstreamTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/SpanPropagationUpstreamTest.java @@ -34,6 +34,7 @@ public class SpanPropagationUpstreamTest extends TelemetryDevTracerTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java index 6fea7695553d..cd0c4f838bf3 100644 --- a/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java +++ b/components/camel-telemetry-dev/src/test/java/org/apache/camel/telemetrydev/TelemetryDevTracerTest.java @@ -38,6 +38,7 @@ public class TelemetryDevTracerTest extends TelemetryDevTracerTestSupport { protected CamelContext createCamelContext() throws Exception { TelemetryDevTracer tst = new TelemetryDevTracer(); tst.setTraceFormat("json"); + tst.setDisableCoreProcessors(true); CamelContext context = super.createCamelContext(); CamelContextAware.trySetCamelContext(tst, context); tst.init(context); diff --git a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTracer.java b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTracer.java index ae32f58b5d56..6479e8ebf213 100644 --- a/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTracer.java +++ b/components/camel-telemetry/src/test/java/org/apache/camel/telemetry/mock/MockTracer.java @@ -35,7 +35,7 @@ import org.apache.camel.telemetry.Tracer; @ManagedResource(description = "MockTracer") public class MockTracer extends Tracer { - public MockSpanLifecycleManager slcm; + MockSpanLifecycleManager slcm; @Override protected void initTracer() { @@ -47,8 +47,7 @@ public class MockTracer extends Tracer { return slcm.traces(); } - // NOTE: public because we're using directly in a test case to generate a custom span - public class MockSpanLifecycleManager implements SpanLifecycleManager { + private class MockSpanLifecycleManager implements SpanLifecycleManager { // Used to collect the traces for later evaluation as traces Map<String, Span> inMemoryStorageMap = new HashMap<>();
