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

ddanielr pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/accumulo.git


The following commit(s) were added to refs/heads/2.1 by this push:
     new ed464ca4a0 new options display option for ServiceStatusCmd (#5630)
ed464ca4a0 is described below

commit ed464ca4a009e727a1abbef015cda8d78ca292b5
Author: Arbaaz Khan <[email protected]>
AuthorDate: Thu Jul 24 13:44:19 2025 -0400

    new options display option for ServiceStatusCmd (#5630)
    
    * new options display option for ServiceStatusCmd
    * Corrected intended behavior
    * removed unused code
    * fixed csv output
---
 .../org/apache/accumulo/server/util/Admin.java     | 16 +++--
 .../accumulo/server/util/ServiceStatusCmd.java     |  9 ++-
 .../util/serviceStatus/ServiceStatusReport.java    | 73 ++++++++++++++++------
 .../server/util/serviceStatus/StatusSummary.java   | 22 +++++++
 .../accumulo/server/util/ServiceStatusCmdTest.java |  3 +-
 5 files changed, 96 insertions(+), 27 deletions(-)

diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java 
b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
index e2ec6f7fa1..69c4ca4a7f 100644
--- a/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
+++ b/server/base/src/main/java/org/apache/accumulo/server/util/Admin.java
@@ -263,11 +263,16 @@ public class Admin implements KeywordExecutable {
 
   @Parameters(commandDescription = "show service status")
   public static class ServiceStatusCmdOpts extends SubCommandOpts {
-    @Parameter(names = "--json", description = "provide output in json format 
(--noHosts ignored)")
+    @Parameter(names = "--json",
+        description = "provide output in json format (--showHosts ignored)")
     boolean json = false;
-    @Parameter(names = "--noHosts",
-        description = "provide a summary of service counts without host 
details")
-    boolean noHosts = false;
+    @Parameter(names = "--showHosts",
+        description = "provide a summary of service counts with host details")
+    boolean showHosts = false;
+
+    @Parameter(names = "--csv",
+        description = "provide output in csv format (--json and --noHost 
ignored)")
+    boolean csv = false;
   }
 
   public static void main(String[] args) {
@@ -427,7 +432,8 @@ public class Admin implements KeywordExecutable {
         executeFateOpsCommand(context, fateOpsCommand);
       } else if (cl.getParsedCommand().equals("serviceStatus")) {
         ServiceStatusCmd ssc = new ServiceStatusCmd();
-        ssc.execute(context, serviceStatusCommandOpts.json, 
serviceStatusCommandOpts.noHosts);
+        ssc.execute(context, serviceStatusCommandOpts.json, 
serviceStatusCommandOpts.showHosts,
+            serviceStatusCommandOpts.csv);
       } else if (cl.getParsedCommand().equals("stopManager")
           || cl.getParsedCommand().equals("stopAll")) {
         boolean everything = cl.getParsedCommand().equals("stopAll");
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
index 9325231038..dc8a47715b 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/ServiceStatusCmd.java
@@ -54,7 +54,8 @@ public class ServiceStatusCmd {
    * Read the service statuses from ZooKeeper, build the status report and 
then output the report to
    * stdout.
    */
-  public void execute(final ServerContext context, final boolean json, final 
boolean noHosts) {
+  public void execute(final ServerContext context, final boolean json, final 
boolean showHosts,
+      final boolean csv) {
 
     ZooReader zooReader = context.getZooReader();
 
@@ -72,9 +73,11 @@ public class ServiceStatusCmd {
     services.put(ServiceStatusReport.ReportKey.COMPACTOR, 
getCompactorStatus(zooReader, zooRoot));
     services.put(ServiceStatusReport.ReportKey.GC, getGcStatus(zooReader, 
zooRoot));
 
-    ServiceStatusReport report = new ServiceStatusReport(services, noHosts);
+    ServiceStatusReport report = new ServiceStatusReport(services, showHosts);
 
-    if (json) {
+    if (csv) {
+      System.out.println(report.toCsv());
+    } else if (json) {
       System.out.println(report.toJson());
     } else {
       StringBuilder sb = new StringBuilder(8192);
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/ServiceStatusReport.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/ServiceStatusReport.java
index 0951831028..7ae71a0cbb 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/ServiceStatusReport.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/ServiceStatusReport.java
@@ -22,6 +22,9 @@ import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,14 +48,15 @@ public class ServiceStatusReport {
 
   private final String reportTime;
   private final int zkReadErrors;
-  private final boolean noHosts;
+  private final boolean showHosts;
   private final Map<ReportKey,StatusSummary> summaries;
 
-  public ServiceStatusReport(final Map<ReportKey,StatusSummary> summaries, 
final boolean noHosts) {
+  public ServiceStatusReport(final Map<ReportKey,StatusSummary> summaries,
+      final boolean showHosts) {
     reportTime = rptTimeFmt.format(ZonedDateTime.now(ZoneId.of("UTC")));
     zkReadErrors = 
summaries.values().stream().map(StatusSummary::getErrorCount)
         .reduce(Integer::sum).orElse(0);
-    this.noHosts = noHosts;
+    this.showHosts = showHosts;
     this.summaries = summaries;
   }
 
@@ -69,13 +73,45 @@ public class ServiceStatusReport {
   }
 
   public String toJson() {
-    return gson.toJson(this, ServiceStatusReport.class);
+    // return gson.toJson(this, ServiceStatusReport.class);
+
+    Map<ReportKey,StatusSummary> noHostSummaries = 
summaries.entrySet().stream().collect(Collectors
+        .toMap(Map.Entry::getKey, e -> e.getValue().withoutHosts(), (a, b) -> 
b, TreeMap::new));
+    ServiceStatusReport noHostReport = new 
ServiceStatusReport(noHostSummaries, false);
+    return gson.toJson(noHostReport, ServiceStatusReport.class);
   }
 
   public static ServiceStatusReport fromJson(final String json) {
     return gson.fromJson(json, ServiceStatusReport.class);
   }
 
+  public String toCsv() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("Service,Resource Group,Host Count,Hosts,Error Count\n");
+
+    for (Map.Entry<ReportKey,StatusSummary> entry : summaries.entrySet()) {
+      ReportKey reportKey = entry.getKey();
+      StatusSummary summary = entry.getValue();
+
+      if (summary == null || summary.getServiceByGroups() == null) {
+        continue;
+      }
+
+      Map<String,Set<String>> groupMap = summary.getServiceByGroups();
+      int errorCount = summary.getErrorCount();
+
+      for (Map.Entry<String,Set<String>> groupEntry : groupMap.entrySet()) {
+        String group = groupEntry.getKey();
+        Set<String> hosts = groupEntry.getValue();
+        String hostList = String.join(";", hosts);
+        
sb.append(reportKey.name()).append(",").append(group).append(",").append(hosts.size())
+            
.append(",").append(hostList).append(",").append(errorCount).append("\n");
+      }
+    }
+
+    return sb.toString();
+  }
+
   public String report(final StringBuilder sb) {
     sb.append("Report time: 
").append(rptTimeFmt.format(ZonedDateTime.now(ZoneId.of("UTC"))))
         .append("\n");
@@ -83,13 +119,13 @@ public class ServiceStatusReport {
         .reduce(Integer::sum).orElse(0);
     sb.append("ZooKeeper read errors: ").append(zkErrors).append("\n");
 
-    fmtServiceStatus(sb, ReportKey.MANAGER, summaries.get(ReportKey.MANAGER), 
noHosts);
-    fmtServiceStatus(sb, ReportKey.MONITOR, summaries.get(ReportKey.MONITOR), 
noHosts);
-    fmtServiceStatus(sb, ReportKey.GC, summaries.get(ReportKey.GC), noHosts);
-    fmtServiceStatus(sb, ReportKey.T_SERVER, 
summaries.get(ReportKey.T_SERVER), noHosts);
-    fmtResourceGroups(sb, ReportKey.S_SERVER, 
summaries.get(ReportKey.S_SERVER), noHosts);
-    fmtServiceStatus(sb, ReportKey.COORDINATOR, 
summaries.get(ReportKey.COORDINATOR), noHosts);
-    fmtResourceGroups(sb, ReportKey.COMPACTOR, 
summaries.get(ReportKey.COMPACTOR), noHosts);
+    fmtServiceStatus(sb, ReportKey.MANAGER, summaries.get(ReportKey.MANAGER), 
showHosts);
+    fmtServiceStatus(sb, ReportKey.MONITOR, summaries.get(ReportKey.MONITOR), 
showHosts);
+    fmtServiceStatus(sb, ReportKey.GC, summaries.get(ReportKey.GC), showHosts);
+    fmtServiceStatus(sb, ReportKey.T_SERVER, 
summaries.get(ReportKey.T_SERVER), showHosts);
+    fmtResourceGroups(sb, ReportKey.S_SERVER, 
summaries.get(ReportKey.S_SERVER), showHosts);
+    fmtServiceStatus(sb, ReportKey.COORDINATOR, 
summaries.get(ReportKey.COORDINATOR), showHosts);
+    fmtResourceGroups(sb, ReportKey.COMPACTOR, 
summaries.get(ReportKey.COMPACTOR), showHosts);
 
     sb.append("\n");
     LOG.trace("fmtStatus - with hosts: {}", summaries);
@@ -97,7 +133,7 @@ public class ServiceStatusReport {
   }
 
   private void fmtServiceStatus(final StringBuilder sb, final ReportKey 
displayNames,
-      final StatusSummary summary, boolean noHosts) {
+      final StatusSummary summary, boolean showHosts) {
     if (summary == null) {
       sb.append(displayNames).append(": unavailable").append("\n");
       return;
@@ -105,10 +141,11 @@ public class ServiceStatusReport {
 
     fmtCounts(sb, summary);
 
-    // skip host info if requested
-    if (noHosts) {
+    // skip host info if NOT showing hosts
+    if (!showHosts) {
       return;
     }
+
     if (summary.getServiceCount() > 0) {
       var hosts = summary.getServiceByGroups();
       hosts.values().forEach(s -> s.forEach(h -> 
sb.append(I2).append(h).append("\n")));
@@ -125,7 +162,7 @@ public class ServiceStatusReport {
   }
 
   private void fmtResourceGroups(final StringBuilder sb, final ReportKey 
reportKey,
-      final StatusSummary summary, boolean noHosts) {
+      final StatusSummary summary, boolean showHosts) {
     if (summary == null) {
       sb.append(reportKey).append(": unavailable").append("\n");
       return;
@@ -133,8 +170,8 @@ public class ServiceStatusReport {
 
     fmtCounts(sb, summary);
 
-    // skip host info if requested
-    if (noHosts) {
+    // skip host info if NOT showing hosts
+    if (!showHosts) {
       return;
     }
 
@@ -158,7 +195,7 @@ public class ServiceStatusReport {
   @Override
   public String toString() {
     return "ServiceStatusReport{reportTime='" + reportTime + '\'' + ", 
zkReadErrors=" + zkReadErrors
-        + ", noHosts=" + noHosts + ", status=" + summaries + '}';
+        + ", Hosts=" + showHosts + ", status=" + summaries + '}';
   }
 
   public enum ReportKey {
diff --git 
a/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/StatusSummary.java
 
b/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/StatusSummary.java
index 9ae9e87d5e..3b7227c003 100644
--- 
a/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/StatusSummary.java
+++ 
b/server/base/src/main/java/org/apache/accumulo/server/util/serviceStatus/StatusSummary.java
@@ -18,9 +18,11 @@
  */
 package org.apache.accumulo.server.util.serviceStatus;
 
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
+import java.util.TreeMap;
 
 public class StatusSummary {
 
@@ -64,6 +66,26 @@ public class StatusSummary {
     return errorCount;
   }
 
+  public StatusSummary withoutHosts() {
+    Map<String,Set<String>> tmpHosts = new TreeMap<>();
+
+    for (Map.Entry<String,Set<String>> entry : 
this.serviceByGroups.entrySet()) {
+
+      String group = entry.getKey();
+      int size = entry.getValue().size();
+      ;
+
+      Set<String> hosts = new HashSet<>();
+      for (int i = 0; i < size; i++) {
+        hosts.add("");
+      }
+
+      tmpHosts.put(group, hosts);
+    }
+
+    return new StatusSummary(this.serviceType, this.resourceGroups, tmpHosts, 
this.errorCount);
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git 
a/server/base/src/test/java/org/apache/accumulo/server/util/ServiceStatusCmdTest.java
 
b/server/base/src/test/java/org/apache/accumulo/server/util/ServiceStatusCmdTest.java
index ba7e7c4700..2b9027725a 100644
--- 
a/server/base/src/test/java/org/apache/accumulo/server/util/ServiceStatusCmdTest.java
+++ 
b/server/base/src/test/java/org/apache/accumulo/server/util/ServiceStatusCmdTest.java
@@ -400,7 +400,8 @@ public class ServiceStatusCmdTest {
     replay(zooReader); // needed for @AfterAll verify
     Admin.ServiceStatusCmdOpts opts = new Admin.ServiceStatusCmdOpts();
     assertFalse(opts.json);
-    assertFalse(opts.noHosts);
+    assertFalse(opts.showHosts);
+    assertFalse(opts.csv);
   }
 
 }

Reply via email to