You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/05/30 04:25:37 UTC
[camel] branch main updated: camel-console - Source console to dump route sources.
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 00526e77bfa camel-console - Source console to dump route sources.
00526e77bfa is described below
commit 00526e77bfa88bc20bcde640487cf7d83629e49d
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon May 30 06:24:17 2022 +0200
camel-console - Source console to dump route sources.
---
.../src/main/java/org/apache/camel/Route.java | 5 +
.../camel/impl/engine/AbstractCamelContext.java | 4 +-
.../org/apache/camel/impl/engine/DefaultRoute.java | 9 +-
.../services/org/apache/camel/dev-console/source | 2 +
.../apache/camel/impl/console/RouteDevConsole.java | 2 +-
...{RouteDevConsole.java => SourceDevConsole.java} | 109 +++++++++++++++------
.../apache/camel/impl/console/TopDevConsole.java | 5 +-
.../api/management/mbean/ManagedRouteMBean.java | 3 +
.../management/mbean/ManagedBacklogDebugger.java | 2 +-
.../camel/management/mbean/ManagedRoute.java | 8 +-
.../org/apache/camel/support/LoggerHelper.java | 31 ++++++
.../org/apache/camel/support/MessageHelper.java | 2 +-
.../camel/support/RouteWatcherReloadStrategy.java | 2 +-
13 files changed, 143 insertions(+), 41 deletions(-)
diff --git a/core/camel-api/src/main/java/org/apache/camel/Route.java b/core/camel-api/src/main/java/org/apache/camel/Route.java
index c5f46ec328c..500e407eb46 100644
--- a/core/camel-api/src/main/java/org/apache/camel/Route.java
+++ b/core/camel-api/src/main/java/org/apache/camel/Route.java
@@ -148,6 +148,11 @@ public interface Route extends RuntimeConfiguration {
*/
String getSourceLocation();
+ /**
+ * The source:line-number in short format that can be used for logging or summary purposes.
+ */
+ String getSourceLocationShort();
+
/**
* Gets the camel context
*
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 9ca2b73f3c3..6815fcd7168 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -3122,7 +3122,7 @@ public abstract class AbstractCamelContext extends BaseService
// use basic endpoint uri to not log verbose details or potential sensitive data
String uri = order.getRoute().getEndpoint().getEndpointBaseUri();
uri = URISupport.sanitizeUri(uri);
- String loc = order.getRoute().getSourceLocation();
+ String loc = order.getRoute().getSourceLocationShort();
if (startupSummaryLevel == StartupSummaryLevel.Verbose && loc != null) {
lines.add(String.format(" %s %s (%s) (source: %s)", status, id, uri, loc));
} else {
@@ -3145,7 +3145,7 @@ public abstract class AbstractCamelContext extends BaseService
// use basic endpoint uri to not log verbose details or potential sensitive data
String uri = route.getEndpoint().getEndpointBaseUri();
uri = URISupport.sanitizeUri(uri);
- String loc = route.getSourceLocation();
+ String loc = route.getSourceLocationShort();
if (startupSummaryLevel == StartupSummaryLevel.Verbose && loc != null) {
lines.add(String.format(" %s %s (%s) (source: %s)", status, id, uri, loc));
} else {
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index c35da8960f3..3a9d4671088 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -74,6 +74,7 @@ public class DefaultRoute extends ServiceSupport implements Route {
private final String routeDescription;
private final Resource sourceResource;
private final String sourceLocation;
+ private final String sourceLocationShort;
private final List<Processor> eventDrivenProcessors = new ArrayList<>();
private final List<InterceptStrategy> interceptStrategies = new ArrayList<>(0);
private ManagementInterceptStrategy managementInterceptStrategy;
@@ -118,7 +119,8 @@ public class DefaultRoute extends ServiceSupport implements Route {
this.routeDescription = routeDescription;
this.endpoint = endpoint;
this.sourceResource = resource;
- this.sourceLocation = LoggerHelper.getLineNumberLoggerName(route);
+ this.sourceLocation = LoggerHelper.getSourceLocation(route);
+ this.sourceLocationShort = LoggerHelper.getLineNumberLoggerName(route);
}
@Override
@@ -190,6 +192,11 @@ public class DefaultRoute extends ServiceSupport implements Route {
return sourceLocation;
}
+ @Override
+ public String getSourceLocationShort() {
+ return sourceLocationShort;
+ }
+
@Override
public void initializeServices() throws Exception {
// gather all the services for this route
diff --git a/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/source b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/source
new file mode 100644
index 00000000000..bfe41e9fd45
--- /dev/null
+++ b/core/camel-console/src/generated/resources/META-INF/services/org/apache/camel/dev-console/source
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.impl.console.SourceDevConsole
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
index 41a9b70e0f1..2bad41f3c15 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
@@ -134,7 +134,7 @@ public class RouteDevConsole extends AbstractDevConsole {
return PatternHelper.matchPattern(mrb.getRouteId(), filter)
|| PatternHelper.matchPattern(mrb.getEndpointUri(), filter)
- || PatternHelper.matchPattern(mrb.getSourceLocation(), filter);
+ || PatternHelper.matchPattern(mrb.getSourceLocationShort(), filter);
}
private static int sort(ManagedRouteMBean o1, ManagedRouteMBean o2) {
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/SourceDevConsole.java
similarity index 55%
copy from core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
copy to core/camel-console/src/main/java/org/apache/camel/impl/console/SourceDevConsole.java
index 41a9b70e0f1..c0c982a752c 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/SourceDevConsole.java
@@ -16,23 +16,28 @@
*/
package org.apache.camel.impl.console;
+import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.apache.camel.Exchange;
+import org.apache.camel.ExtendedCamelContext;
import org.apache.camel.Route;
import org.apache.camel.api.management.ManagedCamelContext;
import org.apache.camel.api.management.mbean.ManagedRouteMBean;
+import org.apache.camel.spi.Resource;
import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.LoggerHelper;
import org.apache.camel.support.PatternHelper;
+import org.apache.camel.util.IOHelper;
import org.apache.camel.util.StringHelper;
-import org.apache.camel.util.TimeUtils;
import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
-@DevConsole("route")
-public class RouteDevConsole extends AbstractDevConsole {
+@DevConsole("source")
+public class SourceDevConsole extends AbstractDevConsole {
/**
* Filters the routes matching by route id, route uri, and source location
@@ -44,30 +49,49 @@ public class RouteDevConsole extends AbstractDevConsole {
*/
public static final String LIMIT = "limit";
- public RouteDevConsole() {
- super("camel", "route", "Route", "Route information");
+ public SourceDevConsole() {
+ super("camel", "source", "Source", "Display route source code");
}
@Override
protected String doCallText(Map<String, Object> options) {
final StringBuilder sb = new StringBuilder();
Function<ManagedRouteMBean, Object> task = mrb -> {
- if (sb.length() > 0) {
- sb.append("\n");
+ String loc = mrb.getSourceLocation();
+ if (loc != null) {
+ loc = LoggerHelper.stripSourceLocationLineNumber(loc);
+ StringBuilder code = new StringBuilder();
+ try {
+ Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
+ .resolveResource(loc);
+ if (resource != null) {
+ if (sb.length() > 0) {
+ sb.append("\n");
+ }
+
+ LineNumberReader reader = new LineNumberReader(resource.getReader());
+ int i = 0;
+ String t;
+ do {
+ t = reader.readLine();
+ if (t != null) {
+ i++;
+ code.append(String.format("\n #%s %s", i, t));
+ }
+ } while (t != null);
+ IOHelper.close(reader);
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ sb.append(String.format(" Id: %s", mrb.getRouteId()));
+ if (mrb.getSourceLocation() != null) {
+ sb.append(String.format("\n Source: %s", mrb.getSourceLocation()));
+ }
+ if (code.length() > 0) {
+ sb.append(code);
+ }
}
- sb.append(String.format(" Id: %s", mrb.getRouteId()));
- sb.append(String.format("\n From: %s", mrb.getEndpointUri()));
- if (mrb.getSourceLocation() != null) {
- sb.append(String.format("\n Source: %s", mrb.getSourceLocation()));
- }
- sb.append(String.format("\n State: %s", mrb.getState()));
- sb.append(String.format("\n Uptime: %s", mrb.getUptime()));
- sb.append(String.format("\n Total: %s", mrb.getExchangesTotal()));
- sb.append(String.format("\n Failed: %s", mrb.getExchangesFailed()));
- sb.append(String.format("\n Inflight: %s", mrb.getExchangesInflight()));
- sb.append(String.format("\n Mean Time: %s", TimeUtils.printDuration(mrb.getMeanProcessingTime())));
- sb.append(String.format("\n Max Time: %s", TimeUtils.printDuration(mrb.getMaxProcessingTime())));
- sb.append(String.format("\n Min Time: %s", TimeUtils.printDuration(mrb.getMinProcessingTime())));
sb.append("\n");
return null;
};
@@ -89,16 +113,37 @@ public class RouteDevConsole extends AbstractDevConsole {
if (mrb.getSourceLocation() != null) {
jo.put("source", mrb.getSourceLocation());
}
- jo.put("state", mrb.getState());
- jo.put("uptime", mrb.getUptime());
- JsonObject stats = new JsonObject();
- stats.put("exchangesTotal", mrb.getExchangesTotal());
- stats.put("exchangesFailed", mrb.getExchangesFailed());
- stats.put("exchangesInflight", mrb.getExchangesInflight());
- stats.put("meanProcessingTime", mrb.getMeanProcessingTime());
- stats.put("maxProcessingTime", mrb.getMaxProcessingTime());
- stats.put("minProcessingTime", mrb.getMinProcessingTime());
- jo.put("statistics", stats);
+
+ String loc = mrb.getSourceLocation();
+ if (loc != null) {
+ List<JsonObject> code = new ArrayList<>();
+ try {
+ loc = LoggerHelper.stripSourceLocationLineNumber(loc);
+ Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
+ .resolveResource(loc);
+ if (resource != null) {
+ LineNumberReader reader = new LineNumberReader(resource.getReader());
+ int i = 0;
+ String t;
+ do {
+ t = reader.readLine();
+ if (t != null) {
+ i++;
+ JsonObject c = new JsonObject();
+ c.put("line", i);
+ c.put("code", Jsoner.escape(t));
+ code.add(c);
+ }
+ } while (t != null);
+ IOHelper.close(reader);
+ }
+ } catch (Exception e) {
+ // ignore
+ }
+ if (!code.isEmpty()) {
+ jo.put("code", code);
+ }
+ }
return null;
};
doCall(options, task);
@@ -121,7 +166,7 @@ public class RouteDevConsole extends AbstractDevConsole {
.map(route -> mcc.getManagedRoute(route.getRouteId()))
.filter(r -> accept(r, filter))
.filter(r -> accept(r, subPath))
- .sorted(RouteDevConsole::sort)
+ .sorted(SourceDevConsole::sort)
.limit(max)
.forEach(task::apply);
}
@@ -134,7 +179,7 @@ public class RouteDevConsole extends AbstractDevConsole {
return PatternHelper.matchPattern(mrb.getRouteId(), filter)
|| PatternHelper.matchPattern(mrb.getEndpointUri(), filter)
- || PatternHelper.matchPattern(mrb.getSourceLocation(), filter);
+ || PatternHelper.matchPattern(mrb.getSourceLocationShort(), filter);
}
private static int sort(ManagedRouteMBean o1, ManagedRouteMBean o2) {
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java
index 1507072bb12..390898c70f6 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/TopDevConsole.java
@@ -32,6 +32,7 @@ import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
import org.apache.camel.api.management.mbean.ManagedRouteMBean;
import org.apache.camel.spi.Resource;
import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.LoggerHelper;
import org.apache.camel.support.PatternHelper;
import org.apache.camel.util.IOHelper;
import org.apache.camel.util.StringHelper;
@@ -101,6 +102,7 @@ public class TopDevConsole extends AbstractDevConsole {
if (loc != null && mpb.getSourceLineNumber() != null) {
int line = mpb.getSourceLineNumber();
try {
+ loc = LoggerHelper.stripSourceLocationLineNumber(loc);
Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
.resolveResource(loc);
if (resource != null) {
@@ -198,6 +200,7 @@ public class TopDevConsole extends AbstractDevConsole {
if (loc != null && mpb.getSourceLineNumber() != null) {
int line = mpb.getSourceLineNumber();
try {
+ loc = LoggerHelper.stripSourceLocationLineNumber(loc);
Resource resource = getCamelContext().adapt(ExtendedCamelContext.class).getResourceLoader()
.resolveResource(loc);
if (resource != null) {
@@ -296,7 +299,7 @@ public class TopDevConsole extends AbstractDevConsole {
return PatternHelper.matchPattern(mrb.getRouteId(), filter)
|| PatternHelper.matchPattern(mrb.getEndpointUri(), filter)
- || PatternHelper.matchPattern(mrb.getSourceLocation(), filter);
+ || PatternHelper.matchPattern(mrb.getSourceLocationShort(), filter);
}
private static boolean acceptProcessor(ManagedProcessorMBean mpb, String filter) {
diff --git a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
index 4fcab632d83..83867af9540 100644
--- a/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
+++ b/core/camel-management-api/src/main/java/org/apache/camel/api/management/mbean/ManagedRouteMBean.java
@@ -40,6 +40,9 @@ public interface ManagedRouteMBean extends ManagedPerformanceCounterMBean {
@ManagedAttribute(description = "Route Source Location")
String getSourceLocation();
+ @ManagedAttribute(description = "Route Source Location (Short)")
+ String getSourceLocationShort();
+
@ManagedAttribute(description = "Route Configuration ID")
String getRouteConfigurationId();
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java
index 9db605ac689..0f78390a6fc 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedBacklogDebugger.java
@@ -387,7 +387,7 @@ public class ManagedBacklogDebugger implements ManagedBacklogDebuggerMBean {
// add incoming origin of message on the top
String routeId = suspendedExchange.getFromRouteId();
Route route = suspendedExchange.getContext().getRoute(routeId);
- String loc = route != null ? route.getSourceLocation() : "";
+ String loc = route != null ? route.getSourceLocationShort() : "";
String id = routeId;
String label = "";
if (suspendedExchange.getFromEndpoint() != null) {
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
index b4effeab2b6..ec490f49bb6 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
@@ -74,6 +74,7 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
protected final String description;
protected final String configurationId;
protected final String sourceLocation;
+ protected final String sourceLocationShort;
protected final CamelContext context;
private final LoadTriplet load = new LoadTriplet();
private final String jmxDomain;
@@ -84,6 +85,7 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
this.description = route.getDescription();
this.configurationId = route.getConfigurationId();
this.sourceLocation = route.getSourceLocation();
+ this.sourceLocationShort = route.getSourceLocationShort();
this.jmxDomain = context.getManagementStrategy().getManagementAgent().getMBeanObjectDomainName();
}
@@ -152,6 +154,11 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
return sourceLocation;
}
+ @Override
+ public String getSourceLocationShort() {
+ return null;
+ }
+
@Override
public String getRouteConfigurationId() {
return configurationId;
@@ -699,7 +706,6 @@ public class ManagedRoute extends ManagedPerformanceCounter implements TimerList
MBeanServer server = getContext().getManagementStrategy().getManagementAgent().getMBeanServer();
if (server != null) {
String prefix = getContext().getManagementStrategy().getManagementAgent().getIncludeHostName() ? "*/" : "";
- List<ManagedProcessorMBean> processors = new ArrayList<>();
// gather all the processors for this CamelContext, which requires JMX
ObjectName query = ObjectName
.getInstance(jmxDomain + ":context=" + prefix + getContext().getManagementName() + ",type=processors,*");
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java
index f475e300f1f..357cb858ca1 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/LoggerHelper.java
@@ -19,6 +19,7 @@ package org.apache.camel.support;
import org.apache.camel.LineNumberAware;
import org.apache.camel.NamedRoute;
import org.apache.camel.util.FileUtil;
+import org.apache.camel.util.StringHelper;
/**
* Helper for logging purposes.
@@ -67,4 +68,34 @@ public final class LoggerHelper {
return name;
}
+ public static String getSourceLocation(Object node) {
+ String name = null;
+ if (node instanceof LineNumberAware) {
+ if (node instanceof NamedRoute) {
+ // we want the input from a route as it has the source location / line number
+ node = ((NamedRoute) node).getInput();
+ }
+ String loc = ((LineNumberAware) node).getLocation();
+ int line = ((LineNumberAware) node).getLineNumber();
+ if (loc != null) {
+ // is it a class or file?
+ name = loc;
+ if (line != -1) {
+ name += ":" + line;
+ }
+ }
+ }
+ return name;
+ }
+
+ public static String stripSourceLocationLineNumber(String location) {
+ int cnt = StringHelper.countChar(location, ':');
+ if (cnt > 1) {
+ int pos = location.lastIndexOf(':');
+ return location.substring(0, pos);
+ } else {
+ return location;
+ }
+ }
+
}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
index a1d285a6784..4d24c6699e3 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/MessageHelper.java
@@ -582,7 +582,7 @@ public final class MessageHelper {
// add incoming origin of message on the top
String routeId = exchange.getFromRouteId();
Route route = exchange.getContext().getRoute(routeId);
- String loc = route != null ? route.getSourceLocation() : null;
+ String loc = route != null ? route.getSourceLocationShort() : null;
if (loc == null) {
loc = "";
}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
index 8fe7c04fd0f..ecf753715ac 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
@@ -241,7 +241,7 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg
// use basic endpoint uri to not log verbose details or potential sensitive data
String uri = route.getEndpoint().getEndpointBaseUri();
uri = URISupport.sanitizeUri(uri);
- String loc = route.getSourceLocation();
+ String loc = route.getSourceLocationShort();
if (loc == null) {
loc = "";
}