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 2013/04/04 17:11:26 UTC
svn commit: r1464589 - in /camel/trunk:
camel-core/src/main/java/org/apache/camel/management/mbean/
camel-core/src/main/java/org/apache/camel/util/
platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/
Author: davsclaus
Date: Thu Apr 4 15:11:25 2013
New Revision: 1464589
URL: http://svn.apache.org/r1464589
Log:
CAMEL-6237: Polished karaf commands
Modified:
camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java
camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java
camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java?rev=1464589&r1=1464588&r2=1464589&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedRoute.java Thu Apr 4 15:11:25 2013
@@ -19,7 +19,9 @@ package org.apache.camel.management.mbea
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.management.MBeanServer;
@@ -219,12 +221,13 @@ public class ManagedRoute extends Manage
}
public String dumpRouteStatsAsXml(boolean fullStats, boolean includeProcessors) throws Exception {
+ // in this logic we need to calculate the accumulated processing time for the processor in the route
+ // and hence why the logic is a bit more complicated to do this, as we need to caculate that from
+ // the bottom -> top of the route but this information is valuable for profiling routes
StringBuilder sb = new StringBuilder();
- sb.append("<routeStat").append(String.format(" id=\"%s\"", route.getId()));
- // use substring as we only want the attributes
- String stat = dumpStatsAsXml(fullStats);
- sb.append(" ").append(stat.substring(7, stat.length() - 2)).append(">\n");
+ // need to calculate this value first, as we need that value for the route stat
+ Long processorAccumulatedTime = 0L;
// gather all the processors for this route, which requires JMX
if (includeProcessors) {
@@ -237,25 +240,59 @@ public class ManagedRoute extends Manage
List<ManagedProcessorMBean> mps = new ArrayList<ManagedProcessorMBean>();
for (ObjectName on : names) {
ManagedProcessorMBean processor = MBeanServerInvocationHandler.newProxyInstance(server, on, ManagedProcessorMBean.class, true);
- mps.add(processor);
+
+ // the processor must belong to this route
+ if (getRouteId().equals(processor.getRouteId())) {
+ mps.add(processor);
+ }
}
Collections.sort(mps, new OrderProcessorMBeans());
+ // walk the processors in reverse order, and calculate the accumulated total time
+ Map<String, Long> accumulatedTimes = new HashMap<String, Long>();
+ Collections.reverse(mps);
+ for (ManagedProcessorMBean processor : mps) {
+ processorAccumulatedTime += processor.getTotalProcessingTime();
+ accumulatedTimes.put(processor.getProcessorId(), processorAccumulatedTime);
+ }
+ // and reverse back again
+ Collections.reverse(mps);
+
// and now add the sorted list of processors to the xml output
for (ManagedProcessorMBean processor : mps) {
- // the processor must belong to this route
- if (getRouteId().equals(processor.getRouteId())) {
- sb.append(" <processorStat").append(String.format(" id=\"%s\" index=\"%s\"", processor.getProcessorId(), processor.getIndex()));
- // use substring as we only want the attributes
- sb.append(" ").append(processor.dumpStatsAsXml(fullStats).substring(7)).append("\n");
+ sb.append(" <processorStat").append(String.format(" id=\"%s\" index=\"%s\"", processor.getProcessorId(), processor.getIndex()));
+ // do we have an accumulated time then append that
+ Long accTime = accumulatedTimes.get(processor.getProcessorId());
+ if (accTime != null) {
+ sb.append(" accumulatedProcessingTime=\"").append(accTime).append("\"");
}
+ // use substring as we only want the attributes
+ sb.append(" ").append(processor.dumpStatsAsXml(fullStats).substring(7)).append("\n");
}
}
sb.append(" </processorStats>\n");
}
- sb.append("</routeStat>");
- return sb.toString();
+ // route self time is route total - processor accumulated total)
+ long routeSelfTime = getTotalProcessingTime() - processorAccumulatedTime;
+ if (routeSelfTime < 0) {
+ // ensure we don't calculate that as negative
+ routeSelfTime = 0;
+ }
+
+ StringBuilder answer = new StringBuilder();
+ answer.append("<routeStat").append(String.format(" id=\"%s\"", route.getId()));
+ // use substring as we only want the attributes
+ String stat = dumpStatsAsXml(fullStats);
+ answer.append(" selfProcessingTime=\"").append(routeSelfTime).append("\"");
+ answer.append(" ").append(stat.substring(7, stat.length() - 2)).append(">\n");
+
+ if (includeProcessors) {
+ answer.append(sb);
+ }
+
+ answer.append("</routeStat>");
+ return answer.toString();
}
@Override
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java?rev=1464589&r1=1464588&r2=1464589&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java Thu Apr 4 15:11:25 2013
@@ -65,6 +65,9 @@ public final class ProcessorStatDump {
private Long meanProcessingTime;
@XmlAttribute
+ private Long accumulatedProcessingTime;
+
+ @XmlAttribute
private String resetTimestamp;
@XmlAttribute
@@ -187,6 +190,14 @@ public final class ProcessorStatDump {
this.meanProcessingTime = meanProcessingTime;
}
+ public Long getAccumulatedProcessingTime() {
+ return accumulatedProcessingTime;
+ }
+
+ public void setAccumulatedProcessingTime(Long accumulatedProcessingTime) {
+ this.accumulatedProcessingTime = accumulatedProcessingTime;
+ }
+
public String getResetTimestamp() {
return resetTimestamp;
}
Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java?rev=1464589&r1=1464588&r2=1464589&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java Thu Apr 4 15:11:25 2013
@@ -66,6 +66,9 @@ public final class RouteStatDump {
private Long meanProcessingTime;
@XmlAttribute
+ private Long selfProcessingTime;
+
+ @XmlAttribute
private String resetTimestamp;
@XmlAttribute
@@ -186,6 +189,14 @@ public final class RouteStatDump {
this.meanProcessingTime = meanProcessingTime;
}
+ public Long getSelfProcessingTime() {
+ return selfProcessingTime;
+ }
+
+ public void setSelfProcessingTime(Long selfProcessingTime) {
+ this.selfProcessingTime = selfProcessingTime;
+ }
+
public String getResetTimestamp() {
return resetTimestamp;
}
@@ -267,5 +278,3 @@ public final class RouteStatDump {
}
}
-
-
Modified: camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java?rev=1464589&r1=1464588&r2=1464589&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java (original)
+++ camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java Thu Apr 4 15:11:25 2013
@@ -39,8 +39,8 @@ import org.apache.karaf.util.StringEscap
@Command(scope = "camel", name = "route-profile", description = "Display profile information about Camel route(s).")
public class RouteProfile extends AbstractRouteCommand {
- protected static final String HEADER_FORMAT = "%-30s %10s %12s %12s %12s %12s %12s %12s";
- protected static final String OUTPUT_FORMAT = "[%-28s] [%8d] [%10d] [%10d] [%10d] [%10d] [%10d] [%10s]";
+ protected static final String HEADER_FORMAT = "%-30s %10s %12s %12s %12s %12s %12s %12s %12s";
+ protected static final String OUTPUT_FORMAT = "[%-28s] [%8d] [%10d] [%10d] [%10d] [%10d] [%10d] [%10d] [%10d]";
private String previousCamelContextName;
@@ -60,7 +60,7 @@ public class RouteProfile extends Abstra
System.out.println("");
System.out.println(StringEscapeUtils.unescapeJava("\u001B[1mProfile\u001B[0m"));
System.out.println(StringEscapeUtils.unescapeJava("\tCamel Context: " + camelRoute.getRouteContext().getCamelContext().getName()));
- System.out.println(String.format(HEADER_FORMAT, "Id", "Count", "Last (ms)", "Delta (ms)", "Mean (ms)", "Min (ms)", "Max (ms)", "Self (ms)"));
+ System.out.println(String.format(HEADER_FORMAT, "Id", "Count", "Last (ms)", "Delta (ms)", "Mean (ms)", "Min (ms)", "Max (ms)", "Total (ms)", "Self (ms)"));
}
// System.out.println(StringEscapeUtils.unescapeJava("\u001B[1m\u001B[33mCamel Route " + camelRoute.getId() + "\u001B[0m"));
// System.out.println(StringEscapeUtils.unescapeJava("\tEndpoint uri: " + URISupport.sanitizeUri(camelRoute.getEndpoint().getEndpointUri())));
@@ -74,22 +74,20 @@ public class RouteProfile extends Abstra
String camelId = (String) mBeanServer.getAttribute(routeMBean, "CamelId");
if (camelId != null && camelId.equals(camelContext.getName())) {
- // TODO: add column with total time (delta for self time)
-
String xml = (String) mBeanServer.invoke(routeMBean, "dumpRouteStatsAsXml", new Object[]{Boolean.FALSE, Boolean.TRUE}, new String[]{"boolean", "boolean"});
RouteStatDump route = (RouteStatDump) unmarshaller.unmarshal(new StringReader(xml));
long count = route.getExchangesCompleted() + route.getExchangesFailed();
System.out.println(String.format(OUTPUT_FORMAT, route.getId(), count, route.getLastProcessingTime(), route.getDeltaProcessingTime(),
- route.getMeanProcessingTime(), route.getMinProcessingTime(), route.getMaxProcessingTime(), ""));
+ route.getMeanProcessingTime(), route.getMinProcessingTime(), route.getMaxProcessingTime(), route.getTotalProcessingTime(), route.getSelfProcessingTime()));
for (ProcessorStatDump ps : route.getProcessorStats()) {
// the self time is the total time of the processor itself
- String selfTime = "" + ps.getTotalProcessingTime();
+ long selfTime = ps.getTotalProcessingTime();
count = ps.getExchangesCompleted() + ps.getExchangesFailed();
// indent route id with 2 spaces
- System.out.println(String.format(OUTPUT_FORMAT, " " + ps.getId(), count, ps.getLastProcessingTime(),
- ps.getDeltaProcessingTime(), ps.getMeanProcessingTime(), ps.getMinProcessingTime(), ps.getMaxProcessingTime(), selfTime));
+ System.out.println(String.format(OUTPUT_FORMAT, " " + ps.getId(), count, ps.getLastProcessingTime(), ps.getDeltaProcessingTime(),
+ ps.getMeanProcessingTime(), ps.getMinProcessingTime(), ps.getMaxProcessingTime(), ps.getAccumulatedProcessingTime(), selfTime));
}
}
}