This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new 930aa79974d Kamelet debug (#11999) 930aa79974d is described below commit 930aa79974da0d77c2b0856ad1dc32789c4d85f6 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Wed Nov 15 14:33:02 2023 +0100 Kamelet debug (#11999) * CAMEL-20112: camel-core/camel-jbang: Do not debug inside kamelets/rest-dsl as it should be like a black-box and focus only debugging on custom routes. * camel-jbang - Debug command to show source in history with line number * CAMEL-20112: camel-core/camel-jbang: Do not debug inside kamelets/rest-dsl as it should be like a black-box and focus only debugging on custom routes. --- .../impl/debugger/DefaultBacklogDebugger.java | 31 ++++++++++++++++++---- .../apache/camel/impl/engine/DefaultChannel.java | 19 ++++++++----- .../apache/camel/impl/console/DebugDevConsole.java | 20 +++++++++++++- .../camel/dsl/jbang/core/commands/Debug.java | 10 +++++-- 4 files changed, 65 insertions(+), 15 deletions(-) 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 abb841b6c4c..e37fccaecc5 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 @@ -17,6 +17,7 @@ package org.apache.camel.impl.debugger; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -28,7 +29,9 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; +import org.apache.camel.ExchangePropertyKey; import org.apache.camel.LoggingLevel; +import org.apache.camel.MessageHistory; import org.apache.camel.NamedNode; import org.apache.camel.NamedRoute; import org.apache.camel.NoTypeConversionAvailableException; @@ -945,17 +948,19 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back } @Override + @SuppressWarnings("unchecked") public void onEvent(Exchange exchange, ExchangeEvent event, NamedNode definition) { if (event instanceof ExchangeCompletedEvent || event instanceof CamelEvent.ExchangeFailedEvent) { Throwable cause = null; if (event instanceof CamelEvent.ExchangeFailedEvent fe) { cause = fe.getCause(); } + NamedRoute route = getOriginalRoute(exchange); String completedId = event.getExchange().getExchangeId(); try { if (isSingleStepIncludeStartEnd() && singleStepExchangeId != null && singleStepExchangeId.equals(completedId)) { - doCompleted(exchange, definition, cause); + doCompleted(exchange, definition, route, cause); } } finally { logger.log("ExchangeId: " + completedId + " is completed, so exiting single step mode."); @@ -964,17 +969,33 @@ public final class DefaultBacklogDebugger extends ServiceSupport implements Back } } - private void doCompleted(Exchange exchange, NamedNode definition, Throwable cause) { + private NamedRoute getOriginalRoute(Exchange exchange) { + List<MessageHistory> list = exchange.getProperty(ExchangePropertyKey.MESSAGE_HISTORY, List.class); + if (list != null) { + for (MessageHistory h : list) { + NamedNode n = h.getNode(); + NamedRoute nr = CamelContextHelper.getRoute(n); + if (nr != null) { + boolean skip = nr.isCreatedFromRest() || nr.isCreatedFromTemplate(); + if (!skip) { + return nr; + } + } + } + } + return null; + } + + private void doCompleted(Exchange exchange, NamedNode definition, NamedRoute route, Throwable cause) { // create pseudo-last step in single step mode long timestamp = System.currentTimeMillis(); String toNode = CamelContextHelper.getRouteId(definition); - String routeId = CamelContextHelper.getRouteId(definition); + String routeId = route != null ? route.getRouteId() : toNode; String exchangeId = exchange.getExchangeId(); String messageAsXml = dumpAsXml(exchange); String messageAsJSon = dumpAsJSon(exchange); long uid = debugCounter.incrementAndGet(); - NamedRoute route = CamelContextHelper.getRoute(definition); - String source = LoggerHelper.getLineNumberLoggerName(route); + String source = LoggerHelper.getLineNumberLoggerName(route != null ? route : definition); BacklogTracerEventMessage msg = new DefaultBacklogTracerEventMessage( diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java index cd593716a05..02c6efefe2a 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java @@ -186,14 +186,19 @@ public class DefaultChannel extends CamelInternalProcessor implements Channel { if (!camelContext.hasService(debugger)) { camelContext.addService(debugger); } - backlogDebuggerSetupInitialBreakpoints(definition, routeDefinition, first, debugger, targetOutputDef); - if (first && debugger.isSingleStepIncludeStartEnd()) { - // add breakpoint on route input instead of first node - addAdvice(new BacklogDebuggerAdvice(debugger, nextProcessor, routeDefinition.getInput())); - // debugger captures message history, and we need to capture history of incoming - addAdvice(new MessageHistoryAdvice(camelContext.getMessageHistoryFactory(), routeDefinition.getInput())); + // skip debugging inside rest-dsl (just a tiny facade) or kamelets / route-templates + boolean skip = routeDefinition.isCreatedFromRest() || routeDefinition.isCreatedFromTemplate(); + if (!skip) { + backlogDebuggerSetupInitialBreakpoints(definition, routeDefinition, first, debugger, targetOutputDef); + if (first && debugger.isSingleStepIncludeStartEnd()) { + // add breakpoint on route input instead of first node + addAdvice(new BacklogDebuggerAdvice(debugger, nextProcessor, routeDefinition.getInput())); + // debugger captures message history, and we need to capture history of incoming + addAdvice( + new MessageHistoryAdvice(camelContext.getMessageHistoryFactory(), routeDefinition.getInput())); + } + addAdvice(new BacklogDebuggerAdvice(debugger, nextProcessor, targetOutputDef)); } - addAdvice(new BacklogDebuggerAdvice(debugger, nextProcessor, targetOutputDef)); } } diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java index f096eaf4ca1..6f6540ce673 100644 --- a/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java +++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/DebugDevConsole.java @@ -24,11 +24,13 @@ import java.util.Map; import org.apache.camel.Exchange; import org.apache.camel.ExchangePropertyKey; import org.apache.camel.MessageHistory; +import org.apache.camel.NamedRoute; import org.apache.camel.Route; import org.apache.camel.spi.BacklogDebugger; import org.apache.camel.spi.BacklogTracerEventMessage; import org.apache.camel.spi.Resource; import org.apache.camel.spi.annotations.DevConsole; +import org.apache.camel.support.CamelContextHelper; import org.apache.camel.support.console.AbstractDevConsole; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; @@ -217,6 +219,17 @@ public class DebugDevConsole extends AbstractDevConsole { for (MessageHistory h : list) { JsonObject jo = new JsonObject(); + + if (h.getNode() != null) { + NamedRoute nr = CamelContextHelper.getRoute(h.getNode()); + if (nr != null) { + // skip debugging inside rest-dsl (just a tiny facade) or kamelets / route-templates + boolean skip = nr.isCreatedFromRest() || nr.isCreatedFromTemplate(); + if (skip) { + continue; + } + } + } if (h.getRouteId() != null) { jo.put("routeId", h.getRouteId()); } @@ -224,7 +237,12 @@ public class DebugDevConsole extends AbstractDevConsole { if (h.getNode() != null) { jo.put("nodeId", h.getNode().getId()); if (h.getNode().getLocation() != null) { - jo.put("location", h.getNode().getLocation()); + String loc = h.getNode().getLocation(); + // strip schema + if (loc.contains(":")) { + loc = StringHelper.after(loc, ":"); + } + jo.put("location", loc); } if (h.getNode().getLineNumber() != -1) { jo.put("line", h.getNode().getLineNumber()); diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java index f5d788235e9..64b4afbe186 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java @@ -515,7 +515,7 @@ public class Debug extends Run { String ids; if (source) { - ids = h.location; + ids = locationAndLine(h.location, h.line); } else { ids = h.routeId + "/" + h.nodeId; } @@ -604,7 +604,7 @@ public class Debug extends Run { // node ids or source location String ids; if (source) { - ids = row.location; + ids = locationAndLine(row.location, -1); } else { ids = row.routeId + "/" + getId(row); } @@ -642,6 +642,12 @@ public class Debug extends Run { System.out.println(); } + private static String locationAndLine(String loc, int line) { + // shorten path as there is no much space + loc = FileUtil.stripPath(loc); + return line == -1 ? loc : loc + ":" + line; + } + private void clearScreen() { AnsiConsole.out().print(Ansi.ansi().eraseScreen().cursor(1, 1)); }