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 dc8780d0ce25 CAMEL-23385: camel-jbang - Prepare for adding metric to 
route diagram (#23091)
dc8780d0ce25 is described below

commit dc8780d0ce25a0b2aebf361e155dfa46d8538f49
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun May 10 10:53:55 2026 +0200

    CAMEL-23385: camel-jbang - Prepare for adding metric to route diagram 
(#23091)
    
    * CAMEL-23385: camel-jbang - Prepare for adding metric to route diagram
---
 .../apache/camel/diagram/RouteDiagramHelper.java   | 31 +++++++
 .../camel/diagram/RouteDiagramLayoutEngine.java    | 25 ++++++
 .../camel/impl/console/ProcessorDevConsole.java    |  4 +-
 .../apache/camel/impl/console/RouteDevConsole.java | 99 ++++++++++++----------
 .../impl/console/RouteStructureDevConsole.java     | 41 ++++++++-
 .../camel-jbang-cmd-route-diagram.adoc             |  1 +
 .../camel/cli/connector/LocalCliConnector.java     |  3 +-
 .../META-INF/camel-jbang-commands-metadata.json    |  2 +-
 .../commands/action/CamelRouteDiagramAction.java   |  5 ++
 9 files changed, 158 insertions(+), 53 deletions(-)

diff --git 
a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java
 
b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java
index f4558c8bd117..645110f0ca9b 100644
--- 
a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java
+++ 
b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramHelper.java
@@ -70,6 +70,37 @@ public final class RouteDiagramHelper {
                     node.description = line.getString("description");
                     Integer level = line.getInteger("level");
                     node.level = level != null ? level : 0;
+
+                    if (line.containsKey("statistics")) {
+                        JsonObject ls = line.getJsonObject("statistics");
+                        RouteDiagramLayoutEngine.StatInfo stat;
+                        if ("route".equals(node.type)) {
+                            // route has some special stats
+                            var s = new 
RouteDiagramLayoutEngine.RouteStatInfo();
+                            s.coverage = ls.getString("coverage");
+                            s.load01 = ls.getString("load01");
+                            s.load05 = ls.getString("load05");
+                            s.load15 = ls.getString("load15");
+                            s.exchangesThroughput = 
ls.getString("exchangesThroughput");
+                            stat = s;
+                        } else {
+                            // common stats
+                            stat = new RouteDiagramLayoutEngine.StatInfo();
+                        }
+                        node.stat = stat;
+                        stat.idleSince = ls.getLong("idleSince");
+                        stat.exchangesTotal = ls.getLong("exchangesTotal");
+                        stat.exchangesFailed = ls.getLong("exchangesFailed");
+                        stat.exchangesInflight = 
ls.getLong("exchangesInflight");
+                        stat.meanProcessingTime = 
ls.getLong("meanProcessingTime");
+                        stat.maxProcessingTime = 
ls.getLong("maxProcessingTime");
+                        stat.minProcessingTime = 
ls.getLong("minProcessingTime");
+                        stat.lastProcessingTime = 
ls.getLongOrDefault("lastProcessingTime", -1);
+                        stat.deltaProcessingTime = 
ls.getLongOrDefault("deltaProcessingTime", -1);
+                        stat.lastCreatedExchangeTimestamp = 
ls.getLongOrDefault("lastCreatedExchangeTimestamp", -1);
+                        stat.lastCompletedExchangeTimestamp = 
ls.getLongOrDefault("lastCompletedExchangeTimestamp", -1);
+                        stat.lastFailedExchangeTimestamp = 
ls.getLongOrDefault("lastFailedExchangeTimestamp", -1);
+                    }
                     route.nodes.add(node);
                 }
             }
diff --git 
a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramLayoutEngine.java
 
b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramLayoutEngine.java
index 34516df46da6..9ca815c03cca 100644
--- 
a/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramLayoutEngine.java
+++ 
b/components/camel-diagram/src/main/java/org/apache/camel/diagram/RouteDiagramLayoutEngine.java
@@ -127,16 +127,41 @@ public class RouteDiagramLayoutEngine {
         return nodeTextPadding;
     }
 
+    public static class RouteStatInfo extends StatInfo {
+        public String coverage;
+        public String load01;
+        public String load05;
+        public String load15;
+        public String exchangesThroughput;
+    }
+
+    public static class StatInfo {
+        public long idleSince;
+        public long exchangesTotal;
+        public long exchangesFailed;
+        public long exchangesInflight;
+        public long meanProcessingTime;
+        public long maxProcessingTime;
+        public long minProcessingTime;
+        public long lastProcessingTime;
+        public long deltaProcessingTime;
+        public long lastCreatedExchangeTimestamp;
+        public long lastCompletedExchangeTimestamp;
+        public long lastFailedExchangeTimestamp;
+    }
+
     public static class NodeInfo {
         public String type;
         public String code;
         public String description;
         public int level;
+        public StatInfo stat;
     }
 
     public static class RouteInfo {
         public String routeId;
         public String source;
+        public RouteStatInfo stat;
         public List<NodeInfo> nodes = new ArrayList<>();
     }
 
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
index 042dc628afcd..a3306453fad7 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/ProcessorDevConsole.java
@@ -306,7 +306,7 @@ public class ProcessorDevConsole extends AbstractDevConsole 
{
                 jo.put("uri", destination);
             }
 
-            final JsonObject stats = getStatsObject(mp);
+            final JsonObject stats = gatherProcessorStats(mp);
             jo.put("statistics", stats);
         }
     }
