You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2022/12/06 12:44:00 UTC

[camel] branch main updated (a0ca48859d9 -> a2ebc91b76a)

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


    from a0ca48859d9 Introduce MiniDFSCluster to the HDFS test-infra
     new 14b7eb4441b CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
     new 93e7aad17ee CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
     new 8fe67d3c952 CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
     new e6cc0258598 CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
     new a2ebc91b76a CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure

The 5 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../dsl/jbang/core/commands/CamelJBangMain.java    |  2 +
 .../process/{ListProcess.java => CamelCount.java}  | 87 ++++++++++++++--------
 2 files changed, 60 insertions(+), 29 deletions(-)
 copy dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/{ListProcess.java => CamelCount.java} (59%)


[camel] 04/05: CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit e6cc025859839f01e173fe800786e3e3ac7294c9
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Tue Dec 6 11:30:41 2022 +0100

    CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../jbang/core/commands/process/CamelCount.java    | 29 +++++++---------------
 1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
index d941e2fde1f..8152359ef8d 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
@@ -33,7 +33,7 @@ import picocli.CommandLine;
 import picocli.CommandLine.Command;
 
 @Command(name = "count",
-         description = "Get total and failed exchanges for a running integration")
+         description = "Get total and failed exchanges for running integrations")
 public class CamelCount extends ProcessBaseCommand {
 
     @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1")
@@ -44,11 +44,11 @@ public class CamelCount extends ProcessBaseCommand {
     String sort;
 
     @CommandLine.Option(names = { "--total" },
-            description = "Get the total exchanges from a running integration")
+                        description = "Get the total exchanges from a running integration")
     boolean total;
 
     @CommandLine.Option(names = { "--fail" },
-            description = "Get the failed exchanges from a running integration")
+                        description = "Get the failed exchanges from a running integration")
     boolean fail;
 
     public CamelCount(CamelJBangMain main) {
@@ -93,7 +93,8 @@ public class CamelCount extends ProcessBaseCommand {
             if (!rows.isEmpty()) {
                 System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
                         new Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                        new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT)
+                        new Column().header("NAME").dataAlign(HorizontalAlign.LEFT)
+                                .maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT)
                                 .with(r -> r.name),
                         new Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.age),
                         new Column().header("TOTAL").with(r -> r.total),
