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 <[email protected]>
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));
}