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/03 20:46:25 UTC

svn commit: r1464155 - in /camel/trunk: camel-core/src/main/java/org/apache/camel/util/ camel-core/src/main/resources/org/apache/camel/util/ platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/ platforms/karaf/commands/src/main/resou...

Author: davsclaus
Date: Wed Apr  3 18:46:25 2013
New Revision: 1464155

URL: http://svn.apache.org/r1464155
Log:
CAMEL-6237: Karaf camel command for profiling routes. Work in progress.

Added:
    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
      - copied, changed from r1463986, camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageDump.java
    camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java
      - copied, changed from r1463986, camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteInfo.java
Modified:
    camel/trunk/camel-core/src/main/resources/org/apache/camel/util/jaxb.index
    camel/trunk/platforms/karaf/commands/src/main/resources/OSGI-INF/blueprint/camel-commands.xml

Added: 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=1464155&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/ProcessorStatDump.java Wed Apr  3 18:46:25 2013
@@ -0,0 +1,229 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.util;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * A model of a route stat dump from {@link org.apache.camel.api.management.mbean.ManagedRouteMBean#dumpRouteAsXml()}.
+ */
+@XmlRootElement(name = "processorStat")
+@XmlAccessorType(XmlAccessType.FIELD)
+public final class ProcessorStatDump {
+
+    @XmlAttribute
+    private String id;
+
+    @XmlAttribute
+    private Long exchangesCompleted;
+
+    @XmlAttribute
+    private Long exchangesFailed;
+
+    @XmlAttribute
+    private Long failuresHandled;
+
+    @XmlAttribute
+    private Long redeliveries;
+
+    @XmlAttribute
+    private Long minProcessingTime;
+
+    @XmlAttribute
+    private Long maxProcessingTime;
+
+    @XmlAttribute
+    private Long totalProcessingTime;
+
+    @XmlAttribute
+    private Long lastProcessingTime;
+
+    @XmlAttribute
+    private Long meanProcessingTime;
+
+    @XmlAttribute
+    private String firstExchangeCompletedTimestamp;
+
+    @XmlAttribute
+    private String firstExchangeCompletedExchangeId;
+
+    @XmlAttribute
+    private String firstExchangeFailureTimestamp;
+
+    @XmlAttribute
+    private String firstExchangeFailureExchangeId;
+
+    @XmlAttribute
+    private String lastExchangeCompletedTimestamp;
+
+    @XmlAttribute
+    private String lastExchangeCompletedExchangeId;
+
+    @XmlAttribute
+    private String lastExchangeFailureTimestamp;
+
+    @XmlAttribute
+    private String lastExchangeFailureExchangeId;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Long getExchangesCompleted() {
+        return exchangesCompleted;
+    }
+
+    public void setExchangesCompleted(Long exchangesCompleted) {
+        this.exchangesCompleted = exchangesCompleted;
+    }
+
+    public Long getExchangesFailed() {
+        return exchangesFailed;
+    }
+
+    public void setExchangesFailed(Long exchangesFailed) {
+        this.exchangesFailed = exchangesFailed;
+    }
+
+    public Long getFailuresHandled() {
+        return failuresHandled;
+    }
+
+    public void setFailuresHandled(Long failuresHandled) {
+        this.failuresHandled = failuresHandled;
+    }
+
+    public Long getRedeliveries() {
+        return redeliveries;
+    }
+
+    public void setRedeliveries(Long redeliveries) {
+        this.redeliveries = redeliveries;
+    }
+
+    public Long getMinProcessingTime() {
+        return minProcessingTime;
+    }
+
+    public void setMinProcessingTime(Long minProcessingTime) {
+        this.minProcessingTime = minProcessingTime;
+    }
+
+    public Long getMaxProcessingTime() {
+        return maxProcessingTime;
+    }
+
+    public void setMaxProcessingTime(Long maxProcessingTime) {
+        this.maxProcessingTime = maxProcessingTime;
+    }
+
+    public Long getTotalProcessingTime() {
+        return totalProcessingTime;
+    }
+
+    public void setTotalProcessingTime(Long totalProcessingTime) {
+        this.totalProcessingTime = totalProcessingTime;
+    }
+
+    public Long getLastProcessingTime() {
+        return lastProcessingTime;
+    }
+
+    public void setLastProcessingTime(Long lastProcessingTime) {
+        this.lastProcessingTime = lastProcessingTime;
+    }
+
+    public Long getMeanProcessingTime() {
+        return meanProcessingTime;
+    }
+
+    public void setMeanProcessingTime(Long meanProcessingTime) {
+        this.meanProcessingTime = meanProcessingTime;
+    }
+
+    public String getFirstExchangeCompletedTimestamp() {
+        return firstExchangeCompletedTimestamp;
+    }
+
+    public void setFirstExchangeCompletedTimestamp(String firstExchangeCompletedTimestamp) {
+        this.firstExchangeCompletedTimestamp = firstExchangeCompletedTimestamp;
+    }
+
+    public String getFirstExchangeCompletedExchangeId() {
+        return firstExchangeCompletedExchangeId;
+    }
+
+    public void setFirstExchangeCompletedExchangeId(String firstExchangeCompletedExchangeId) {
+        this.firstExchangeCompletedExchangeId = firstExchangeCompletedExchangeId;
+    }
+
+    public String getFirstExchangeFailureTimestamp() {
+        return firstExchangeFailureTimestamp;
+    }
+
+    public void setFirstExchangeFailureTimestamp(String firstExchangeFailureTimestamp) {
+        this.firstExchangeFailureTimestamp = firstExchangeFailureTimestamp;
+    }
+
+    public String getFirstExchangeFailureExchangeId() {
+        return firstExchangeFailureExchangeId;
+    }
+
+    public void setFirstExchangeFailureExchangeId(String firstExchangeFailureExchangeId) {
+        this.firstExchangeFailureExchangeId = firstExchangeFailureExchangeId;
+    }
+
+    public String getLastExchangeCompletedTimestamp() {
+        return lastExchangeCompletedTimestamp;
+    }
+
+    public void setLastExchangeCompletedTimestamp(String lastExchangeCompletedTimestamp) {
+        this.lastExchangeCompletedTimestamp = lastExchangeCompletedTimestamp;
+    }
+
+    public String getLastExchangeCompletedExchangeId() {
+        return lastExchangeCompletedExchangeId;
+    }
+
+    public void setLastExchangeCompletedExchangeId(String lastExchangeCompletedExchangeId) {
+        this.lastExchangeCompletedExchangeId = lastExchangeCompletedExchangeId;
+    }
+
+    public String getLastExchangeFailureTimestamp() {
+        return lastExchangeFailureTimestamp;
+    }
+
+    public void setLastExchangeFailureTimestamp(String lastExchangeFailureTimestamp) {
+        this.lastExchangeFailureTimestamp = lastExchangeFailureTimestamp;
+    }
+
+    public String getLastExchangeFailureExchangeId() {
+        return lastExchangeFailureExchangeId;
+    }
+
+    public void setLastExchangeFailureExchangeId(String lastExchangeFailureExchangeId) {
+        this.lastExchangeFailureExchangeId = lastExchangeFailureExchangeId;
+    }
+
+}

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java (from r1463986, camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageDump.java)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageDump.java&r1=1463986&r2=1464155&rev=1464155&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/util/MessageDump.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/util/RouteStatDump.java Wed Apr  3 18:46:25 2013
@@ -21,117 +21,229 @@ import javax.xml.bind.annotation.XmlAcce
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementRef;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlElements;
 import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlValue;
 
 /**
- * A model of a message dump from {@link MessageHelper#dumpAsXml(org.apache.camel.Message)}.
+ * A model of a route stat dump from {@link org.apache.camel.api.management.mbean.ManagedRouteMBean#dumpRouteAsXml()}.
  */
-@XmlRootElement(name = "message")
+@XmlRootElement(name = "routeStat")
 @XmlAccessorType(XmlAccessType.FIELD)
-public final class MessageDump {
+public final class RouteStatDump {
 
-    @XmlRootElement(name = "header")
-    @XmlAccessorType(XmlAccessType.FIELD)
-    public static class Header {
+    @XmlAttribute
+    private String id;
 
-        @XmlAttribute
-        private String key;
+    @XmlAttribute
+    private Long exchangesCompleted;
 
-        @XmlAttribute
-        private String type;
+    @XmlAttribute
+    private Long exchangesFailed;
 
-        @XmlValue
-        private String value;
+    @XmlAttribute
+    private Long failuresHandled;
 
-        public String getKey() {
-            return key;
-        }
+    @XmlAttribute
+    private Long redeliveries;
 
-        public void setKey(String key) {
-            this.key = key;
-        }
+    @XmlAttribute
+    private Long minProcessingTime;
 
-        public String getType() {
-            return type;
-        }
+    @XmlAttribute
+    private Long maxProcessingTime;
 
-        public void setType(String type) {
-            this.type = type;
-        }
+    @XmlAttribute
+    private Long totalProcessingTime;
 
-        public String getValue() {
-            return value;
-        }
+    @XmlAttribute
+    private Long lastProcessingTime;
 
-        public void setValue(String value) {
-            this.value = value;
-        }
-    }
+    @XmlAttribute
+    private Long meanProcessingTime;
 
-    @XmlRootElement(name = "body")
-    @XmlAccessorType(XmlAccessType.FIELD)
-    public static class Body {
+    @XmlAttribute
+    private String firstExchangeCompletedTimestamp;
 
-        @XmlAttribute
-        private String type;
+    @XmlAttribute
+    private String firstExchangeCompletedExchangeId;
 
-        @XmlValue
-        private String value;
+    @XmlAttribute
+    private String firstExchangeFailureTimestamp;
 
-        public String getType() {
-            return type;
-        }
+    @XmlAttribute
+    private String firstExchangeFailureExchangeId;
 
-        public void setType(String type) {
-            this.type = type;
-        }
+    @XmlAttribute
+    private String lastExchangeCompletedTimestamp;
 
-        public String getValue() {
-            return value;
-        }
+    @XmlAttribute
+    private String lastExchangeCompletedExchangeId;
 
-        public void setValue(String value) {
-            this.value = value;
-        }
-    }
+    @XmlAttribute
+    private String lastExchangeFailureTimestamp;
 
     @XmlAttribute
-    private String exchangeId;
+    private String lastExchangeFailureExchangeId;
 
-    @XmlElementWrapper(name = "headers")
+    @XmlElementWrapper(name = "processorStats")
     @XmlElements({
-        @XmlElement(type = Header.class, name = "header")
+            @XmlElement(type = ProcessorStatDump.class, name = "processorStat")
     })
-    private List<Header> headers;
+    private List<ProcessorStatDump> processorStats;
 
-    @XmlElementRef
-    private Body body;
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
 
-    public String getExchangeId() {
-        return exchangeId;
+    public Long getExchangesCompleted() {
+        return exchangesCompleted;
     }
 
-    public void setExchangeId(String exchangeId) {
-        this.exchangeId = exchangeId;
+    public void setExchangesCompleted(Long exchangesCompleted) {
+        this.exchangesCompleted = exchangesCompleted;
     }
 
-    public List<Header> getHeaders() {
-        return headers;
+    public Long getExchangesFailed() {
+        return exchangesFailed;
     }
 
-    public void setHeaders(List<Header> headers) {
-        this.headers = headers;
+    public void setExchangesFailed(Long exchangesFailed) {
+        this.exchangesFailed = exchangesFailed;
     }
 
-    public Body getBody() {
-        return body;
+    public Long getFailuresHandled() {
+        return failuresHandled;
     }
 
-    public void setBody(Body body) {
-        this.body = body;
+    public void setFailuresHandled(Long failuresHandled) {
+        this.failuresHandled = failuresHandled;
     }
+
+    public Long getRedeliveries() {
+        return redeliveries;
+    }
+
+    public void setRedeliveries(Long redeliveries) {
+        this.redeliveries = redeliveries;
+    }
+
+    public Long getMinProcessingTime() {
+        return minProcessingTime;
+    }
+
+    public void setMinProcessingTime(Long minProcessingTime) {
+        this.minProcessingTime = minProcessingTime;
+    }
+
+    public Long getMaxProcessingTime() {
+        return maxProcessingTime;
+    }
+
+    public void setMaxProcessingTime(Long maxProcessingTime) {
+        this.maxProcessingTime = maxProcessingTime;
+    }
+
+    public Long getTotalProcessingTime() {
+        return totalProcessingTime;
+    }
+
+    public void setTotalProcessingTime(Long totalProcessingTime) {
+        this.totalProcessingTime = totalProcessingTime;
+    }
+
+    public Long getLastProcessingTime() {
+        return lastProcessingTime;
+    }
+
+    public void setLastProcessingTime(Long lastProcessingTime) {
+        this.lastProcessingTime = lastProcessingTime;
+    }
+
+    public Long getMeanProcessingTime() {
+        return meanProcessingTime;
+    }
+
+    public void setMeanProcessingTime(Long meanProcessingTime) {
+        this.meanProcessingTime = meanProcessingTime;
+    }
+
+    public String getFirstExchangeCompletedTimestamp() {
+        return firstExchangeCompletedTimestamp;
+    }
+
+    public void setFirstExchangeCompletedTimestamp(String firstExchangeCompletedTimestamp) {
+        this.firstExchangeCompletedTimestamp = firstExchangeCompletedTimestamp;
+    }
+
+    public String getFirstExchangeCompletedExchangeId() {
+        return firstExchangeCompletedExchangeId;
+    }
+
+    public void setFirstExchangeCompletedExchangeId(String firstExchangeCompletedExchangeId) {
+        this.firstExchangeCompletedExchangeId = firstExchangeCompletedExchangeId;
+    }
+
+    public String getFirstExchangeFailureTimestamp() {
+        return firstExchangeFailureTimestamp;
+    }
+
+    public void setFirstExchangeFailureTimestamp(String firstExchangeFailureTimestamp) {
+        this.firstExchangeFailureTimestamp = firstExchangeFailureTimestamp;
+    }
+
+    public String getFirstExchangeFailureExchangeId() {
+        return firstExchangeFailureExchangeId;
+    }
+
+    public void setFirstExchangeFailureExchangeId(String firstExchangeFailureExchangeId) {
+        this.firstExchangeFailureExchangeId = firstExchangeFailureExchangeId;
+    }
+
+    public String getLastExchangeCompletedTimestamp() {
+        return lastExchangeCompletedTimestamp;
+    }
+
+    public void setLastExchangeCompletedTimestamp(String lastExchangeCompletedTimestamp) {
+        this.lastExchangeCompletedTimestamp = lastExchangeCompletedTimestamp;
+    }
+
+    public String getLastExchangeCompletedExchangeId() {
+        return lastExchangeCompletedExchangeId;
+    }
+
+    public void setLastExchangeCompletedExchangeId(String lastExchangeCompletedExchangeId) {
+        this.lastExchangeCompletedExchangeId = lastExchangeCompletedExchangeId;
+    }
+
+    public String getLastExchangeFailureTimestamp() {
+        return lastExchangeFailureTimestamp;
+    }
+
+    public void setLastExchangeFailureTimestamp(String lastExchangeFailureTimestamp) {
+        this.lastExchangeFailureTimestamp = lastExchangeFailureTimestamp;
+    }
+
+    public String getLastExchangeFailureExchangeId() {
+        return lastExchangeFailureExchangeId;
+    }
+
+    public void setLastExchangeFailureExchangeId(String lastExchangeFailureExchangeId) {
+        this.lastExchangeFailureExchangeId = lastExchangeFailureExchangeId;
+    }
+
+    public List<ProcessorStatDump> getProcessorStats() {
+        return processorStats;
+    }
+
+    public void setProcessorStats(List<ProcessorStatDump> processorStats) {
+        this.processorStats = processorStats;
+    }
+
 }
+
+

Modified: camel/trunk/camel-core/src/main/resources/org/apache/camel/util/jaxb.index
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/resources/org/apache/camel/util/jaxb.index?rev=1464155&r1=1464154&r2=1464155&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/resources/org/apache/camel/util/jaxb.index (original)
+++ camel/trunk/camel-core/src/main/resources/org/apache/camel/util/jaxb.index Wed Apr  3 18:46:25 2013
@@ -14,4 +14,6 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 ## ------------------------------------------------------------------------
-MessageDump
\ No newline at end of file
+MessageDump
+ProcessorStatDump
+RouteStatDump

Copied: camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java (from r1463986, camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteInfo.java)
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java?p2=camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java&p1=camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteInfo.java&r1=1463986&r2=1464155&rev=1464155&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteInfo.java (original)
+++ camel/trunk/platforms/karaf/commands/src/main/java/org/apache/camel/karaf/commands/RouteProfile.java Wed Apr  3 18:46:25 2013
@@ -16,30 +16,33 @@
  */
 package org.apache.camel.karaf.commands;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
+import java.io.StringReader;
 import java.util.Iterator;
 import java.util.Set;
-
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Route;
 import org.apache.camel.management.DefaultManagementAgent;
-import org.apache.camel.model.ModelHelper;
-import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spi.ManagementAgent;
+import org.apache.camel.util.ProcessorStatDump;
+import org.apache.camel.util.RouteStatDump;
 import org.apache.felix.gogo.commands.Argument;
 import org.apache.felix.gogo.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.apache.karaf.util.StringEscapeUtils;
 
 /**
- * Command to display detailed information about a Camel route.
+ * Command to display profile information about a Camel route.
  */
-@Command(scope = "camel", name = "route-info", description = "Display information about a Camel route.")
-public class RouteInfo extends OsgiCommandSupport {
+@Command(scope = "camel", name = "route-profile", description = "Display profile information about a Camel route.")
+public class RouteProfile extends OsgiCommandSupport {
+
+    protected static final String HEADER_FORMAT = "%-30s %10s %10s %12s %12s %12s %12s %12s";
+    protected static final String OUTPUT_FORMAT = "[%-28s] [%8d] [%8d] [%10d] [%10d] [%10d] [%10d] [%10d]";
 
     @Argument(index = 0, name = "route", description = "The Camel route ID.", required = true, multiValued = false)
     String route;
@@ -61,15 +64,13 @@ public class RouteInfo extends OsgiComma
             return null;
         }
 
+        JAXBContext context = JAXBContext.newInstance(RouteStatDump.class);
+        Unmarshaller unmarshaller = context.createUnmarshaller();
+
         System.out.println(StringEscapeUtils.unescapeJava("\u001B[1m\u001B[33mCamel Route " + camelRoute.getId() + "\u001B[0m"));
         System.out.println(StringEscapeUtils.unescapeJava("\tCamel Context: " + camelRoute.getRouteContext().getCamelContext().getName()));
         System.out.println("");
-        System.out.println(StringEscapeUtils.unescapeJava("\u001B[1mProperties\u001B[0m"));
-        for (String property : camelRoute.getProperties().keySet()) {
-            System.out.println(StringEscapeUtils.unescapeJava("\t\t" + property + " = " + camelRoute.getProperties().get(property)));
-        }
-        System.out.println("");
-        System.out.println(StringEscapeUtils.unescapeJava("\u001B[1mStatistics\u001B[0m"));
+        System.out.println(StringEscapeUtils.unescapeJava("\u001B[1mProfile\u001B[0m"));
         CamelContext camelContext = camelRoute.getRouteContext().getCamelContext();
         if (camelContext != null) {
             ManagementAgent agent = camelContext.getManagementStrategy().getManagementAgent();
@@ -79,58 +80,33 @@ public class RouteInfo extends OsgiComma
                 Iterator<ObjectName> iterator = set.iterator();
                 if (iterator.hasNext()) {
                     ObjectName routeMBean = iterator.next();
-                    Long exchangesTotal = (Long) mBeanServer.getAttribute(routeMBean, "ExchangesTotal");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tExchanges Total: " + exchangesTotal));
-                    Long exchangesCompleted = (Long) mBeanServer.getAttribute(routeMBean, "ExchangesCompleted");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tExchanges Completed: " + exchangesCompleted));
-                    Long exchangesFailed = (Long) mBeanServer.getAttribute(routeMBean, "ExchangesFailed");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tExchanges Failed: " + exchangesFailed));
-                    Long minProcessingTime = (Long) mBeanServer.getAttribute(routeMBean, "MinProcessingTime");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tMin Processing Time: " + minProcessingTime + "ms"));
-                    Long maxProcessingTime = (Long) mBeanServer.getAttribute(routeMBean, "MaxProcessingTime");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tMax Processing Time: " + maxProcessingTime + "ms"));
-                    Long meanProcessingTime = (Long) mBeanServer.getAttribute(routeMBean, "MeanProcessingTime");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tMean Processing Time: " + meanProcessingTime + "ms"));
-                    Long totalProcessingTime = (Long) mBeanServer.getAttribute(routeMBean, "TotalProcessingTime");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tTotal Processing Time: " + totalProcessingTime + "ms"));
-                    Long lastProcessingTime = (Long) mBeanServer.getAttribute(routeMBean, "LastProcessingTime");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tLast Processing Time: " + lastProcessingTime + "ms"));
-                    String load01 = (String) mBeanServer.getAttribute(routeMBean, "Load01");
-                    String load05 = (String) mBeanServer.getAttribute(routeMBean, "Load05");
-                    String load15 = (String) mBeanServer.getAttribute(routeMBean, "Load15");
-                    System.out.println(StringEscapeUtils.unescapeJava("\tLoad Avg: " + load01 + ", " + load05 + ", " + load15));
-
-                    // Test for null to see if a any exchanges have been processed first to avoid NPE
-                    Object firstExchangeTimestampObj = mBeanServer.getAttribute(routeMBean, "FirstExchangeCompletedTimestamp");
-                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-                    if (firstExchangeTimestampObj == null) {
-                        // Print an empty value for scripting
-                        System.out.println(StringEscapeUtils.unescapeJava("\tFirst Exchange Date:"));
-                    } else {
-                        Date firstExchangeTimestamp = (Date) firstExchangeTimestampObj;
-                        System.out.println(StringEscapeUtils.unescapeJava("\tFirst Exchange Date: " + format.format(firstExchangeTimestamp)));
-                    }
 
-                    // Again, check for null to avoid NPE
-                    Object lastExchangeCompletedTimestampObj = mBeanServer.getAttribute(routeMBean, "LastExchangeCompletedTimestamp");
-                    if (lastExchangeCompletedTimestampObj == null) {
-                        // Print an empty value for scripting
-                        System.out.println(StringEscapeUtils.unescapeJava("\tLast Exchange Completed Date:"));
-                    } else {
-                        Date lastExchangeCompletedTimestamp = (Date) lastExchangeCompletedTimestampObj;
-                        System.out.println(StringEscapeUtils.unescapeJava("\tLast Exchange Completed Date: " + format.format(lastExchangeCompletedTimestamp)));
+                    // TODO: add a row with the route endpoint, so you can see that
+                    // TODO: add column with total time (delta for self time)
+                    // TODO: ensure the jmx mbeans for processors is sorted correctly
+
+                    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));
+
+                    System.out.println(String.format(HEADER_FORMAT, "Id", "Completed", "Failed", "Last (ms)", "Mean (ms)", "Min (ms)", "Max (ms)", "Self (ms)"));
+                    System.out.println(String.format(OUTPUT_FORMAT, route.getId(), route.getExchangesCompleted(), route.getExchangesFailed(), route.getLastProcessingTime(),
+                            route.getMeanProcessingTime(), route.getMinProcessingTime(), route.getMaxProcessingTime(), route.getTotalProcessingTime(), 0));
+
+                    // output in reverse order which prints the route as we want
+                    for (int i = route.getProcessorStats().size() - 1; i >= 0; i--) {
+                        ProcessorStatDump ps = route.getProcessorStats().get(i);
+                        // the self time is the total time of the processor itself
+                        long selfTime = ps.getTotalProcessingTime();
+                        // indent route id with 2 spaces
+                        System.out.println(String.format(OUTPUT_FORMAT, "  " + ps.getId(), ps.getExchangesCompleted(), ps.getExchangesFailed(), ps.getLastProcessingTime(),
+                                ps.getMeanProcessingTime(), ps.getMinProcessingTime(), ps.getMaxProcessingTime(), selfTime));
                     }
                 }
             } else {
                 System.out.println("");
                 System.out.println(StringEscapeUtils.unescapeJava("\u001B[31mJMX Agent of Camel is not reachable. Maybe it has been disabled on the Camel context"));
-                System.out.println(StringEscapeUtils.unescapeJava("In consequence, some statistics are not available.\u001B[0m"));
+                System.out.println(StringEscapeUtils.unescapeJava("In consequence, profile are not available.\u001B[0m"));
             }
-
-            System.out.println("");
-            System.out.println(StringEscapeUtils.unescapeJava("\u001B[1mDefinition\u001B[0m"));
-            RouteDefinition definition = camelController.getRouteDefinition(route, camelRoute.getRouteContext().getCamelContext().getName());
-            System.out.println(StringEscapeUtils.unescapeJava(ModelHelper.dumpModelAsXml(definition)));
         }
         return null;
     }

Modified: camel/trunk/platforms/karaf/commands/src/main/resources/OSGI-INF/blueprint/camel-commands.xml
URL: http://svn.apache.org/viewvc/camel/trunk/platforms/karaf/commands/src/main/resources/OSGI-INF/blueprint/camel-commands.xml?rev=1464155&r1=1464154&r2=1464155&view=diff
==============================================================================
--- camel/trunk/platforms/karaf/commands/src/main/resources/OSGI-INF/blueprint/camel-commands.xml (original)
+++ camel/trunk/platforms/karaf/commands/src/main/resources/OSGI-INF/blueprint/camel-commands.xml Wed Apr  3 18:46:25 2013
@@ -68,6 +68,15 @@
                 <null/>
             </completers>
         </command>
+        <command name="camel/route-profile">
+            <action class="org.apache.camel.karaf.commands.RouteProfile">
+                <property name="camelController" ref="camelController"/>
+            </action>
+            <completers>
+                <ref component-id="routeCompleter"/>
+                <null/>
+            </completers>
+        </command>
         <command name="camel/route-show">
             <action class="org.apache.camel.karaf.commands.RouteShow">
                 <property name="camelController" ref="camelController"/>