This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch ih in repository https://gitbox.apache.org/repos/asf/camel.git
commit d7154584776d6f44d296fbe39f8374503654b0c8 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Nov 20 15:16:51 2025 +0100 CAMEL-22693: Mark up EIP and endpoint headers that are of importance to make tooling, trouble shooting and development easier. --- .../src/main/java/org/apache/camel/NamedNode.java | 16 ++++++++++++++++ .../apache/camel/spi/BacklogTracerEventMessage.java | 10 ++++++++++ .../apache/camel/impl/debugger/BacklogTracer.java | 2 +- .../camel/impl/debugger/DefaultBacklogDebugger.java | 21 ++++++++++++++++----- .../debugger/DefaultBacklogTracerEventMessage.java | 21 +++++++++++++++++++-- .../camel/impl/engine/CamelInternalProcessor.java | 15 +++++++++++---- .../camel/model/ProcessorDefinitionHelper.java | 15 +++++---------- .../camel/management/mbean/ManagedProcessor.java | 2 +- .../core/commands/action/CamelHistoryAction.java | 5 ++++- 9 files changed, 83 insertions(+), 24 deletions(-) diff --git a/core/camel-api/src/main/java/org/apache/camel/NamedNode.java b/core/camel-api/src/main/java/org/apache/camel/NamedNode.java index f1208427531b..a9833050f48a 100644 --- a/core/camel-api/src/main/java/org/apache/camel/NamedNode.java +++ b/core/camel-api/src/main/java/org/apache/camel/NamedNode.java @@ -65,4 +65,20 @@ public interface NamedNode extends LineNumberAware { return true; } + /** + * Processor Level in the route tree + */ + default int getLevel() { + NamedNode node = this; + int level = 0; + while (node != null && node.getParent() != null) { + boolean shallow = "when".equals(node.getShortName()) || "otherwise".equals(node.getShortName()); + node = node.getParent(); + if (!shallow) { + level++; + } + } + return level; + } + } diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java index 6a632d43efb0..293493002d33 100644 --- a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java +++ b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java @@ -83,11 +83,21 @@ public interface BacklogTracerEventMessage { */ String getToNodeLabel(); + /** + * Node processor level + */ + int getToNodeLevel(); + /** * The exchange id */ String getExchangeId(); + /** + * The correlation id to a parent exchange (if any) + */ + String getCorrelationExchangeId(); + /** * The name of the thread that is processing the message, when this event was captured. */ diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java index 04815bfe3f4d..28c08f8f6d21 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/BacklogTracer.java @@ -153,7 +153,7 @@ public class BacklogTracer extends ServiceSupport implements org.apache.camel.sp if (head != null) { tid = head.getExchangeId(); } - if (tid == null || tid.equals(event.getExchangeId())) { + if (tid == null || tid.equals(event.getExchangeId()) || tid.equals(event.getCorrelationExchangeId())) { provisionalHistoryQueue.add(event); if (event.isLast()) { completeHistoryQueue.clear(); diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java index 090040ed9137..b36d00242e59 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogDebugger.java @@ -885,8 +885,8 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back (nId, message) -> new DefaultBacklogTracerEventMessage( camelContext, false, false, message.getUid(), message.getTimestamp(), message.getLocation(), message.getRouteId(), - message.getToNode(), message.getToNodeShortName(), message.getToNodeLabel(), - message.getExchangeId(), + message.getToNode(), message.getToNodeShortName(), message.getToNodeLabel(), message.getToNodeLevel(), + message.getExchangeId(), message.getCorrelationExchangeId(), false, false, dumpAsJSonObject(suspendedExchange.getExchange()))); } @@ -927,6 +927,8 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back String toNodeLabel = StringHelper.limitLength(definition.getLabel(), 50); String routeId = CamelContextHelper.getRouteId(definition); String exchangeId = exchange.getExchangeId(); + String correlationExchangeId = exchange.getProperty(ExchangePropertyKey.CORRELATION_ID, String.class); + int level = definition.getLevel(); long uid = debugCounter.incrementAndGet(); String source = LoggerHelper.getLineNumberLoggerName(definition); boolean first = "from".equals(definition.getShortName()); @@ -934,7 +936,9 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back BacklogTracerEventMessage msg = new DefaultBacklogTracerEventMessage( camelContext, - first, false, uid, timestamp, source, routeId, toNode, toNodeShortName, toNodeLabel, exchangeId, + first, false, uid, timestamp, source, routeId, toNode, toNodeShortName, toNodeLabel, level, + exchangeId, + correlationExchangeId, false, false, data); suspendedBreakpointMessages.put(nodeId, msg); @@ -1013,13 +1017,16 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back String toNodeLabel = StringHelper.limitLength(definition.getLabel(), 50); String routeId = CamelContextHelper.getRouteId(definition); String exchangeId = exchange.getExchangeId(); + String correlationExchangeId = exchange.getProperty(ExchangePropertyKey.CORRELATION_ID, String.class); + int level = definition.getLevel(); long uid = debugCounter.incrementAndGet(); String source = LoggerHelper.getLineNumberLoggerName(definition); JsonObject data = dumpAsJSonObject(exchange); BacklogTracerEventMessage msg = new DefaultBacklogTracerEventMessage( camelContext, - false, false, uid, timestamp, source, routeId, toNode, toNodeShortName, toNodeLabel, exchangeId, + false, false, uid, timestamp, source, routeId, toNode, toNodeShortName, toNodeLabel, level, + exchangeId, correlationExchangeId, false, false, data); suspendedBreakpointMessages.put(toNode, msg); @@ -1117,13 +1124,17 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back String toNode = CamelContextHelper.getRouteId(definition); String routeId = route != null ? route.getRouteId() : toNode; String exchangeId = exchange.getExchangeId(); + String correlationExchangeId = exchange.getProperty(ExchangePropertyKey.CORRELATION_ID, String.class); + int level = definition.getLevel(); long uid = debugCounter.incrementAndGet(); String source = LoggerHelper.getLineNumberLoggerName(route != null ? route : definition); JsonObject data = dumpAsJSonObject(exchange); BacklogTracerEventMessage msg = new DefaultBacklogTracerEventMessage( camelContext, - false, true, uid, timestamp, source, routeId, toNode, null, null, exchangeId, false, false, data); + false, true, uid, timestamp, source, routeId, toNode, null, null, level, + exchangeId, correlationExchangeId, + false, false, data); // we want to capture if there was an exception if (cause != null) { msg.setException(cause); diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java index 6bdae766f16c..c65c7a5ec812 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java @@ -47,7 +47,9 @@ public final class DefaultBacklogTracerEventMessage implements BacklogTracerEven private final String toNode; private final String toNodeShortName; private final String toNodeLabel; + private final int toNodeLevel; private final String exchangeId; + private final String correlationExchangeId; private final String threadName; private String endpointUri; private boolean remoteEndpoint; @@ -68,8 +70,9 @@ public final class DefaultBacklogTracerEventMessage implements BacklogTracerEven public DefaultBacklogTracerEventMessage(CamelContext camelContext, boolean first, boolean last, long uid, long timestamp, String location, String routeId, String toNode, String toNodeShortName, - String toNodeLabel, - String exchangeId, boolean rest, boolean template, JsonObject data) { + String toNodeLabel, int toNodeLevel, String exchangeId, + String correlationExchangeId, + boolean rest, boolean template, JsonObject data) { this.camelContext = camelContext; this.watch = new StopWatch(); this.first = first; @@ -81,7 +84,9 @@ public final class DefaultBacklogTracerEventMessage implements BacklogTracerEven this.toNode = toNode; this.toNodeShortName = toNodeShortName; this.toNodeLabel = toNodeLabel; + this.toNodeLevel = toNodeLevel; this.exchangeId = exchangeId; + this.correlationExchangeId = correlationExchangeId; this.rest = rest; this.template = template; this.threadName = Thread.currentThread().getName(); @@ -151,11 +156,19 @@ public final class DefaultBacklogTracerEventMessage implements BacklogTracerEven return toNodeLabel; } + public int getToNodeLevel() { + return toNodeLevel; + } + @Override public String getExchangeId() { return exchangeId; } + public String getCorrelationExchangeId() { + return correlationExchangeId; + } + @Override public String getProcessingThreadName() { return threadName; @@ -524,9 +537,13 @@ public final class DefaultBacklogTracerEventMessage implements BacklogTracerEven if (toNodeLabel != null) { jo.put("nodeLabel", Jsoner.escape(toNodeLabel)); } + jo.put("nodeLevel", toNodeLevel); if (exchangeId != null) { jo.put("exchangeId", exchangeId); } + if (correlationExchangeId != null) { + jo.put("correlationExchangeId", correlationExchangeId); + } if (timestamp > 0) { jo.put("timestamp", timestamp); } diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java index 0dede3489adc..3d7f1289800d 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java @@ -654,6 +654,9 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In String toNodeShortName = processorDefinition.getShortName(); String toNodeLabel = StringHelper.limitLength(processorDefinition.getLabel(), 50); String exchangeId = exchange.getExchangeId(); + String correlationExchangeId = exchange.getProperty(ExchangePropertyKey.CORRELATION_ID, String.class); + int level = processorDefinition.getLevel(); + boolean includeExchangeProperties = backlogTracer.isIncludeExchangeProperties(); boolean includeExchangeVariables = backlogTracer.isIncludeExchangeVariables(); JsonObject data = MessageHelper.dumpAsJSonObject(exchange.getIn(), includeExchangeProperties, @@ -670,7 +673,8 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In DefaultBacklogTracerEventMessage pseudoFirst = new DefaultBacklogTracerEventMessage( camelContext, true, false, backlogTracer.incrementTraceCounter(), created, source, routeId, null, null, null, - exchangeId, rest, template, data); + level, + exchangeId, correlationExchangeId, rest, template, data); if (exchange.getFromEndpoint() instanceof EndpointServiceLocation esl) { pseudoFirst.setEndpointServiceUrl(esl.getServiceUrl()); pseudoFirst.setEndpointServiceProtocol(esl.getServiceProtocol()); @@ -683,8 +687,8 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In DefaultBacklogTracerEventMessage event = new DefaultBacklogTracerEventMessage( camelContext, false, false, backlogTracer.incrementTraceCounter(), timestamp, source, routeId, toNode, - toNodeShortName, toNodeLabel, - exchangeId, rest, template, data); + toNodeShortName, toNodeLabel, level, + exchangeId, correlationExchangeId, rest, template, data); backlogTracer.traceEvent(event); return event; @@ -700,9 +704,11 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In // create pseudo last String routeId = routeDefinition != null ? routeDefinition.getRouteId() : null; String exchangeId = exchange.getExchangeId(); + String correlationExchangeId = exchange.getProperty(ExchangePropertyKey.CORRELATION_ID, String.class); boolean includeExchangeProperties = backlogTracer.isIncludeExchangeProperties(); boolean includeExchangeVariables = backlogTracer.isIncludeExchangeVariables(); long created = exchange.getClock().getCreated(); + int level = processorDefinition.getLevel(); JsonObject data = MessageHelper.dumpAsJSonObject(exchange.getIn(), includeExchangeProperties, includeExchangeVariables, true, true, backlogTracer.isBodyIncludeStreams(), backlogTracer.isBodyIncludeFiles(), @@ -710,7 +716,8 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In DefaultBacklogTracerEventMessage pseudoLast = new DefaultBacklogTracerEventMessage( camelContext, false, true, backlogTracer.incrementTraceCounter(), created, source, routeId, null, null, null, - exchangeId, rest, template, data); + level, + exchangeId, correlationExchangeId, rest, template, data); backlogTracer.traceEvent(pseudoLast); doneProcessing(exchange, pseudoLast); doneProcessing(exchange, pseudoFirst); diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java index 1372486a803c..98d9c3e50a51 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/ProcessorDefinitionHelper.java @@ -429,18 +429,13 @@ public final class ProcessorDefinitionHelper { /** * Returns the level of the node in the route tree. Level 1 is the root level, level 2 is a child of an EIP, and so - * forth + * forth\ + * + * @deprecated use {@link NamedNode#getLevel()} */ + @Deprecated(since = "4.17.0") public static int getNodeLevel(NamedNode node) { - int level = 0; - while (node != null && node.getParent() != null) { - boolean shallow = node instanceof WhenDefinition || node instanceof OtherwiseDefinition; - node = node.getParent(); - if (!shallow) { - level++; - } - } - return level; + return node.getLevel(); } /** diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java index d0da58e84190..84fc090e157a 100644 --- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java +++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedProcessor.java @@ -55,7 +55,7 @@ public class ManagedProcessor extends ManagedPerformanceCounter this.context = context; this.processor = processor; this.definition = definition; - this.nodeLevel = ProcessorDefinitionHelper.getNodeLevel(definition); + this.nodeLevel = definition.getLevel(); this.id = definition.idOrCreate(context.getCamelContextExtension().getContextPlugin(NodeIdFactory.class)); StepDefinition step; if (definition instanceof StepDefinition stepDefinition) { diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java index 1e42acc06176..138390086136 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelHistoryAction.java @@ -30,6 +30,7 @@ import com.github.freva.asciitable.HorizontalAlign; import com.github.freva.asciitable.OverflowBehaviour; import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; import org.apache.camel.util.IOHelper; +import org.apache.camel.util.StringHelper; import org.apache.camel.util.TimeUtils; import org.apache.camel.util.URISupport; import org.apache.camel.util.json.JsonArray; @@ -135,7 +136,7 @@ public class CamelHistoryAction extends ActionWatchCommand { if (r.first || r.last) { return "from[" + r.endpoint.getString("endpoint") + "]"; } else if (r.nodeLabel != null) { - return r.nodeLabel; + return StringHelper.padString(r.nodeLevel, 2) + r.nodeLabel; } else { return r.nodeId; } @@ -245,6 +246,7 @@ public class CamelHistoryAction extends ActionWatchCommand { if (mask) { row.nodeLabel = URISupport.sanitizeUri(row.nodeLabel); } + row.nodeLevel = jo.getIntegerOrDefault("nodeLevel", 0); String uri = jo.getString("endpointUri"); if (uri != null) { row.endpoint = new JsonObject(); @@ -295,6 +297,7 @@ public class CamelHistoryAction extends ActionWatchCommand { String nodeId; String nodeShortName; String nodeLabel; + int nodeLevel; long timestamp; long elapsed; boolean done;
