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;

Reply via email to