@@ -104,8 +105,7 @@ public class CamelCount extends ProcessBaseCommand {
             if (total || fail) {
                 if (!rows.isEmpty()) {
                     int index = 0;
-                    for (Row r: rows
-                         ) {
+                    for (Row r : rows) {
                         if (rows.size() > 1) {
                             builder.append(r.name).append(",");
                         }
@@ -113,10 +113,11 @@ public class CamelCount extends ProcessBaseCommand {
                             builder.append(r.total);
                         }
                         if (fail) {
-                            if (total) builder.append(",");
+                            if (total)
+                                builder.append(",");
                             builder.append(r.failed);
                         }
-                        if (index < rows.size()-1) {
+                        if (index < rows.size() - 1) {
                             builder.append(System.getProperty("line.separator"));
                         }
                         index++;
@@ -129,18 +130,6 @@ public class CamelCount extends ProcessBaseCommand {
         return 0;
     }
 
-    private String extractPlatform(ProcessHandle ph, JsonObject runtime) {
-        String answer = runtime != null ? runtime.getString("platform") : null;
-        if ("Camel".equals(answer)) {
-            // generic camel, we need to check if we run in JBang
-            String cl = ph.info().commandLine().orElse("");
-            if (cl.contains("main.CamelJBang run")) {
-                answer = "JBang";
-            }
-        }
-        return answer;
-    }
-
     protected int sortRow(Row o1, Row o2) {
         String s = sort;
         int negate = 1;


[camel] 05/05: CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit a2ebc91b76a575a6fa6ee61b5c3dafba1bdeee83
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Tue Dec 6 12:53:58 2022 +0100

    CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../dsl/jbang/core/commands/CamelJBangMain.java    | 23 +++++++++++++++++++++-
 .../jbang/core/commands/process/CamelCount.java    |  3 ++-
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index cb74f20ccca..c9db98d9bf1 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -38,7 +38,28 @@ import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDoc;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogKamelet;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogLanguage;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogOther;
-import org.apache.camel.dsl.jbang.core.commands.process.*;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelContextStatus;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelContextTop;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelCount;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelEndpointStatus;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorStatus;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorTop;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelRouteStatus;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelRouteTop;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelStatus;
+import org.apache.camel.dsl.jbang.core.commands.process.CamelTop;
+import org.apache.camel.dsl.jbang.core.commands.process.Hawtio;
+import org.apache.camel.dsl.jbang.core.commands.process.Jolokia;
+import org.apache.camel.dsl.jbang.core.commands.process.ListBlocked;
+import org.apache.camel.dsl.jbang.core.commands.process.ListCircuitBreaker;
+import org.apache.camel.dsl.jbang.core.commands.process.ListEvent;
+import org.apache.camel.dsl.jbang.core.commands.process.ListHealth;
+import org.apache.camel.dsl.jbang.core.commands.process.ListInflight;
+import org.apache.camel.dsl.jbang.core.commands.process.ListMetric;
+import org.apache.camel.dsl.jbang.core.commands.process.ListProcess;
+import org.apache.camel.dsl.jbang.core.commands.process.ListService;
+import org.apache.camel.dsl.jbang.core.commands.process.ListVault;
+import org.apache.camel.dsl.jbang.core.commands.process.StopProcess;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
index 8152359ef8d..eae51dfe99c 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
@@ -113,8 +113,9 @@ public class CamelCount extends ProcessBaseCommand {
                             builder.append(r.total);
                         }
                         if (fail) {
-                            if (total)
+                            if (total) {
                                 builder.append(",");
+                            }
                             builder.append(r.failed);
                         }
                         if (index < rows.size() - 1) {


[camel] 01/05: CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 14b7eb4441bb1a55f5c61c0f609fe7c00714c24f
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Dec 5 14:08:49 2022 +0100

    CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../dsl/jbang/core/commands/CamelJBangMain.java    |  23 +---
 .../jbang/core/commands/process/CamelCount.java    | 138 +++++++++++++++++++++
 2 files changed, 140 insertions(+), 21 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
index 00d7b53de56..cb74f20ccca 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMain.java
@@ -38,27 +38,7 @@ import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogDoc;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogKamelet;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogLanguage;
 import org.apache.camel.dsl.jbang.core.commands.catalog.CatalogOther;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelContextStatus;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelContextTop;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelEndpointStatus;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorStatus;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelProcessorTop;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelRouteStatus;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelRouteTop;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelStatus;
-import org.apache.camel.dsl.jbang.core.commands.process.CamelTop;
-import org.apache.camel.dsl.jbang.core.commands.process.Hawtio;
-import org.apache.camel.dsl.jbang.core.commands.process.Jolokia;
-import org.apache.camel.dsl.jbang.core.commands.process.ListBlocked;
-import org.apache.camel.dsl.jbang.core.commands.process.ListCircuitBreaker;
-import org.apache.camel.dsl.jbang.core.commands.process.ListEvent;
-import org.apache.camel.dsl.jbang.core.commands.process.ListHealth;
-import org.apache.camel.dsl.jbang.core.commands.process.ListInflight;
-import org.apache.camel.dsl.jbang.core.commands.process.ListMetric;
-import org.apache.camel.dsl.jbang.core.commands.process.ListProcess;
-import org.apache.camel.dsl.jbang.core.commands.process.ListService;
-import org.apache.camel.dsl.jbang.core.commands.process.ListVault;
-import org.apache.camel.dsl.jbang.core.commands.process.StopProcess;
+import org.apache.camel.dsl.jbang.core.commands.process.*;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 
@@ -88,6 +68,7 @@ public class CamelJBangMain implements Callable<Integer> {
                         .addSubcommand("service", new CommandLine(new ListService(main)))
                         .addSubcommand("source", new CommandLine(new CamelSourceAction(main)))
                         .addSubcommand("vault", new CommandLine(new ListVault(main))))
+                .addSubcommand("count", new CommandLine(new CamelCount(main)))
                 .addSubcommand("top", new CommandLine(new CamelTop(main))
                         .addSubcommand("context", new CommandLine(new CamelContextTop(main)))
                         .addSubcommand("route", new CommandLine(new CamelRouteTop(main)))
diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
new file mode 100644
index 00000000000..86c20f0f788
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
@@ -0,0 +1,138 @@
+/*
+ * 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.dsl.jbang.core.commands.process;
+
+import com.github.freva.asciitable.AsciiTable;
+import com.github.freva.asciitable.Column;
+import com.github.freva.asciitable.HorizontalAlign;
+import com.github.freva.asciitable.OverflowBehaviour;
+import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
+import org.apache.camel.util.TimeUtils;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import picocli.CommandLine;
+import picocli.CommandLine.Command;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Command(name = "count",
+         description = "Get total and failed exchanges for a running integration")
+public class CamelCount extends ProcessBaseCommand {
+
+    @CommandLine.Parameters(description = "Name or pid of running Camel integration", arity = "0..1")
+    String name = "*";
+
+    @CommandLine.Option(names = { "--sort" },
+                        description = "Sort by pid, name or age", defaultValue = "pid")
+    String sort;
+
+    public CamelCount(CamelJBangMain main) {
+        super(main);
+    }
+
+    @Override
+    public Integer call() throws Exception {
+        List<Row> rows = new ArrayList<>();
+
+        List<Long> pids = findPids(name);
+        ProcessHandle.allProcesses()
+                .filter(ph -> pids.contains(ph.pid()))
+                .forEach(ph -> {
+                    JsonObject root = loadStatus(ph.pid());
+                    // there must be a status file for the running Camel integration
+                    if (root != null) {
+                        Row row = new Row();
+                        JsonObject context = (JsonObject) root.get("context");
+                        if (context == null) {
+                            return;
+                        }
+                        row.name = context.getString("name");
+                        if ("CamelJBang".equals(row.name)) {
+                            row.name = ProcessHelper.extractName(root, ph);
+                        }
+                        row.pid = "" + ph.pid();
+                        row.age = TimeUtils.printSince(extractSince(ph));
+                        Map<String, ?> stats = context.getMap("statistics");
+                        if (stats != null) {
+                            row.total = stats.get("exchangesTotal").toString();
+                            row.failed = stats.get("exchangesFailed").toString();
+                        }
+                        rows.add(row);
+                    }
+                });
+
+        // sort rows
+        rows.sort(this::sortRow);
+
+        if (!rows.isEmpty()) {
+            System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
+                    new Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
+                    new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT)
+                            .with(r -> r.name),
+                    new Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.age),
+                    new Column().header("TOTAL").with(r -> r.total),
+                    new Column().header("FAIL").with(r -> r.failed))));
+        }
+
+        return 0;
+    }
+
+    private String extractPlatform(ProcessHandle ph, JsonObject runtime) {
+        String answer = runtime != null ? runtime.getString("platform") : null;
+        if ("Camel".equals(answer)) {
+            // generic camel, we need to check if we run in JBang
+            String cl = ph.info().commandLine().orElse("");
+            if (cl.contains("main.CamelJBang run")) {
+                answer = "JBang";
+            }
+        }
+        return answer;
+    }
+
+    protected int sortRow(Row o1, Row o2) {
+        String s = sort;
+        int negate = 1;
+        if (s.startsWith("-")) {
+            s = s.substring(1);
+            negate = -1;
+        }
+        switch (s) {
+            case "pid":
+                return Long.compare(Long.parseLong(o1.pid), Long.parseLong(o2.pid)) * negate;
+            case "name":
+                return o1.name.compareToIgnoreCase(o2.name) * negate;
+            case "age":
+                return Long.compare(o1.uptime, o2.uptime) * negate;
+            default:
+                return 0;
+        }
+    }
+
+    private static class Row {
+        String pid;
+        String name;
+        String age;
+        long uptime;
+        String total;
+        String failed;
+    }
+
+}


[camel] 02/05: CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 93e7aad17ee4eda141cf124e96b2cc452519d37a
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Mon Dec 5 14:09:54 2022 +0100

    CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../camel/dsl/jbang/core/commands/process/CamelCount.java     | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
index 86c20f0f788..54066cb5931 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
@@ -16,6 +16,11 @@
  */
 package org.apache.camel.dsl.jbang.core.commands.process;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
 import com.github.freva.asciitable.AsciiTable;
 import com.github.freva.asciitable.Column;
 import com.github.freva.asciitable.HorizontalAlign;
@@ -23,16 +28,10 @@ import com.github.freva.asciitable.OverflowBehaviour;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.common.ProcessHelper;
 import org.apache.camel.util.TimeUtils;
-import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
 @Command(name = "count",
          description = "Get total and failed exchanges for a running integration")
 public class CamelCount extends ProcessBaseCommand {


[camel] 03/05: CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 8fe67d3c952526802a0029a89c687f0fed90e366
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Tue Dec 6 11:29:16 2022 +0100

    CAMEL-18743 - camel-jbang - Command to see only if everything is okay or there has been a failure
    
    Signed-off-by: Andrea Cosentino <an...@gmail.com>
---
 .../jbang/core/commands/process/CamelCount.java    | 51 ++++++++++++++++++----
 1 file changed, 43 insertions(+), 8 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
index 54066cb5931..d941e2fde1f 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/process/CamelCount.java
@@ -43,6 +43,14 @@ public class CamelCount extends ProcessBaseCommand {
                         description = "Sort by pid, name or age", defaultValue = "pid")
     String sort;
 
+    @CommandLine.Option(names = { "--total" },
+            description = "Get the total exchanges from a running integration")
+    boolean total;
+
+    @CommandLine.Option(names = { "--fail" },
+            description = "Get the failed exchanges from a running integration")
+    boolean fail;
+
     public CamelCount(CamelJBangMain main) {
         super(main);
     }
@@ -81,14 +89,41 @@ public class CamelCount extends ProcessBaseCommand {
         // sort rows
         rows.sort(this::sortRow);
 
-        if (!rows.isEmpty()) {
-            System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
-                    new Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
-                    new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT)
-                            .with(r -> r.name),
-                    new Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.age),
-                    new Column().header("TOTAL").with(r -> r.total),
-                    new Column().header("FAIL").with(r -> r.failed))));
+        if (!total && !fail) {
+            if (!rows.isEmpty()) {
+                System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
+                        new Column().header("PID").headerAlign(HorizontalAlign.CENTER).with(r -> r.pid),
+                        new Column().header("NAME").dataAlign(HorizontalAlign.LEFT).maxWidth(30, OverflowBehaviour.ELLIPSIS_RIGHT)
+                                .with(r -> r.name),
+                        new Column().header("AGE").headerAlign(HorizontalAlign.CENTER).with(r -> r.age),
+                        new Column().header("TOTAL").with(r -> r.total),
+                        new Column().header("FAIL").with(r -> r.failed))));
+            }
+        } else {
+            StringBuilder builder = new StringBuilder();
+            if (total || fail) {
+                if (!rows.isEmpty()) {
+                    int index = 0;
+                    for (Row r: rows
+                         ) {
+                        if (rows.size() > 1) {
+                            builder.append(r.name).append(",");
+                        }
+                        if (total) {
+                            builder.append(r.total);
+                        }
+                        if (fail) {
+                            if (total) builder.append(",");
+                            builder.append(r.failed);
+                        }
+                        if (index < rows.size()-1) {
+                            builder.append(System.getProperty("line.separator"));
+                        }
+                        index++;
+                    }
+                }
+            }
+            System.out.println(builder.toString());
         }
 
         return 0;