You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kh...@apache.org on 2018/12/03 21:04:12 UTC

[geode] branch develop updated: GEODE-5971: Refactor ShowMetricsCommand to extend GfshCommand and ret… (#2928)

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

khowe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9ea9f15  GEODE-5971: Refactor ShowMetricsCommand to extend GfshCommand and ret… (#2928)
9ea9f15 is described below

commit 9ea9f1525d28a085c3f0e042a413e686465e4925
Author: Jens Deppe <jd...@pivotal.io>
AuthorDate: Mon Dec 3 13:04:02 2018 -0800

    GEODE-5971: Refactor ShowMetricsCommand to extend GfshCommand and ret… (#2928)
    
    * GEODE-5971: Refactor ShowMetricsCommand to extend GfshCommand and return ResultModel
       * Applied updates from reviews
    
    Signed-off-by: Jens Deppe <jd...@pivotal.io>
---
 .../cli/commands/ShowMetricsDUnitTest.java         |   2 +-
 .../internal/cli/commands/ShowMetricsCommand.java  | 117 +++++++++------------
 .../cli/commands/ShowMetricsInterceptor.java       |  21 ++++
 .../internal/cli/result/model/FileResultModel.java |   9 ++
 4 files changed, 83 insertions(+), 66 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
index f8daf1b..7db9a3d 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
@@ -139,7 +139,7 @@ public class ShowMetricsDUnitTest {
     gfsh.executeAndAssertThat("show metrics --member=" + server.getName() + " --port="
         + server.getPort() + " --file=" + output.getAbsolutePath()).statusIsSuccess()
         .containsOutput("Member Metrics").containsOutput("cacheserver")
-        .containsOutput("Member metrics exported to " + output.getAbsolutePath());
+        .containsOutput("Metrics saved to: " + output.getAbsolutePath());
 
     assertThat(output).exists();
   }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommand.java
index 8055d79..fc0351c 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommand.java
@@ -39,20 +39,17 @@ import org.apache.geode.management.MemberMXBean;
 import org.apache.geode.management.RegionMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.GfshCommand;
 import org.apache.geode.management.internal.MBeanJMXAdapter;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ErrorResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.ResultData;
 import org.apache.geode.management.internal.cli.result.ResultDataException;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class ShowMetricsCommand extends InternalGfshCommand {
+public class ShowMetricsCommand extends GfshCommand {
   enum Category {
     cache,
     cacheserver,
@@ -100,7 +97,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
       interceptor = "org.apache.geode.management.internal.cli.commands.ShowMetricsInterceptor")
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result showMetrics(
+  public ResultModel showMetrics(
       @CliOption(key = {CliStrings.MEMBER}, optionContext = ConverterHint.ALL_MEMBER_IDNAME,
           help = CliStrings.SHOW_METRICS__MEMBER__HELP) String memberNameOrId,
       @CliOption(key = {CliStrings.SHOW_METRICS__REGION}, optionContext = ConverterHint.REGION_PATH,
@@ -116,22 +113,22 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     StringBuilder csvBuilder =
         StringUtils.isEmpty(export_to_report_to) ? null : prepareCsvBuilder();
 
-    ResultData resultData;
+    ResultModel result;
     if (regionName != null && memberNameOrId != null) {
-      resultData = getRegionMetricsFromMember(regionName, member, export_to_report_to, categories,
+      result = getRegionMetricsFromMember(regionName, member, export_to_report_to, categories,
           csvBuilder);
     } else if (regionName != null) {
-      resultData =
+      result =
           getDistributedRegionMetrics(regionName, export_to_report_to, categories, csvBuilder);
     } else if (memberNameOrId != null) {
       int cacheServerPort = rawCacheServerPort == null ? -1 : rawCacheServerPort;
-      resultData =
+      result =
           getMemberMetrics(member, export_to_report_to, categories, cacheServerPort, csvBuilder);
     } else {
-      resultData = getSystemWideMetrics(export_to_report_to, categories, csvBuilder);
+      result = getSystemWideMetrics(export_to_report_to, categories, csvBuilder);
     }
 
-    return ResultBuilder.buildResult(resultData);
+    return result;
   }
 
   /**
@@ -140,19 +137,18 @@ public class ShowMetricsCommand extends InternalGfshCommand {
    * @return ResultData with required System wide statistics or ErrorResultData if DS MBean is not
    *         found to gather metrics
    */
-  private ResultData getSystemWideMetrics(String export_to_report_to, String[] categoriesArr,
+  private ResultModel getSystemWideMetrics(String export_to_report_to, String[] categoriesArr,
       StringBuilder csvBuilder) {
     final ManagementService managementService = getManagementService();
     DistributedSystemMXBean dsMxBean = managementService.getDistributedSystemMXBean();
     if (dsMxBean == null) {
       String errorMessage =
           CliStrings.format(CliStrings.SHOW_METRICS__ERROR, "Distributed System MBean not found");
-      return ResultBuilder.createErrorResultData().addLine(errorMessage);
+      return ResultModel.createError(errorMessage);
     }
 
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
-    CompositeResultData.SectionResultData section = crd.addSection();
-    TabularResultData metricsTable = section.addTable();
+    ResultModel result = new ResultModel();
+    TabularResultModel metricsTable = result.addTable("cluster-metrics");
 
     Set<Category> categoriesToDisplay = ArrayUtils.isNotEmpty(categoriesArr)
         ? getCategorySet(categoriesArr) : new HashSet<>(SYSTEM_METRIC_CATEGORIES);
@@ -161,11 +157,10 @@ public class ShowMetricsCommand extends InternalGfshCommand {
 
     writeSystemWideMetricValues(dsMxBean, csvBuilder, metricsTable, categoriesToDisplay);
     if (StringUtils.isNotEmpty(export_to_report_to)) {
-      crd.addAsFile(export_to_report_to, csvBuilder.toString(),
-          "Cluster wide metrics exported to {0}.", false);
+      result.addFile(export_to_report_to, csvBuilder.toString());
     }
 
-    return crd;
+    return result;
   }
 
   /**
@@ -175,7 +170,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
    *         found to gather metrics
    * @throws ResultDataException if building result fails
    */
-  private ResultData getMemberMetrics(DistributedMember distributedMember,
+  private ResultModel getMemberMetrics(DistributedMember distributedMember,
       String export_to_report_to, String[] categoriesArr, int cacheServerPort,
       StringBuilder csvBuilder) throws ResultDataException {
     final SystemManagementService managementService =
@@ -190,7 +185,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     if (memberMxBean == null) {
       String errorMessage = CliStrings.format(CliStrings.SHOW_METRICS__ERROR, "Member MBean for "
           + MBeanJMXAdapter.getMemberNameOrId(distributedMember) + " not found");
-      return ResultBuilder.createErrorResultData().addLine(errorMessage);
+      return ResultModel.createError(errorMessage);
     }
 
     if (cacheServerPort != -1) {
@@ -198,18 +193,16 @@ public class ShowMetricsCommand extends InternalGfshCommand {
       csMxBean = managementService.getMBeanInstance(csMxBeanName, CacheServerMXBean.class);
 
       if (csMxBean == null) {
-        ErrorResultData erd = ResultBuilder.createErrorResultData();
-        erd.addLine(CliStrings.format(CliStrings.SHOW_METRICS__CACHE__SERVER__NOT__FOUND,
-            cacheServerPort, MBeanJMXAdapter.getMemberNameOrId(distributedMember)));
-        return erd;
+        return ResultModel.createError(
+            CliStrings.format(CliStrings.SHOW_METRICS__CACHE__SERVER__NOT__FOUND,
+                cacheServerPort, MBeanJMXAdapter.getMemberNameOrId(distributedMember)));
       }
     }
 
     JVMMetrics jvmMetrics = memberMxBean.showJVMMetrics();
 
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
-    CompositeResultData.SectionResultData section = crd.addSection();
-    TabularResultData metricsTable = section.addTable();
+    ResultModel result = new ResultModel();
+    TabularResultModel metricsTable = result.addTable("member-metrics");
     metricsTable.setHeader("Member Metrics");
 
     List<Category> fullCategories =
@@ -224,11 +217,10 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     }
 
     if (StringUtils.isNotEmpty(export_to_report_to)) {
-      crd.addAsFile(export_to_report_to, csvBuilder != null ? csvBuilder.toString() : null,
-          "Member metrics exported to {0}.", false);
+      result.addFile(export_to_report_to, csvBuilder != null ? csvBuilder.toString() : null);
     }
-    return crd;
 
+    return result;
   }
 
   /**
@@ -237,7 +229,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
    * @return ResultData containing the table
    * @throws ResultDataException if building result fails
    */
-  private ResultData getDistributedRegionMetrics(String regionName, String export_to_report_to,
+  private ResultModel getDistributedRegionMetrics(String regionName, String export_to_report_to,
       String[] categoriesArr, StringBuilder csvBuilder) throws ResultDataException {
 
     final ManagementService managementService = getManagementService();
@@ -245,16 +237,13 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     DistributedRegionMXBean regionMxBean = managementService.getDistributedRegionMXBean(regionName);
 
     if (regionMxBean == null) {
-      ErrorResultData erd = ResultBuilder.createErrorResultData();
       String errorMessage = CliStrings.format(CliStrings.SHOW_METRICS__ERROR,
           "Distributed Region MBean for " + regionName + " not found");
-      erd.addLine(errorMessage);
-      return erd;
+      return ResultModel.createError(errorMessage);
     }
 
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
-    CompositeResultData.SectionResultData section = crd.addSection();
-    TabularResultData metricsTable = section.addTable();
+    ResultModel result = new ResultModel();
+    TabularResultModel metricsTable = result.addTable("metrics");
     metricsTable.setHeader("Cluster-wide Region Metrics");
 
     Set<Category> categoriesToDisplay = ArrayUtils.isNotEmpty(categoriesArr)
@@ -263,11 +252,10 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     writeSystemRegionMetricValues(regionMxBean, metricsTable, csvBuilder, categoriesToDisplay);
 
     if (StringUtils.isNotEmpty(export_to_report_to)) {
-      crd.addAsFile(export_to_report_to, csvBuilder != null ? csvBuilder.toString() : null,
-          "Aggregate Region Metrics exported to {0}.", false);
+      result.addFile(export_to_report_to, csvBuilder != null ? csvBuilder.toString() : null);
     }
 
-    return crd;
+    return result;
   }
 
   /**
@@ -277,12 +265,11 @@ public class ShowMetricsCommand extends InternalGfshCommand {
    *         found to gather metrics
    * @throws ResultDataException if building result fails
    */
-  private ResultData getRegionMetricsFromMember(String regionName,
+  private ResultModel getRegionMetricsFromMember(String regionName,
       DistributedMember distributedMember, String export_to_report_to, String[] categoriesArr,
       StringBuilder csvBuilder) throws ResultDataException {
 
-    final SystemManagementService managementService =
-        (SystemManagementService) getManagementService();
+    final SystemManagementService managementService = getManagementService();
 
     ObjectName regionMBeanName =
         managementService.getRegionMBeanName(distributedMember, regionName);
@@ -290,17 +277,14 @@ public class ShowMetricsCommand extends InternalGfshCommand {
         managementService.getMBeanInstance(regionMBeanName, RegionMXBean.class);
 
     if (regionMxBean == null) {
-      ErrorResultData erd = ResultBuilder.createErrorResultData();
       String errorMessage = CliStrings.format(CliStrings.SHOW_METRICS__ERROR,
           "Region MBean for " + regionName + " on member "
               + MBeanJMXAdapter.getMemberNameOrId(distributedMember) + " not found");
-      erd.addLine(errorMessage);
-      return erd;
+      return ResultModel.createError(errorMessage);
     }
 
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
-    CompositeResultData.SectionResultData section = crd.addSection();
-    TabularResultData metricsTable = section.addTable();
+    ResultModel result = new ResultModel();
+    TabularResultModel metricsTable = result.addTable("metrics");
     metricsTable.setHeader("Metrics for region:" + regionName + " On Member "
         + MBeanJMXAdapter.getMemberNameOrId(distributedMember));
 
@@ -309,15 +293,15 @@ public class ShowMetricsCommand extends InternalGfshCommand {
 
     writeRegionMetricValues(regionMxBean, metricsTable, csvBuilder, categoriesToDisplay);
     if (StringUtils.isNotEmpty(export_to_report_to)) {
-      crd.addAsFile(export_to_report_to, csvBuilder != null ? csvBuilder.toString() : null,
-          "Region Metrics exported to {0}.", false);
+      result.addFile(export_to_report_to, csvBuilder != null ? csvBuilder.toString() : null);
     }
 
-    return crd;
+    return result;
   }
 
   private void writeSystemWideMetricValues(DistributedSystemMXBean dsMxBean,
-      StringBuilder csvBuilder, TabularResultData metricsTable, Set<Category> categoriesToDisplay) {
+      StringBuilder csvBuilder, TabularResultModel metricsTable,
+      Set<Category> categoriesToDisplay) {
     if (categoriesToDisplay.contains(Category.cluster)) {
       writeToTableAndCsv(metricsTable, "cluster", "totalHeapSize", dsMxBean.getTotalHeapSize(),
           csvBuilder);
@@ -353,7 +337,8 @@ public class ShowMetricsCommand extends InternalGfshCommand {
   }
 
   private void writeMemberMetricValues(MemberMXBean memberMxBean, JVMMetrics jvmMetrics,
-      TabularResultData metricsTable, StringBuilder csvBuilder, Set<Category> categoriesToDisplay) {
+      TabularResultModel metricsTable, StringBuilder csvBuilder,
+      Set<Category> categoriesToDisplay) {
     if (categoriesToDisplay.contains(Category.member)) {
       writeToTableAndCsv(metricsTable, "member", "upTime", memberMxBean.getMemberUpTime(),
           csvBuilder);
@@ -512,7 +497,8 @@ public class ShowMetricsCommand extends InternalGfshCommand {
   }
 
   private void writeCacheServerMetricValues(CacheServerMXBean csMxBean,
-      TabularResultData metricsTable, StringBuilder csvBuilder, Set<Category> categoriesToDisplay) {
+      TabularResultModel metricsTable, StringBuilder csvBuilder,
+      Set<Category> categoriesToDisplay) {
     if (categoriesToDisplay.contains(Category.cacheserver)) {
 
       writeToTableAndCsv(metricsTable, "cacheserver", "clientConnectionCount",
@@ -563,7 +549,8 @@ public class ShowMetricsCommand extends InternalGfshCommand {
   }
 
   private void writeSystemRegionMetricValues(DistributedRegionMXBean regionMxBean,
-      TabularResultData metricsTable, StringBuilder csvBuilder, Set<Category> categoriesToDisplay) {
+      TabularResultModel metricsTable, StringBuilder csvBuilder,
+      Set<Category> categoriesToDisplay) {
     if (categoriesToDisplay.contains(Category.cluster)) {
       writeToTableAndCsv(metricsTable, "cluster", "member count", regionMxBean.getMemberCount(),
           csvBuilder);
@@ -634,7 +621,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     }
   }
 
-  private void writeRegionMetricValues(RegionMXBean regionMxBean, TabularResultData metricsTable,
+  private void writeRegionMetricValues(RegionMXBean regionMxBean, TabularResultModel metricsTable,
       StringBuilder csvBuilder, Set<Category> categoriesToDisplay) {
     if (categoriesToDisplay.contains(Category.region)) {
       writeToTableAndCsv(metricsTable, "region", "lastModifiedTime",
@@ -701,7 +688,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     }
   }
 
-  private void writeToTableAndCsv(TabularResultData metricsTable, String type, String metricName,
+  private void writeToTableAndCsv(TabularResultModel metricsTable, String type, String metricName,
       String metricValue, StringBuilder csvBuilder) {
     metricsTable.accumulate(CliStrings.SHOW_METRICS__TYPE__HEADER, type);
     metricsTable.accumulate(CliStrings.SHOW_METRICS__METRIC__HEADER, metricName);
@@ -710,7 +697,7 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     writeToCsvIfNecessary(type, metricName, String.valueOf(metricValue), csvBuilder);
   }
 
-  private void writeToTableAndCsv(TabularResultData metricsTable, String type, String metricName,
+  private void writeToTableAndCsv(TabularResultModel metricsTable, String type, String metricName,
       String[] metricValue, StringBuilder csvBuilder) {
     if (ArrayUtils.isEmpty(metricValue)) {
       return;
@@ -725,12 +712,12 @@ public class ShowMetricsCommand extends InternalGfshCommand {
     }
   }
 
-  private void writeToTableAndCsv(TabularResultData metricsTable, String type, String metricName,
+  private void writeToTableAndCsv(TabularResultModel metricsTable, String type, String metricName,
       long metricValue, StringBuilder csvBuilder) {
     writeToTableAndCsv(metricsTable, type, metricName, String.valueOf(metricValue), csvBuilder);
   }
 
-  private void writeToTableAndCsv(TabularResultData metricsTable, String type, String metricName,
+  private void writeToTableAndCsv(TabularResultModel metricsTable, String type, String metricName,
       double metricValue, StringBuilder csvBuilder) {
     writeToTableAndCsv(metricsTable, type, metricName, String.valueOf(metricValue), csvBuilder);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsInterceptor.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsInterceptor.java
index e189d1d..739dc6c 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsInterceptor.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsInterceptor.java
@@ -14,9 +14,12 @@
  */
 package org.apache.geode.management.internal.cli.commands;
 
+import java.io.IOException;
+import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -27,6 +30,8 @@ import org.apache.geode.management.internal.cli.commands.ShowMetricsCommand.Cate
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
+import org.apache.geode.management.internal.cli.result.model.FileResultModel;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 
 public class ShowMetricsInterceptor extends AbstractCliAroundInterceptor {
   @Override
@@ -102,4 +107,20 @@ public class ShowMetricsInterceptor extends AbstractCliAroundInterceptor {
     }
     return ResultBuilder.createUserErrorResult(sb.toString());
   }
+
+  @Override
+  public ResultModel postExecution(GfshParseResult parseResult, ResultModel resultModel,
+      Path tempFile) {
+    try {
+      for (Map.Entry<String, FileResultModel> entry : resultModel.getFiles().entrySet()) {
+        entry.getValue().saveFile();
+        resultModel.addInfo().addLine("Metrics saved to: " + entry.getKey());
+      }
+    } catch (IOException e) {
+      resultModel.addInfo().addLine("Unable to save file: " + e.getMessage());
+      resultModel.setStatus(Result.Status.ERROR);
+    }
+
+    return resultModel;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/FileResultModel.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/FileResultModel.java
index 22ec9e8..89721e1 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/FileResultModel.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/FileResultModel.java
@@ -92,6 +92,15 @@ public class FileResultModel {
   }
 
   /**
+   * Save the file to the current working directory
+   *
+   * @return the message you would like to return to the user.
+   */
+  public String saveFile() throws IOException {
+    return saveFile(null);
+  }
+
+  /**
    * at this point, the dir should already exist and is confirmed as a directory
    * filename in this instance should be file name only. no path in the file name
    *