@@ -325,7 +325,7 @@ public class ProcessorDevConsole extends AbstractDevConsole 
{
         return null;
     }
 
-    private static JsonObject getStatsObject(ManagedProcessorMBean mp) {
+    public static JsonObject gatherProcessorStats(ManagedProcessorMBean mp) {
         JsonObject stats = new JsonObject();
         stats.put("idleSince", mp.getIdleSince());
         stats.put("exchangesTotal", mp.getExchangesTotal());
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 8ec83aecb347..898d930e8380 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
@@ -128,7 +128,7 @@ public class RouteDevConsole extends AbstractDevConsole {
                 }
             }
             sb.append(String.format("%n    Uptime: %s", mrb.getUptime()));
-            String coverage = calculateRouteCoverage(mrb, true);
+            String coverage = calculateRouteCoverage(getCamelContext(), mrb, 
true);
             if (coverage != null) {
                 sb.append(String.format("%n    Coverage: %s", coverage));
             }
@@ -259,46 +259,7 @@ public class RouteDevConsole extends AbstractDevConsole {
                 }
                 jo.put("lastError", eo);
             }
-            JsonObject stats = new JsonObject();
-            String coverage = calculateRouteCoverage(mrb, false);
-            if (coverage != null) {
-                stats.put("coverage", coverage);
-            }
-            String load1 = getLoad1(mrb);
-            String load5 = getLoad5(mrb);
-            String load15 = getLoad15(mrb);
-            if (!load1.isEmpty() || !load5.isEmpty() || !load15.isEmpty()) {
-                stats.put("load01", load1);
-                stats.put("load05", load5);
-                stats.put("load15", load15);
-            }
-            String thp = getThroughput(mrb);
-            if (!thp.isEmpty()) {
-                stats.put("exchangesThroughput", thp);
-            }
-            stats.put("idleSince", mrb.getIdleSince());
-            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());
-            if (mrb.getExchangesTotal() > 0) {
-                stats.put("lastProcessingTime", mrb.getLastProcessingTime());
-                stats.put("deltaProcessingTime", mrb.getDeltaProcessingTime());
-            }
-            Date last = mrb.getLastExchangeCreatedTimestamp();
-            if (last != null) {
-                stats.put("lastCreatedExchangeTimestamp", last.getTime());
-            }
-            last = mrb.getLastExchangeCompletedTimestamp();
-            if (last != null) {
-                stats.put("lastCompletedExchangeTimestamp", last.getTime());
-            }
-            last = mrb.getLastExchangeFailureTimestamp();
-            if (last != null) {
-                stats.put("lastFailedExchangeTimestamp", last.getTime());
-            }
+            JsonObject stats = gatherRouteStats(getCamelContext(), mrb);
             jo.put("statistics", stats);
             if (processors) {
                 JsonArray arr = new JsonArray();
@@ -374,36 +335,36 @@ public class RouteDevConsole extends AbstractDevConsole {
         return o1.getRouteId().compareToIgnoreCase(o2.getRouteId());
     }
 
-    private String getLoad1(ManagedRouteMBean mrb) {
+    private static String getLoad1(ManagedRouteMBean mrb) {
         String s = mrb.getLoad01();
         // lets use dot as separator
         s = s.replace(',', '.');
         return s;
     }
 
-    private String getLoad5(ManagedRouteMBean mrb) {
+    private static String getLoad5(ManagedRouteMBean mrb) {
         String s = mrb.getLoad05();
         // lets use dot as separator
         s = s.replace(',', '.');
         return s;
     }
 
-    private String getLoad15(ManagedRouteMBean mrb) {
+    private static String getLoad15(ManagedRouteMBean mrb) {
         String s = mrb.getLoad15();
         // lets use dot as separator
         s = s.replace(',', '.');
         return s;
     }
 
-    private String getThroughput(ManagedRouteMBean mrb) {
+    private static String getThroughput(ManagedRouteMBean mrb) {
         String s = mrb.getThroughput();
         // lets use dot as separator
         s = s.replace(',', '.');
         return s;
     }
 
-    private String calculateRouteCoverage(ManagedRouteMBean mrb, boolean 
percent) {
-        ManagedCamelContext mcc = 
getCamelContext().getCamelContextExtension().getContextPlugin(ManagedCamelContext.class);
+    private static String calculateRouteCoverage(CamelContext camelContext, 
ManagedRouteMBean mrb, boolean percent) {
+        ManagedCamelContext mcc = 
camelContext.getCamelContextExtension().getContextPlugin(ManagedCamelContext.class);
 
         Collection<String> ids;
         try {
@@ -493,4 +454,48 @@ public class RouteDevConsole extends AbstractDevConsole {
         }
     }
 
+    public static JsonObject gatherRouteStats(CamelContext camelContext, 
ManagedRouteMBean mrb) {
+        JsonObject stats = new JsonObject();
+        String coverage = calculateRouteCoverage(camelContext, mrb, false);
+        if (coverage != null) {
+            stats.put("coverage", coverage);
+        }
+        String load1 = getLoad1(mrb);
+        String load5 = getLoad5(mrb);
+        String load15 = getLoad15(mrb);
+        if (!load1.isEmpty() || !load5.isEmpty() || !load15.isEmpty()) {
+            stats.put("load01", load1);
+            stats.put("load05", load5);
+            stats.put("load15", load15);
+        }
+        String thp = getThroughput(mrb);
+        if (!thp.isEmpty()) {
+            stats.put("exchangesThroughput", thp);
+        }
+        stats.put("idleSince", mrb.getIdleSince());
+        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());
+        if (mrb.getExchangesTotal() > 0) {
+            stats.put("lastProcessingTime", mrb.getLastProcessingTime());
+            stats.put("deltaProcessingTime", mrb.getDeltaProcessingTime());
+        }
+        Date last = mrb.getLastExchangeCreatedTimestamp();
+        if (last != null) {
+            stats.put("lastCreatedExchangeTimestamp", last.getTime());
+        }
+        last = mrb.getLastExchangeCompletedTimestamp();
+        if (last != null) {
+            stats.put("lastCompletedExchangeTimestamp", last.getTime());
+        }
+        last = mrb.getLastExchangeFailureTimestamp();
+        if (last != null) {
+            stats.put("lastFailedExchangeTimestamp", last.getTime());
+        }
+        return stats;
+    }
+
 }
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteStructureDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteStructureDevConsole.java
index a4cf2c8f2549..a55dd747b06f 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteStructureDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RouteStructureDevConsole.java
@@ -20,8 +20,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.NamedRoute;
+import org.apache.camel.api.management.ManagedCamelContext;
+import org.apache.camel.api.management.mbean.ManagedProcessorMBean;
+import org.apache.camel.api.management.mbean.ManagedRouteMBean;
 import org.apache.camel.spi.ModelDumpLine;
 import org.apache.camel.spi.ModelToStructureDumper;
 import org.apache.camel.spi.annotations.DevConsole;
@@ -55,6 +59,11 @@ public class RouteStructureDevConsole extends 
AbstractDevConsole {
      */
     public static final String BRIEF = "brief";
 
+    /**
+     * Whether to include metrics such as number of messages processed (from 
JMX)
+     */
+    public static final String METRIC = "metric";
+
     public RouteStructureDevConsole() {
         super("camel", "route-structure", "Route Structure", "Dump route 
structure");
     }
@@ -100,10 +109,12 @@ public class RouteStructureDevConsole extends 
AbstractDevConsole {
     @Override
     protected JsonObject doCallJson(Map<String, Object> options) {
         final String brief = (String) options.getOrDefault(BRIEF, "false");
+        final String metric = (String) options.getOrDefault(METRIC, "false");
 
         final JsonObject root = new JsonObject();
         final JsonArray list = new JsonArray();
 
+        final boolean stats = "true".equalsIgnoreCase(metric);
         Function<NamedRoute, Object> task = def -> {
             JsonObject jo = new JsonObject();
             list.add(jo);
@@ -125,7 +136,7 @@ public class RouteStructureDevConsole extends 
AbstractDevConsole {
                 ModelToStructureDumper dumper = 
PluginHelper.getModelToStructureDumper(getCamelContext());
                 List<ModelDumpLine> lines
                         = dumper.dumpStructure(getCamelContext(), 
def.getRouteId(), "true".equalsIgnoreCase(brief));
-                JsonArray code = dumpAsJSon(lines);
+                JsonArray code = dumpAsJSon(getCamelContext(), lines, stats);
                 jo.put("code", code);
             } catch (Exception e) {
                 // ignore
@@ -171,7 +182,9 @@ public class RouteStructureDevConsole extends 
AbstractDevConsole {
                 || PatternHelper.matchPattern(onlyName, filter);
     }
 
-    private static JsonArray dumpAsJSon(List<ModelDumpLine> lines) {
+    private JsonArray dumpAsJSon(CamelContext camelContext, 
List<ModelDumpLine> lines, boolean metric) {
+        ManagedCamelContext mcc = 
getCamelContext().getCamelContextExtension().getContextPlugin(ManagedCamelContext.class);
+
         JsonArray code = new JsonArray();
         int counter = 0;
         for (var line : lines) {
@@ -189,6 +202,30 @@ public class RouteStructureDevConsole extends 
AbstractDevConsole {
                 c.put("description", line.description());
             }
             c.put("code", Jsoner.escape(line.code()));
+
+            if (metric && mcc != null) {
+                if (counter <= 2) {
+                    ManagedRouteMBean mrb = mcc.getManagedRoute(line.id());
+                    if (mrb != null) {
+                        JsonObject stats = 
RouteDevConsole.gatherRouteStats(camelContext, mrb);
+                        if (counter == 2) {
+                            // from is route stats minus a few values
+                            stats.remove("coverage");
+                            stats.remove("load01");
+                            stats.remove("load05");
+                            stats.remove("load15");
+                            stats.remove("exchangesThroughput");
+                        }
+                        c.put("statistics", stats);
+                    }
+                } else {
+                    ManagedProcessorMBean mp = 
mcc.getManagedProcessor(line.id());
+                    if (mp != null) {
+                        JsonObject stats = 
ProcessorDevConsole.gatherProcessorStats(mp);
+                        c.put("statistics", stats);
+                    }
+                }
+            }
             code.add(c);
         }
         return code;
diff --git 
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc
 
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc
index 9f854b762ff9..4a900c5a1a56 100644
--- 
a/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc
+++ 
b/docs/user-manual/modules/ROOT/pages/jbang-commands/camel-jbang-cmd-route-diagram.adoc
@@ -23,6 +23,7 @@ camel cmd route-diagram [options]
 | `--filter` | Filter route by filename or route id |  | String
 | `--font-size` | Font size in logical pixels for node text | 12 | int
 | `--ignore-loading-error` | Whether to ignore route loading and compilation 
errors (use this with care!) | false | boolean
+| `--metric` | Whether to include live metrics (only possible for running 
Camel application) | false | boolean
 | `--node-label` | What text to display in diagram nodes: code, description, 
or both (default) | both | String
 | `--output` | Save diagram to a PNG file instead of displaying in terminal |  
| String
 | `--theme,--colors` | Color theme preset (dark, light, transparent, text) or 
custom colors (e.g. bg=#1e1e1e:from=#2e7d32:to=#1565c0). Values can be #hex or 
ANSI color names (e.g. from=seagreen:to=steelblue). Use bg= for transparent. 
Can also be set via DIAGRAM_COLORS env var. | dark | String
diff --git 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
index eaf6e37df925..aa98e238b689 100644
--- 
a/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
+++ 
b/dsl/camel-cli-connector/src/main/java/org/apache/camel/cli/connector/LocalCliConnector.java
@@ -683,9 +683,10 @@ public class LocalCliConnector extends ServiceSupport 
implements CliConnector, C
         if (dc != null) {
             String filter = root.getString("filter");
             String brief = root.getString("brief");
+            String metric = root.getString("metric");
             JsonObject json
                     = (JsonObject) dc.call(DevConsole.MediaType.JSON,
-                            Map.of("filter", filter, "brief", brief));
+                            Map.of("filter", filter, "brief", brief, "metric", 
metric));
             LOG.trace("Updating output file: {}", outputFile);
             IOHelper.writeText(json.toJson(), outputFile);
         } else {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
 
b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
index a4040d23eb5e..0553d5478fa5 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/generated/resources/META-INF/camel-jbang-commands-metadata.json
@@ -2,7 +2,7 @@
   "commands": [
     { "name": "bind", "fullName": "bind", "description": "DEPRECATED: Bind 
source and sink Kamelets as a new Camel integration", "deprecated": true, 
"sourceClass": "org.apache.camel.dsl.jbang.core.commands.bind.Bind", "options": 
[ { "names": "--error-handler", "description": "Add error handler 
(none|log|sink:<endpoint>). Sink endpoints are expected in the format 
[[apigroup\/]version:]kind:[namespace\/]name, plain Camel URIs or Kamelet 
name.", "javaType": "java.lang.String", "type": "stri [...]
     { "name": "catalog", "fullName": "catalog", "description": "List artifacts 
from Camel Catalog", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.catalog.CatalogCommand", "options": [ 
{ "names": "-h,--help", "description": "Display the help and sub-commands", 
"javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": 
"component", "fullName": "catalog component", "description": "List components 
from the Camel Catalog", "sourceClass": "org.apache.camel.dsl.jbang.co [...]
-    { "name": "cmd", "fullName": "cmd", "description": "Performs commands in 
the running Camel integrations, such as start\/stop route, or change logging 
levels.", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.action.CamelAction", "options": [ { 
"names": "-h,--help", "description": "Display the help and sub-commands", 
"javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": 
"browse", "fullName": "cmd browse", "description": "Browse pending messages on 
endpoints [...]
+    { "name": "cmd", "fullName": "cmd", "description": "Performs commands in 
the running Camel integrations, such as start\/stop route, or change logging 
levels.", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.action.CamelAction", "options": [ { 
"names": "-h,--help", "description": "Display the help and sub-commands", 
"javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": 
"browse", "fullName": "cmd browse", "description": "Browse pending messages on 
endpoints [...]
     { "name": "completion", "fullName": "completion", "description": "Generate 
completion script for bash\/zsh", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.Complete", "options": [ { "names": 
"-h,--help", "description": "Display the help and sub-commands", "javaType": 
"boolean", "type": "boolean" } ] },
     { "name": "config", "fullName": "config", "description": "Get and set user 
configuration values", "sourceClass": 
"org.apache.camel.dsl.jbang.core.commands.config.ConfigCommand", "options": [ { 
"names": "-h,--help", "description": "Display the help and sub-commands", 
"javaType": "boolean", "type": "boolean" } ], "subcommands": [ { "name": "get", 
"fullName": "config get", "description": "Display user configuration value", 
"sourceClass": "org.apache.camel.dsl.jbang.core.commands.config. [...]
     { "name": "debug", "fullName": "debug", "description": "Debug local Camel 
integration", "sourceClass": "org.apache.camel.dsl.jbang.core.commands.Debug", 
"options": [ { "names": "--ago", "description": "Use ago instead of yyyy-MM-dd 
HH:mm:ss in timestamp.", "javaType": "boolean", "type": "boolean" }, { "names": 
"--background", "description": "Run in the background", "defaultValue": 
"false", "javaType": "boolean", "type": "boolean" }, { "names": 
"--background-wait", "description": "To  [...]
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
index 191551a8a5f2..225861b01897 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelRouteDiagramAction.java
@@ -89,6 +89,10 @@ public class CamelRouteDiagramAction extends 
ActionBaseCommand {
                         defaultValue = "both")
     String nodeLabel;
 
+    @CommandLine.Option(names = { "--metric" }, defaultValue = "false",
+                        description = "Whether to include live metrics (only 
possible for running Camel application)")
+    boolean metric;
+
     @CommandLine.Option(names = { "--ignore-loading-error" }, defaultValue = 
"false",
                         description = "Whether to ignore route loading and 
compilation errors (use this with care!)")
     boolean ignoreLoadingError;
@@ -270,6 +274,7 @@ public class CamelRouteDiagramAction extends 
ActionBaseCommand {
         root.put("action", "route-structure");
         root.put("filter", "*");
         root.put("brief", false);
+        root.put("metric", metric);
         Path file = getActionFile(Long.toString(pid));
         try {
             Files.writeString(file, root.toJson());

Reply via email to