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);
}
}