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

prhomberg 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 69143c1  GEODE-3961: Refactor ShowMetricsCommand to handle 
--categories uniformly
69143c1 is described below

commit 69143c14f43f8cee514e36630bb495b3c106bcec
Author: Patrick Rhomberg <[email protected]>
AuthorDate: Tue Nov 14 10:02:44 2017 -0800

    GEODE-3961: Refactor ShowMetricsCommand to handle --categories uniformly
    
    * GEODE-3961: Refactor ShowMetricsCommand to behave uniformly when 
--categories is provided.
    
    * The ShowMetricsCommand has been almost entirely refactored, but with 
minimal change to existing behavior.
    * The category "cache-server" has been renamed to "cacheserver"
    * The "query" category now only lists once instead of twice.
    * Category checking is now performed by the client, not the server.
    * Alphabetized excludedClasses.txt
---
 .../geode/management/internal/cli/GfshParser.java  |    2 +-
 .../internal/cli/commands/ShowMetricsCommand.java  | 1456 ++++++++------------
 .../cli/commands/ShowMetricsInterceptor.java       |  107 ++
 .../management/internal/cli/i18n/CliStrings.java   |    7 +-
 .../geode/internal/cache/ha/Bug48571DUnitTest.java |   96 +-
 .../ShowMetricsCommandIntegrationTest.java         |  171 +++
 .../cli/commands/ShowMetricsDUnitTest.java         |    4 +-
 ...andJUnitTest.java => ShowMetricsJUnitTest.java} |    8 +-
 .../test/junit/assertions/CommandResultAssert.java |   38 +-
 .../apache/geode/codeAnalysis/excludedClasses.txt  |  215 +--
 .../cli/commands/golden-help-offline.properties    |   10 +-
 11 files changed, 1057 insertions(+), 1057 deletions(-)

diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
index 9cebc63..4fc7d4e 100755
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/GfshParser.java
@@ -282,7 +282,7 @@ public class GfshParser extends SimpleParser {
   /**
    * @param buffer use the buffer to find the completion candidates
    *
-   *        Note the cursor maynot be the size the buffer
+   *        Note the cursor may not be the size the buffer
    */
   private List<Completion> getCandidates(String buffer) {
     List<Completion> candidates = new ArrayList<>();
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 6783925..bf303f5 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
@@ -15,21 +15,22 @@
 
 package org.apache.geode.management.internal.cli.commands;
 
-import java.util.Collections;
-import java.util.HashMap;
+import java.util.Arrays;
 import java.util.HashSet;
-import java.util.Map;
+import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.management.ObjectName;
 
-import org.apache.logging.log4j.Logger;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.CacheServerMXBean;
 import org.apache.geode.management.DistributedRegionMXBean;
 import org.apache.geode.management.DistributedSystemMXBean;
@@ -42,8 +43,6 @@ import org.apache.geode.management.cli.ConverterHint;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.MBeanJMXAdapter;
 import org.apache.geode.management.internal.SystemManagementService;
-import org.apache.geode.management.internal.cli.AbstractCliAroundInterceptor;
-import org.apache.geode.management.internal.cli.GfshParseResult;
 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;
@@ -55,11 +54,51 @@ import 
org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
 public class ShowMetricsCommand implements GfshCommand {
-  private static final Logger logger = LogService.getLogger();
+  enum Category {
+    cache,
+    cacheserver,
+    callback,
+    cluster,
+    communication,
+    diskstore,
+    distribution,
+    eviction,
+    function,
+    jvm,
+    lock,
+    offheap,
+    member,
+    notification,
+    partition,
+    query,
+    region,
+    serialization,
+    transaction
+  }
+
+  static final List<Category> REGION_METRIC_CATEGORIES = 
Arrays.asList(Category.callback,
+      Category.diskstore, Category.eviction, Category.partition, 
Category.region);
+
+  static final List<Category> SYSTEM_METRIC_CATEGORIES =
+      Arrays.asList(Category.cache, Category.cluster, Category.diskstore, 
Category.query);
+
+  static final List<Category> SYSTEM_REGION_METRIC_CATEGORIES = 
Arrays.asList(Category.callback,
+      Category.cluster, Category.diskstore, Category.eviction, 
Category.partition, Category.region);
+
+  static final List<Category> MEMBER_METRIC_CATEGORIES =
+      Arrays.asList(Category.communication, Category.diskstore, 
Category.distribution,
+          Category.eviction, Category.function, Category.jvm, Category.lock, 
Category.member,
+          Category.offheap, Category.region, Category.serialization, 
Category.transaction);
+
+  static final List<Category> MEMBER_WITH_PORT_METRIC_CATEGORIES =
+      Arrays.asList(Category.cacheserver, Category.communication, 
Category.diskstore,
+          Category.distribution, Category.eviction, Category.function, 
Category.jvm, Category.lock,
+          Category.member, Category.notification, Category.offheap, 
Category.query, Category.region,
+          Category.serialization, Category.transaction);
 
   @CliCommand(value = CliStrings.SHOW_METRICS, help = 
CliStrings.SHOW_METRICS__HELP)
   @CliMetaData(relatedTopic = {CliStrings.TOPIC_GEODE_STATISTICS},
-      interceptor = 
"org.apache.geode.management.internal.cli.commands.ShowMetricsCommand$Interceptor")
+      interceptor = 
"org.apache.geode.management.internal.cli.commands.ShowMetricsInterceptor")
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
   public Result showMetrics(
@@ -70,71 +109,30 @@ public class ShowMetricsCommand implements GfshCommand {
       @CliOption(key = {CliStrings.SHOW_METRICS__FILE},
           help = CliStrings.SHOW_METRICS__FILE__HELP) String 
export_to_report_to,
       @CliOption(key = {CliStrings.SHOW_METRICS__CACHESERVER__PORT},
-          help = CliStrings.SHOW_METRICS__CACHESERVER__PORT__HELP) String 
cacheServerPortString,
+          help = CliStrings.SHOW_METRICS__CACHESERVER__PORT__HELP) Integer 
rawCacheServerPort,
       @CliOption(key = {CliStrings.SHOW_METRICS__CATEGORY},
           help = CliStrings.SHOW_METRICS__CATEGORY__HELP) String[] categories) 
{
 
-    Result result;
-    DistributedMember member = null;
-    if (memberNameOrId != null) {
-      member = getMember(memberNameOrId);
-    }
-
-    if (regionName != null) {
-      if (memberNameOrId != null) {
-        result = ResultBuilder.buildResult(
-            getRegionMetricsFromMember(regionName, member, 
export_to_report_to, categories));
-      } else {
-        result = ResultBuilder
-            .buildResult(getDistributedRegionMetrics(regionName, 
export_to_report_to, categories));
-      }
+    DistributedMember member = memberNameOrId == null ? null : 
getMember(memberNameOrId);
+    StringBuilder csvBuilder =
+        StringUtils.isEmpty(export_to_report_to) ? null : prepareCsvBuilder();
+
+    ResultData resultData;
+    if (regionName != null && memberNameOrId != null) {
+      resultData = getRegionMetricsFromMember(regionName, member, 
export_to_report_to, categories,
+          csvBuilder);
+    } else if (regionName != null) {
+      resultData =
+          getDistributedRegionMetrics(regionName, export_to_report_to, 
categories, csvBuilder);
     } else if (memberNameOrId != null) {
-      int cacheServerPort = -1;
-      if (cacheServerPortString != null) {
-        cacheServerPort = Integer.parseInt(cacheServerPortString);
-      }
-      result = ResultBuilder
-          .buildResult(getMemberMetrics(member, export_to_report_to, 
categories, cacheServerPort));
+      int cacheServerPort = rawCacheServerPort == null ? -1 : 
rawCacheServerPort;
+      resultData =
+          getMemberMetrics(member, export_to_report_to, categories, 
cacheServerPort, csvBuilder);
     } else {
-      result = 
ResultBuilder.buildResult(getSystemWideMetrics(export_to_report_to, 
categories));
+      resultData = getSystemWideMetrics(export_to_report_to, categories, 
csvBuilder);
     }
 
-    return result;
-  }
-
-  public static class Interceptor extends AbstractCliAroundInterceptor {
-    @Override
-    public Result preExecution(GfshParseResult parseResult) {
-      String export_to_report_to = 
parseResult.getParamValueAsString(CliStrings.SHOW_METRICS__FILE);
-      if (export_to_report_to != null && 
!export_to_report_to.endsWith(".csv")) {
-        return ResultBuilder
-            
.createUserErrorResult(CliStrings.format(CliStrings.INVALID_FILE_EXTENSION, 
".csv"));
-      }
-
-      String regionName = 
parseResult.getParamValueAsString(CliStrings.SHOW_METRICS__REGION);
-      String port = 
parseResult.getParamValueAsString(CliStrings.SHOW_METRICS__CACHESERVER__PORT);
-
-      if (port != null) {
-        try {
-          Integer.parseInt(port);
-        } catch (NumberFormatException nfe) {
-          return ResultBuilder.createUserErrorResult("Invalid port");
-        }
-      }
-
-      if (regionName != null && port != null) {
-        return ResultBuilder.createUserErrorResult(
-            
CliStrings.SHOW_METRICS__CANNOT__USE__REGION__WITH__CACHESERVERPORT);
-      }
-
-      String member = parseResult.getParamValueAsString(CliStrings.MEMBER);
-      if (port != null && member == null) {
-        return ResultBuilder
-            
.createUserErrorResult(CliStrings.SHOW_METRICS__CANNOT__USE__CACHESERVERPORT);
-      }
-
-      return ResultBuilder.createInfoResult("OK");
-    }
+    return ResultBuilder.buildResult(resultData);
   }
 
   /**
@@ -143,101 +141,33 @@ public class ShowMetricsCommand implements GfshCommand {
    * @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 ResultData getSystemWideMetrics(String export_to_report_to, String[] 
categoriesArr,
+      StringBuilder csvBuilder) {
     final InternalCache cache = getCache();
     final ManagementService managementService = 
ManagementService.getManagementService(cache);
     DistributedSystemMXBean dsMxBean = 
managementService.getDistributedSystemMXBean();
-    StringBuilder csvBuilder = null;
-    if (dsMxBean != null) {
-
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        csvBuilder = new StringBuilder();
-        csvBuilder.append("Category");
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__METRIC__HEADER);
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__VALUE__HEADER);
-        csvBuilder.append('\n');
-      }
-
-      CompositeResultData crd = ResultBuilder.createCompositeResultData();
-      CompositeResultData.SectionResultData section = crd.addSection();
-      TabularResultData metricsTable = section.addTable();
-      Map<String, Boolean> categoriesMap = getSystemMetricsCategories();
-
-      if (categoriesArr != null && categoriesArr.length != 0) {
-        Set<String> categories = createSet(categoriesArr);
-        Set<String> checkSet = new HashSet<>(categoriesMap.keySet());
-        Set<String> userCategories = getSetDifference(categories, checkSet);
-
-        // Checking if the categories specified by the user are valid or not
-
-        if (userCategories.isEmpty()) {
-          for (String category : checkSet) {
-            categoriesMap.put(category, false);
-          }
-          for (String category : categories) {
-            categoriesMap.put(category.toLowerCase(), true);
-          }
-        } else {
-          StringBuilder sb = new StringBuilder();
-          sb.append("Invalid Categories\n");
-
-          for (String category : userCategories) {
-            sb.append(category);
-            sb.append('\n');
-          }
-          return ResultBuilder.createErrorResultData().addLine(sb.toString());
-        }
-      }
-      metricsTable.setHeader("Cluster-wide Metrics");
-
-      if (categoriesMap.get("cluster")) {
-        writeToTableAndCsv(metricsTable, "cluster", "totalHeapSize", 
dsMxBean.getTotalHeapSize(),
-            csvBuilder);
-      }
+    if (dsMxBean == null) {
+      String errorMessage =
+          CliStrings.format(CliStrings.SHOW_METRICS__ERROR, "Distributed 
System MBean not found");
+      return ResultBuilder.createErrorResultData().addLine(errorMessage);
+    }
 
-      if (categoriesMap.get("cache")) {
-        writeToTableAndCsv(metricsTable, "cache", "totalRegionEntryCount",
-            dsMxBean.getTotalRegionEntryCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalRegionCount", 
dsMxBean.getTotalRegionCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalMissCount", 
dsMxBean.getTotalMissCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalHitCount", 
dsMxBean.getTotalHitCount(),
-            csvBuilder);
-      }
+    CompositeResultData crd = ResultBuilder.createCompositeResultData();
+    CompositeResultData.SectionResultData section = crd.addSection();
+    TabularResultData metricsTable = section.addTable();
 
-      if (categoriesMap.get("diskstore")) {
-        writeToTableAndCsv(metricsTable, "diskstore", "totalDiskUsage",
-            dsMxBean.getTotalDiskUsage(), csvBuilder); // deadcoded to 
workaround bug 46397
-        writeToTableAndCsv(metricsTable, ""/* 46608 */, "diskReadsRate",
-            dsMxBean.getDiskReadsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
dsMxBean.getDiskWritesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "flushTimeAvgLatency",
-            dsMxBean.getDiskFlushAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalBackupInProgress",
-            dsMxBean.getTotalBackupInProgress(), csvBuilder);
-      }
+    Set<Category> categoriesToDisplay = ArrayUtils.isNotEmpty(categoriesArr)
+        ? getCategorySet(categoriesArr) : new 
HashSet<>(SYSTEM_METRIC_CATEGORIES);
 
-      if (categoriesMap.get("query")) {
-        writeToTableAndCsv(metricsTable, "query", "activeCQCount", 
dsMxBean.getActiveCQCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "queryRequestRate", 
dsMxBean.getQueryRequestRate(),
-            csvBuilder);
-      }
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        crd.addAsFile(export_to_report_to, csvBuilder.toString(),
-            "Cluster wide metrics exported to {0}.", false);
-      }
+    metricsTable.setHeader("Cluster-wide Metrics");
 
-      return crd;
-    } else {
-      String errorMessage =
-          CliStrings.format(CliStrings.SHOW_METRICS__ERROR, "Distributed 
System MBean not found");
-      return ResultBuilder.createErrorResultData().addLine(errorMessage);
+    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);
     }
+
+    return crd;
   }
 
   /**
@@ -248,8 +178,8 @@ public class ShowMetricsCommand implements GfshCommand {
    * @throws ResultDataException if building result fails
    */
   private ResultData getMemberMetrics(DistributedMember distributedMember,
-      String export_to_report_to, String[] categoriesArr, int cacheServerPort)
-      throws ResultDataException {
+      String export_to_report_to, String[] categoriesArr, int cacheServerPort,
+      StringBuilder csvBuilder) throws ResultDataException {
     final InternalCache cache = getCache();
     final SystemManagementService managementService =
         (SystemManagementService) 
ManagementService.getManagementService(cache);
@@ -260,352 +190,48 @@ public class ShowMetricsCommand implements GfshCommand {
     ObjectName csMxBeanName;
     CacheServerMXBean csMxBean = null;
 
-    if (memberMxBean != null) {
-
-      if (cacheServerPort != -1) {
-        csMxBeanName =
-            managementService.getCacheServerMBeanName(cacheServerPort, 
distributedMember);
-        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;
-        }
-      }
-
-      JVMMetrics jvmMetrics = memberMxBean.showJVMMetrics();
-
-      CompositeResultData crd = ResultBuilder.createCompositeResultData();
-      CompositeResultData.SectionResultData section = crd.addSection();
-      TabularResultData metricsTable = section.addTable();
-      metricsTable.setHeader("Member Metrics");
-      StringBuilder csvBuilder = null;
-
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        csvBuilder = new StringBuilder();
-        csvBuilder.append("Category");
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__METRIC__HEADER);
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__VALUE__HEADER);
-        csvBuilder.append('\n');
-      }
-
-      Map<String, Boolean> categoriesMap = getMemberMetricsCategories();
-
-      if (categoriesArr != null && categoriesArr.length != 0) {
-        Set<String> categories = createSet(categoriesArr);
-        Set<String> checkSet = new HashSet<>(categoriesMap.keySet());
-        Set<String> userCategories = getSetDifference(categories, checkSet);
-
-        // Checking if the categories specified by the user are valid or not
-        if (userCategories.isEmpty()) {
-          for (String category : checkSet) {
-            categoriesMap.put(category, false);
-          }
-          for (String category : categories) {
-            categoriesMap.put(category.toLowerCase(), true);
-          }
-        } else {
-          StringBuilder sb = new StringBuilder();
-          sb.append("Invalid Categories\n");
-
-          for (String category : userCategories) {
-            sb.append(category);
-            sb.append('\n');
-          }
-          return ResultBuilder.createErrorResultData().addLine(sb.toString());
-        }
-      }
-
-      /*
-       * Member Metrics
-       */
-      // member, jvm, region, serialization, communication, function, 
transaction, diskstore, lock,
-      // eviction, distribution
-      if (categoriesMap.get("member")) {
-        writeToTableAndCsv(metricsTable, "member", "upTime", 
memberMxBean.getMemberUpTime(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "cpuUsage", 
memberMxBean.getCpuUsage(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "currentHeapSize", 
memberMxBean.getCurrentHeapSize(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "maximumHeapSize", 
memberMxBean.getMaximumHeapSize(),
-            csvBuilder);
-      }
-      /*
-       * JVM Metrics
-       */
-      if (categoriesMap.get("jvm")) {
-        writeToTableAndCsv(metricsTable, "jvm ", "jvmThreads ", 
jvmMetrics.getTotalThreads(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "fileDescriptorLimit",
-            memberMxBean.getFileDescriptorLimit(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalFileDescriptorOpen",
-            memberMxBean.getTotalFileDescriptorOpen(), csvBuilder);
-      }
-      /*
-       * Member wide region metrics
-       */
-      if (categoriesMap.get("region")) {
-        writeToTableAndCsv(metricsTable, "region ", "totalRegionCount ",
-            memberMxBean.getTotalRegionCount(), csvBuilder);
-        String[] regionNames = memberMxBean.listRegions();
-        if (regionNames != null) {
-          for (int i = 0; i < regionNames.length; i++) {
-            if (i == 0) {
-              writeToTableAndCsv(metricsTable, "listOfRegions", 
regionNames[i].substring(1),
-                  csvBuilder);
-            } else {
-              writeToTableAndCsv(metricsTable, "", 
regionNames[i].substring(1), csvBuilder);
-            }
-          }
-        }
-
-        String[] rootRegionNames = memberMxBean.getRootRegionNames();
-        if (rootRegionNames != null) {
-          for (int i = 0; i < rootRegionNames.length; i++) {
-            if (i == 0) {
-              writeToTableAndCsv(metricsTable, "rootRegions", 
rootRegionNames[i], csvBuilder);
-            } else {
-              writeToTableAndCsv(metricsTable, "", rootRegionNames[i], 
csvBuilder);
-            }
-          }
-        }
-        writeToTableAndCsv(metricsTable, "", "totalRegionEntryCount",
-            memberMxBean.getTotalRegionEntryCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalBucketCount", 
memberMxBean.getTotalBucketCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalPrimaryBucketCount",
-            memberMxBean.getTotalPrimaryBucketCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getsAvgLatency", 
memberMxBean.getGetsAvgLatency(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putsAvgLatency", 
memberMxBean.getPutsAvgLatency(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "createsRate", 
memberMxBean.getCreatesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "destroyRate", 
memberMxBean.getDestroysRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putAllAvgLatency", 
memberMxBean.getPutAllAvgLatency(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalMissCount", 
memberMxBean.getTotalMissCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalHitCount", 
memberMxBean.getTotalHitCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getsRate", 
memberMxBean.getGetsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putsRate", 
memberMxBean.getPutsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "cacheWriterCallsAvgLatency",
-            memberMxBean.getCacheWriterCallsAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "cacheListenerCallsAvgLatency",
-            memberMxBean.getCacheListenerCallsAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalLoadsCompleted",
-            memberMxBean.getTotalLoadsCompleted(), csvBuilder);
-      }
-
-      /*
-       * SERIALIZATION
-       */
-      if (categoriesMap.get("serialization")) {
-        writeToTableAndCsv(metricsTable, "serialization", "serializationRate",
-            memberMxBean.getSerializationRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "serializationLatency",
-            memberMxBean.getSerializationRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "deserializationRate",
-            memberMxBean.getDeserializationRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "deserializationLatency",
-            memberMxBean.getDeserializationLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "deserializationAvgLatency",
-            memberMxBean.getDeserializationAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "PDXDeserializationAvgLatency",
-            memberMxBean.getPDXDeserializationAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "PDXDeserializationRate",
-            memberMxBean.getPDXDeserializationRate(), csvBuilder);
-      }
+    if (memberMxBean == null) {
+      String errorMessage = CliStrings.format(CliStrings.SHOW_METRICS__ERROR, 
"Member MBean for "
+          + MBeanJMXAdapter.getMemberNameOrId(distributedMember) + " not 
found");
+      return ResultBuilder.createErrorResultData().addLine(errorMessage);
+    }
 
-      /*
-       * Communication Metrics
-       */
-      if (categoriesMap.get("communication")) {
-        writeToTableAndCsv(metricsTable, "communication", "bytesSentRate",
-            memberMxBean.getBytesSentRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "bytesReceivedRate",
-            memberMxBean.getBytesReceivedRate(), csvBuilder);
-        String[] connectedGatewayReceivers = 
memberMxBean.listConnectedGatewayReceivers();
-        writeToTableAndCsv(metricsTable, "connectedGatewayReceivers", 
connectedGatewayReceivers,
-            csvBuilder);
-
-        String[] connectedGatewaySenders = 
memberMxBean.listConnectedGatewaySenders();
-        writeToTableAndCsv(metricsTable, "connectedGatewaySenders", 
connectedGatewaySenders,
-            csvBuilder);
-      }
+    if (cacheServerPort != -1) {
+      csMxBeanName = 
managementService.getCacheServerMBeanName(cacheServerPort, distributedMember);
+      csMxBean = managementService.getMBeanInstance(csMxBeanName, 
CacheServerMXBean.class);
 
-      /*
-       * Member wide function metrics
-       */
-      if (categoriesMap.get("function")) {
-        writeToTableAndCsv(metricsTable, "function", "numRunningFunctions",
-            memberMxBean.getNumRunningFunctions(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "functionExecutionRate",
-            memberMxBean.getFunctionExecutionRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", 
"numRunningFunctionsHavingResults",
-            memberMxBean.getNumRunningFunctionsHavingResults(), csvBuilder);
+      if (csMxBean == null) {
+        ErrorResultData erd = ResultBuilder.createErrorResultData();
+        
erd.addLine(CliStrings.format(CliStrings.SHOW_METRICS__CACHE__SERVER__NOT__FOUND,
+            cacheServerPort, 
MBeanJMXAdapter.getMemberNameOrId(distributedMember)));
+        return erd;
       }
+    }
 
-      /*
-       * totalTransactionsCount currentTransactionalThreadIds 
transactionCommitsAvgLatency
-       * transactionCommittedTotalCount transactionRolledBackTotalCount 
transactionCommitsRate
-       */
-      if (categoriesMap.get("transaction")) {
-        writeToTableAndCsv(metricsTable, "transaction", 
"totalTransactionsCount",
-            memberMxBean.getTotalTransactionsCount(), csvBuilder);
-
-        writeToTableAndCsv(metricsTable, "", "transactionCommitsAvgLatency",
-            memberMxBean.getTransactionCommitsAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "transactionCommittedTotalCount",
-            memberMxBean.getTransactionCommittedTotalCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "transactionRolledBackTotalCount",
-            memberMxBean.getTransactionRolledBackTotalCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "transactionCommitsRate",
-            memberMxBean.getTransactionCommitsRate(), csvBuilder);
-      }
-      /*
-       * Member wide disk metrics
-       */
-      if (categoriesMap.get("diskstore")) {
-        writeToTableAndCsv(metricsTable, "diskstore", "totalDiskUsage",
-            memberMxBean.getTotalDiskUsage(), csvBuilder); // deadcoded to 
workaround bug 46397
-        writeToTableAndCsv(metricsTable, ""/* 46608 */, "diskReadsRate",
-            memberMxBean.getDiskReadsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
memberMxBean.getDiskWritesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "flushTimeAvgLatency",
-            memberMxBean.getDiskFlushAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalQueueSize",
-            memberMxBean.getTotalDiskTasksWaiting(), csvBuilder); // deadcoded 
to workaround bug
-        // 46397
-        writeToTableAndCsv(metricsTable, "", "totalBackupInProgress",
-            memberMxBean.getTotalBackupInProgress(), csvBuilder);
-      }
-      /*
-       * Member wide Lock
-       */
-      if (categoriesMap.get("lock")) {
-        writeToTableAndCsv(metricsTable, "lock", "lockWaitsInProgress",
-            memberMxBean.getLockWaitsInProgress(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalLockWaitTime",
-            memberMxBean.getTotalLockWaitTime(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalNumberOfLockService",
-            memberMxBean.getTotalNumberOfLockService(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "requestQueues", 
memberMxBean.getLockRequestQueues(),
-            csvBuilder);
-      }
-      /*
-       * Eviction
-       */
-      if (categoriesMap.get("eviction")) {
-        writeToTableAndCsv(metricsTable, "eviction", "lruEvictionRate",
-            memberMxBean.getLruEvictionRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "lruDestroyRate", 
memberMxBean.getLruDestroyRate(),
-            csvBuilder);
-      }
-      /*
-       * Distribution
-       */
-      if (categoriesMap.get("distribution")) {
-        writeToTableAndCsv(metricsTable, "distribution", 
"getInitialImagesInProgress",
-            memberMxBean.getInitialImagesInProgress(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getInitialImageTime",
-            memberMxBean.getInitialImageTime(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getInitialImageKeysReceived",
-            memberMxBean.getInitialImageKeysReceived(), csvBuilder);
-      }
+    JVMMetrics jvmMetrics = memberMxBean.showJVMMetrics();
 
-      /*
-       * OffHeap
-       */
-      if (categoriesMap.get("offheap")) {
-        writeToTableAndCsv(metricsTable, "offheap", "maxMemory", 
memberMxBean.getOffHeapMaxMemory(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "freeMemory", 
memberMxBean.getOffHeapFreeMemory(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "usedMemory", 
memberMxBean.getOffHeapUsedMemory(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "objects", 
memberMxBean.getOffHeapObjects(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "fragmentation",
-            memberMxBean.getOffHeapFragmentation(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "compactionTime",
-            memberMxBean.getOffHeapCompactionTime(), csvBuilder);
-      }
+    CompositeResultData crd = ResultBuilder.createCompositeResultData();
+    CompositeResultData.SectionResultData section = crd.addSection();
+    TabularResultData metricsTable = section.addTable();
+    metricsTable.setHeader("Member Metrics");
 
-      /*
-       * CacheServer stats
-       */
-      if (csMxBean != null) {
-        writeToTableAndCsv(metricsTable, "cache-server", 
"clientConnectionCount",
-            csMxBean.getClientConnectionCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "hostnameForClients", 
csMxBean.getHostNameForClients(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getRequestAvgLatency",
-            csMxBean.getGetRequestAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRequestAvgLatency",
-            csMxBean.getPutRequestAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalConnectionsTimedOut",
-            csMxBean.getTotalConnectionsTimedOut(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "threadQueueSize", 
csMxBean.getPutRequestAvgLatency(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "connectionThreads", 
csMxBean.getConnectionThreads(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "connectionLoad", 
csMxBean.getConnectionLoad(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "loadPerConnection", 
csMxBean.getLoadPerConnection(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "queueLoad", 
csMxBean.getQueueLoad(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "loadPerQueue", 
csMxBean.getLoadPerQueue(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getRequestRate", 
csMxBean.getGetRequestRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRequestRate", 
csMxBean.getPutRequestRate(),
-            csvBuilder);
-
-        /*
-         * Notification
-         */
-        writeToTableAndCsv(metricsTable, "notification", 
"numClientNotificationRequests",
-            csMxBean.getNumClientNotificationRequests(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "clientNotificationRate",
-            csMxBean.getClientNotificationRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "clientNotificationAvgLatency",
-            csMxBean.getClientNotificationAvgLatency(), csvBuilder);
-
-        /*
-         * Query
-         */
-        writeToTableAndCsv(metricsTable, "query", "activeCQCount", 
csMxBean.getActiveCQCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "query", "queryRequestRate",
-            csMxBean.getQueryRequestRate(), csvBuilder);
-
-        writeToTableAndCsv(metricsTable, "", "indexCount", 
csMxBean.getIndexCount(), csvBuilder);
-
-        String[] indexList = csMxBean.getIndexList();
-        writeToTableAndCsv(metricsTable, "index list", indexList, csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalIndexMaintenanceTime",
-            csMxBean.getTotalIndexMaintenanceTime(), csvBuilder);
-      }
+    List<Category> fullCategories =
+        csMxBean != null ? MEMBER_WITH_PORT_METRIC_CATEGORIES : 
MEMBER_METRIC_CATEGORIES;
+    Set<Category> categoriesToDisplay = ArrayUtils.isNotEmpty(categoriesArr)
+        ? getCategorySet(categoriesArr) : new HashSet<>(fullCategories);
 
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        crd.addAsFile(export_to_report_to, csvBuilder != null ? 
csvBuilder.toString() : null,
-            "Member metrics exported to {0}.", false);
-      }
-      return crd;
+    writeMemberMetricValues(memberMxBean, jvmMetrics, metricsTable, csvBuilder,
+        categoriesToDisplay);
+    if (csMxBean != null) {
+      writeCacheServerMetricValues(csMxBean, metricsTable, csvBuilder, 
categoriesToDisplay);
+    }
 
-    } else {
-      String errorMessage = CliStrings.format(CliStrings.SHOW_METRICS__ERROR, 
"Member MBean for "
-          + MBeanJMXAdapter.getMemberNameOrId(distributedMember) + " not 
found");
-      return ResultBuilder.createErrorResultData().addLine(errorMessage);
+    if (StringUtils.isNotEmpty(export_to_report_to)) {
+      crd.addAsFile(export_to_report_to, csvBuilder != null ? 
csvBuilder.toString() : null,
+          "Member metrics exported to {0}.", false);
     }
+    return crd;
+
   }
 
   /**
@@ -615,155 +241,37 @@ public class ShowMetricsCommand implements GfshCommand {
    * @throws ResultDataException if building result fails
    */
   private ResultData getDistributedRegionMetrics(String regionName, String 
export_to_report_to,
-      String[] categoriesArr) throws ResultDataException {
+      String[] categoriesArr, StringBuilder csvBuilder) throws 
ResultDataException {
 
     final InternalCache cache = getCache();
     final ManagementService managementService = 
ManagementService.getManagementService(cache);
 
     DistributedRegionMXBean regionMxBean = 
managementService.getDistributedRegionMXBean(regionName);
 
-    if (regionMxBean != null) {
-      CompositeResultData crd = ResultBuilder.createCompositeResultData();
-      CompositeResultData.SectionResultData section = crd.addSection();
-      TabularResultData metricsTable = section.addTable();
-      metricsTable.setHeader("Cluster-wide Region Metrics");
-      StringBuilder csvBuilder = null;
-
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        csvBuilder = new StringBuilder();
-        csvBuilder.append("Category");
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__METRIC__HEADER);
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__VALUE__HEADER);
-        csvBuilder.append('\n');
-      }
-
-      Map<String, Boolean> categoriesMap = getSystemRegionMetricsCategories();
-
-      if (categoriesArr != null && categoriesArr.length != 0) {
-        Set<String> categories = createSet(categoriesArr);
-        Set<String> checkSet = new HashSet<>(categoriesMap.keySet());
-        Set<String> userCategories = getSetDifference(categories, checkSet);
-
-        // Checking if the categories specified by the user are valid or not
-        if (userCategories.isEmpty()) {
-          for (String category : checkSet) {
-            categoriesMap.put(category, false);
-          }
-          for (String category : categories) {
-            categoriesMap.put(category.toLowerCase(), true);
-          }
-        } else {
-          StringBuilder sb = new StringBuilder();
-          sb.append("Invalid Categories\n");
-
-          for (String category : userCategories) {
-            sb.append(category);
-            sb.append('\n');
-          }
-          return ResultBuilder.createErrorResultData().addLine(sb.toString());
-        }
-      }
-      /*
-       * General System metrics
-       */
-      // cluster, region, partition , diskstore, callback, eviction
-      if (categoriesMap.get("cluster")) {
-        writeToTableAndCsv(metricsTable, "cluster", "member count", 
regionMxBean.getMemberCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "region entry count",
-            regionMxBean.getSystemRegionEntryCount(), csvBuilder);
-      }
-
-      if (categoriesMap.get("region")) {
-        writeToTableAndCsv(metricsTable, "region", "lastModifiedTime",
-            regionMxBean.getLastModifiedTime(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "lastAccessedTime", 
regionMxBean.getLastAccessedTime(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "missCount", 
regionMxBean.getMissCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "hitCount", 
regionMxBean.getHitCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "hitRatio", 
regionMxBean.getHitRatio(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getsRate", 
regionMxBean.getGetsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putsRate", 
regionMxBean.getPutsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "createsRate", 
regionMxBean.getCreatesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "destroyRate", 
regionMxBean.getDestroyRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putAllRate", 
regionMxBean.getPutAllRate(),
-            csvBuilder);
-      }
-
-      if (categoriesMap.get("partition")) {
-        writeToTableAndCsv(metricsTable, "partition", "putLocalRate",
-            regionMxBean.getPutLocalRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRemoteRate", 
regionMxBean.getPutRemoteRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRemoteLatency", 
regionMxBean.getPutRemoteLatency(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRemoteAvgLatency",
-            regionMxBean.getPutRemoteAvgLatency(), csvBuilder);
-
-        writeToTableAndCsv(metricsTable, "", "bucketCount", 
regionMxBean.getBucketCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "primaryBucketCount",
-            regionMxBean.getPrimaryBucketCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "numBucketsWithoutRedundancy",
-            regionMxBean.getNumBucketsWithoutRedundancy(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalBucketSize", 
regionMxBean.getTotalBucketSize(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "averageBucketSize", 
regionMxBean.getAvgBucketSize(),
-            csvBuilder);
-      }
-      /*
-       * Disk store
-       */
-      if (categoriesMap.get("diskstore")) {
-        writeToTableAndCsv(metricsTable, "diskstore", "totalEntriesOnlyOnDisk",
-            regionMxBean.getTotalEntriesOnlyOnDisk(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskReadsRate", 
regionMxBean.getDiskReadsRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
regionMxBean.getDiskWritesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalDiskWriteInProgress",
-            regionMxBean.getTotalDiskWritesProgress(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskTaskWaiting", 
regionMxBean.getDiskTaskWaiting(),
-            csvBuilder);
-
-      }
-      /*
-       * LISTENER
-       */
-      if (categoriesMap.get("callback")) {
-        writeToTableAndCsv(metricsTable, "callback", 
"cacheWriterCallsAvgLatency",
-            regionMxBean.getCacheWriterCallsAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "cacheListenerCallsAvgLatency",
-            regionMxBean.getCacheListenerCallsAvgLatency(), csvBuilder);
-      }
-
-      /*
-       * Eviction
-       */
-      if (categoriesMap.get("eviction")) {
-        writeToTableAndCsv(metricsTable, "eviction", "lruEvictionRate",
-            regionMxBean.getLruEvictionRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "lruDestroyRate", 
regionMxBean.getLruDestroyRate(),
-            csvBuilder);
-      }
-
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        crd.addAsFile(export_to_report_to, csvBuilder != null ? 
csvBuilder.toString() : null,
-            "Aggregate Region Metrics exported to {0}.", false);
-      }
-
-      return crd;
-    } else {
+    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;
     }
+
+    CompositeResultData crd = ResultBuilder.createCompositeResultData();
+    CompositeResultData.SectionResultData section = crd.addSection();
+    TabularResultData metricsTable = section.addTable();
+    metricsTable.setHeader("Cluster-wide Region Metrics");
+
+    Set<Category> categoriesToDisplay = ArrayUtils.isNotEmpty(categoriesArr)
+        ? getCategorySet(categoriesArr) : new 
HashSet<>(SYSTEM_REGION_METRIC_CATEGORIES);
+
+    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);
+    }
+
+    return crd;
   }
 
   /**
@@ -774,8 +282,8 @@ public class ShowMetricsCommand implements GfshCommand {
    * @throws ResultDataException if building result fails
    */
   private ResultData getRegionMetricsFromMember(String regionName,
-      DistributedMember distributedMember, String export_to_report_to, 
String[] categoriesArr)
-      throws ResultDataException {
+      DistributedMember distributedMember, String export_to_report_to, 
String[] categoriesArr,
+      StringBuilder csvBuilder) throws ResultDataException {
 
     final InternalCache cache = getCache();
     final SystemManagementService managementService =
@@ -786,136 +294,7 @@ public class ShowMetricsCommand implements GfshCommand {
     RegionMXBean regionMxBean =
         managementService.getMBeanInstance(regionMBeanName, 
RegionMXBean.class);
 
-    if (regionMxBean != null) {
-      CompositeResultData crd = ResultBuilder.createCompositeResultData();
-      CompositeResultData.SectionResultData section = crd.addSection();
-      TabularResultData metricsTable = section.addTable();
-      metricsTable.setHeader("Metrics for region:" + regionName + " On Member "
-          + MBeanJMXAdapter.getMemberNameOrId(distributedMember));
-      StringBuilder csvBuilder = null;
-
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        csvBuilder = new StringBuilder();
-        csvBuilder.append("Category");
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__METRIC__HEADER);
-        csvBuilder.append(',');
-        csvBuilder.append(CliStrings.SHOW_METRICS__VALUE__HEADER);
-        csvBuilder.append('\n');
-      }
-
-      /*
-       * Region Metrics
-       */
-      Map<String, Boolean> categoriesMap = getRegionMetricsCategories();
-
-      if (categoriesArr != null && categoriesArr.length != 0) {
-        Set<String> categories = createSet(categoriesArr);
-        Set<String> checkSet = new HashSet<>(categoriesMap.keySet());
-        Set<String> userCategories = getSetDifference(categories, checkSet);
-
-        // Checking if the categories specified by the user are valid or not
-        if (userCategories.isEmpty()) {
-          for (String category : checkSet) {
-            categoriesMap.put(category, false);
-          }
-          for (String category : categories) {
-            categoriesMap.put(category.toLowerCase(), true);
-          }
-        } else {
-          StringBuilder sb = new StringBuilder();
-          sb.append("Invalid Categories\n");
-
-          for (String category : userCategories) {
-            sb.append(category);
-            sb.append('\n');
-          }
-          return ResultBuilder.createErrorResultData().addLine(sb.toString());
-        }
-      }
-
-      if (categoriesMap.get("region")) {
-        writeToTableAndCsv(metricsTable, "region", "lastModifiedTime",
-            regionMxBean.getLastModifiedTime(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "lastAccessedTime", 
regionMxBean.getLastAccessedTime(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "missCount", 
regionMxBean.getMissCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "hitCount", 
regionMxBean.getHitCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "hitRatio", 
regionMxBean.getHitRatio(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "getsRate", 
regionMxBean.getGetsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putsRate", 
regionMxBean.getPutsRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "createsRate", 
regionMxBean.getCreatesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "destroyRate", 
regionMxBean.getDestroyRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putAllRate", 
regionMxBean.getPutAllRate(),
-            csvBuilder);
-      }
-
-      if (categoriesMap.get("partition")) {
-        writeToTableAndCsv(metricsTable, "partition", "putLocalRate",
-            regionMxBean.getPutLocalRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRemoteRate", 
regionMxBean.getPutRemoteRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRemoteLatency", 
regionMxBean.getPutRemoteLatency(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "putRemoteAvgLatency",
-            regionMxBean.getPutRemoteAvgLatency(), csvBuilder);
-
-        writeToTableAndCsv(metricsTable, "", "bucketCount", 
regionMxBean.getBucketCount(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "primaryBucketCount",
-            regionMxBean.getPrimaryBucketCount(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "configuredRedundancy",
-            regionMxBean.getConfiguredRedundancy(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "actualRedundancy", 
regionMxBean.getActualRedundancy(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "numBucketsWithoutRedundancy",
-            regionMxBean.getNumBucketsWithoutRedundancy(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalBucketSize", 
regionMxBean.getTotalBucketSize(),
-            csvBuilder);
-      }
-      /*
-       * Disk store
-       */
-      if (categoriesMap.get("diskstore")) {
-        writeToTableAndCsv(metricsTable, "diskstore", "totalEntriesOnlyOnDisk",
-            regionMxBean.getTotalEntriesOnlyOnDisk(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "diskReadsRate", "" + 
regionMxBean.getDiskReadsRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
regionMxBean.getDiskWritesRate(),
-            csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "totalDiskWriteInProgress",
-            regionMxBean.getTotalDiskWritesProgress(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "diskTaskWaiting", 
regionMxBean.getDiskTaskWaiting(),
-            csvBuilder);
-      }
-      /*
-       * LISTENER
-       */
-      if (categoriesMap.get("callback")) {
-        writeToTableAndCsv(metricsTable, "callback", 
"cacheWriterCallsAvgLatency",
-            regionMxBean.getCacheWriterCallsAvgLatency(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "cacheListenerCallsAvgLatency",
-            regionMxBean.getCacheListenerCallsAvgLatency(), csvBuilder);
-      }
-
-      /*
-       * Eviction
-       */
-      if (categoriesMap.get("eviction")) {
-        writeToTableAndCsv(metricsTable, "eviction", "lruEvictionRate",
-            regionMxBean.getLruEvictionRate(), csvBuilder);
-        writeToTableAndCsv(metricsTable, "", "lruDestroyRate", 
regionMxBean.getLruDestroyRate(),
-            csvBuilder);
-      }
-      if (export_to_report_to != null && !export_to_report_to.isEmpty()) {
-        crd.addAsFile(export_to_report_to, csvBuilder != null ? 
csvBuilder.toString() : null,
-            "Region Metrics exported to {0}.", false);
-      }
-
-      return crd;
-    } else {
+    if (regionMxBean == null) {
       ErrorResultData erd = ResultBuilder.createErrorResultData();
       String errorMessage = CliStrings.format(CliStrings.SHOW_METRICS__ERROR,
           "Region MBean for " + regionName + " on member "
@@ -923,154 +302,469 @@ public class ShowMetricsCommand implements GfshCommand {
       erd.addLine(errorMessage);
       return erd;
     }
-  }
 
-  /***
-   * Writes an entry to a TabularResultData and writes a comma separated entry 
to a string builder
-   */
-  private void writeToTableAndCsv(TabularResultData metricsTable, String type, 
String metricName,
-      long metricValue, StringBuilder csvBuilder) {
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__TYPE__HEADER, type);
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__METRIC__HEADER, 
metricName);
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__VALUE__HEADER, 
metricValue);
+    CompositeResultData crd = ResultBuilder.createCompositeResultData();
+    CompositeResultData.SectionResultData section = crd.addSection();
+    TabularResultData metricsTable = section.addTable();
+    metricsTable.setHeader("Metrics for region:" + regionName + " On Member "
+        + MBeanJMXAdapter.getMemberNameOrId(distributedMember));
 
-    if (csvBuilder != null) {
-      csvBuilder.append(type);
-      csvBuilder.append(',');
-      csvBuilder.append(metricName);
-      csvBuilder.append(',');
-      csvBuilder.append(metricValue);
-      csvBuilder.append('\n');
+    Set<Category> categoriesToDisplay = ArrayUtils.isNotEmpty(categoriesArr)
+        ? getCategorySet(categoriesArr) : new 
HashSet<>(REGION_METRIC_CATEGORIES);
+
+    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);
     }
+
+    return crd;
   }
 
-  private void writeToTableAndCsv(TabularResultData metricsTable, String type, 
String metricName,
-      double metricValue, StringBuilder csvBuilder) {
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__TYPE__HEADER, type);
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__METRIC__HEADER, 
metricName);
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__VALUE__HEADER, 
metricValue);
+  private void writeSystemWideMetricValues(DistributedSystemMXBean dsMxBean,
+      StringBuilder csvBuilder, TabularResultData metricsTable, Set<Category> 
categoriesToDisplay) {
+    if (categoriesToDisplay.contains(Category.cluster)) {
+      writeToTableAndCsv(metricsTable, "cluster", "totalHeapSize", 
dsMxBean.getTotalHeapSize(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.cache)) {
+      writeToTableAndCsv(metricsTable, "cache", "totalRegionEntryCount",
+          dsMxBean.getTotalRegionEntryCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalRegionCount", 
dsMxBean.getTotalRegionCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalMissCount", 
dsMxBean.getTotalMissCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalHitCount", 
dsMxBean.getTotalHitCount(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.diskstore)) {
+      writeToTableAndCsv(metricsTable, "diskstore", "totalDiskUsage", 
dsMxBean.getTotalDiskUsage(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskReadsRate", 
dsMxBean.getDiskReadsRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
dsMxBean.getDiskWritesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "flushTimeAvgLatency", 
dsMxBean.getDiskFlushAvgLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalBackupInProgress",
+          dsMxBean.getTotalBackupInProgress(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.query)) {
+      writeToTableAndCsv(metricsTable, "query", "activeCQCount", 
dsMxBean.getActiveCQCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "queryRequestRate", 
dsMxBean.getQueryRequestRate(),
+          csvBuilder);
+    }
+  }
 
-    if (csvBuilder != null) {
-      csvBuilder.append(type);
-      csvBuilder.append(',');
-      csvBuilder.append(metricName);
-      csvBuilder.append(',');
-      csvBuilder.append(metricValue);
-      csvBuilder.append('\n');
+  private void writeMemberMetricValues(MemberMXBean memberMxBean, JVMMetrics 
jvmMetrics,
+      TabularResultData metricsTable, StringBuilder csvBuilder, Set<Category> 
categoriesToDisplay) {
+    if (categoriesToDisplay.contains(Category.member)) {
+      writeToTableAndCsv(metricsTable, "member", "upTime", 
memberMxBean.getMemberUpTime(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "cpuUsage", 
memberMxBean.getCpuUsage(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "currentHeapSize", 
memberMxBean.getCurrentHeapSize(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "maximumHeapSize", 
memberMxBean.getMaximumHeapSize(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.jvm)) {
+      writeToTableAndCsv(metricsTable, "jvm", "jvmThreads ", 
jvmMetrics.getTotalThreads(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "fileDescriptorLimit",
+          memberMxBean.getFileDescriptorLimit(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalFileDescriptorOpen",
+          memberMxBean.getTotalFileDescriptorOpen(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.region)) {
+      writeToTableAndCsv(metricsTable, "region", "totalRegionCount ",
+          memberMxBean.getTotalRegionCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "listOfRegions",
+          Arrays.stream(memberMxBean.listRegions()).map(s -> 
s.substring(1)).toArray(String[]::new),
+          csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "rootRegions", 
memberMxBean.getRootRegionNames(),
+          csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "totalRegionEntryCount",
+          memberMxBean.getTotalRegionEntryCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalBucketCount", 
memberMxBean.getTotalBucketCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalPrimaryBucketCount",
+          memberMxBean.getTotalPrimaryBucketCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getsAvgLatency", 
memberMxBean.getGetsAvgLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putsAvgLatency", 
memberMxBean.getPutsAvgLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "createsRate", 
memberMxBean.getCreatesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "destroyRate", 
memberMxBean.getDestroysRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putAllAvgLatency", 
memberMxBean.getPutAllAvgLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalMissCount", 
memberMxBean.getTotalMissCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalHitCount", 
memberMxBean.getTotalHitCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getsRate", 
memberMxBean.getGetsRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putsRate", 
memberMxBean.getPutsRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "cacheWriterCallsAvgLatency",
+          memberMxBean.getCacheWriterCallsAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "cacheListenerCallsAvgLatency",
+          memberMxBean.getCacheListenerCallsAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalLoadsCompleted",
+          memberMxBean.getTotalLoadsCompleted(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.serialization)) {
+      writeToTableAndCsv(metricsTable, "serialization", "serializationRate",
+          memberMxBean.getSerializationRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "serializationLatency",
+          memberMxBean.getSerializationRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "deserializationRate",
+          memberMxBean.getDeserializationRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "deserializationLatency",
+          memberMxBean.getDeserializationLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "deserializationAvgLatency",
+          memberMxBean.getDeserializationAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "PDXDeserializationAvgLatency",
+          memberMxBean.getPDXDeserializationAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "PDXDeserializationRate",
+          memberMxBean.getPDXDeserializationRate(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.communication)) {
+      writeToTableAndCsv(metricsTable, "communication", "bytesSentRate",
+          memberMxBean.getBytesSentRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "bytesReceivedRate", 
memberMxBean.getBytesReceivedRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "connectedGatewayReceivers",
+          memberMxBean.listConnectedGatewayReceivers(), csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "connectedGatewaySenders",
+          memberMxBean.listConnectedGatewaySenders(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.function)) {
+      writeToTableAndCsv(metricsTable, "function", "numRunningFunctions",
+          memberMxBean.getNumRunningFunctions(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "functionExecutionRate",
+          memberMxBean.getFunctionExecutionRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "numRunningFunctionsHavingResults",
+          memberMxBean.getNumRunningFunctionsHavingResults(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.transaction)) {
+      writeToTableAndCsv(metricsTable, "transaction", "totalTransactionsCount",
+          memberMxBean.getTotalTransactionsCount(), csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "transactionCommitsAvgLatency",
+          memberMxBean.getTransactionCommitsAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "transactionCommittedTotalCount",
+          memberMxBean.getTransactionCommittedTotalCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "transactionRolledBackTotalCount",
+          memberMxBean.getTransactionRolledBackTotalCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "transactionCommitsRate",
+          memberMxBean.getTransactionCommitsRate(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.diskstore)) {
+      writeToTableAndCsv(metricsTable, "diskstore", "totalDiskUsage",
+          memberMxBean.getTotalDiskUsage(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskReadsRate", 
memberMxBean.getDiskReadsRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
memberMxBean.getDiskWritesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "flushTimeAvgLatency",
+          memberMxBean.getDiskFlushAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalQueueSize",
+          memberMxBean.getTotalDiskTasksWaiting(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalBackupInProgress",
+          memberMxBean.getTotalBackupInProgress(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.lock)) {
+      writeToTableAndCsv(metricsTable, "lock", "lockWaitsInProgress",
+          memberMxBean.getLockWaitsInProgress(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalLockWaitTime", 
memberMxBean.getTotalLockWaitTime(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalNumberOfLockService",
+          memberMxBean.getTotalNumberOfLockService(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "requestQueues", 
memberMxBean.getLockRequestQueues(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.eviction)) {
+      writeToTableAndCsv(metricsTable, "eviction", "lruEvictionRate",
+          memberMxBean.getLruEvictionRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "lruDestroyRate", 
memberMxBean.getLruDestroyRate(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.distribution)) {
+      writeToTableAndCsv(metricsTable, "distribution", 
"getInitialImagesInProgress",
+          memberMxBean.getInitialImagesInProgress(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getInitialImageTime",
+          memberMxBean.getInitialImageTime(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getInitialImageKeysReceived",
+          memberMxBean.getInitialImageKeysReceived(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.offheap)) {
+      writeToTableAndCsv(metricsTable, "offheap", "maxMemory", 
memberMxBean.getOffHeapMaxMemory(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "freeMemory", 
memberMxBean.getOffHeapFreeMemory(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "usedMemory", 
memberMxBean.getOffHeapUsedMemory(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "objects", 
memberMxBean.getOffHeapObjects(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "fragmentation", 
memberMxBean.getOffHeapFragmentation(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "compactionTime",
+          memberMxBean.getOffHeapCompactionTime(), csvBuilder);
     }
   }
 
-  private Set<String> createSet(String[] categories) {
-    Set<String> categoriesSet = new HashSet<>();
-    Collections.addAll(categoriesSet, categories);
-    return categoriesSet;
+  private void writeCacheServerMetricValues(CacheServerMXBean csMxBean,
+      TabularResultData metricsTable, StringBuilder csvBuilder, Set<Category> 
categoriesToDisplay) {
+    if (categoriesToDisplay.contains(Category.cacheserver)) {
+
+      writeToTableAndCsv(metricsTable, "cacheserver", "clientConnectionCount",
+          csMxBean.getClientConnectionCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "hostnameForClients", 
csMxBean.getHostNameForClients(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getRequestAvgLatency",
+          csMxBean.getGetRequestAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRequestAvgLatency",
+          csMxBean.getPutRequestAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalConnectionsTimedOut",
+          csMxBean.getTotalConnectionsTimedOut(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "threadQueueSize", 
csMxBean.getPutRequestAvgLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "connectionThreads", 
csMxBean.getConnectionThreads(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "connectionLoad", 
csMxBean.getConnectionLoad(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "loadPerConnection", 
csMxBean.getLoadPerConnection(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "queueLoad", 
csMxBean.getQueueLoad(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "loadPerQueue", 
csMxBean.getLoadPerQueue(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getRequestRate", 
csMxBean.getGetRequestRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRequestRate", 
csMxBean.getPutRequestRate(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.notification)) {
+      writeToTableAndCsv(metricsTable, "notification", 
"numClientNotificationRequests",
+          csMxBean.getNumClientNotificationRequests(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "clientNotificationRate",
+          csMxBean.getClientNotificationRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "clientNotificationAvgLatency",
+          csMxBean.getClientNotificationAvgLatency(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.query)) {
+      writeToTableAndCsv(metricsTable, "query", "activeCQCount", 
csMxBean.getActiveCQCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "queryRequestRate", 
csMxBean.getQueryRequestRate(),
+          csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "indexCount", 
csMxBean.getIndexCount(), csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "index list", 
csMxBean.getIndexList(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalIndexMaintenanceTime",
+          csMxBean.getTotalIndexMaintenanceTime(), csvBuilder);
+    }
   }
 
-  private Set<String> getSetDifference(Set<String> set1, Set<String> set2) {
-    Set<String> setDifference = new HashSet<>();
-    for (String element : set1) {
-      if (!(set2.contains(element.toLowerCase()))) {
-        setDifference.add(element);
-      }
+  private void writeSystemRegionMetricValues(DistributedRegionMXBean 
regionMxBean,
+      TabularResultData metricsTable, StringBuilder csvBuilder, Set<Category> 
categoriesToDisplay) {
+    if (categoriesToDisplay.contains(Category.cluster)) {
+      writeToTableAndCsv(metricsTable, "cluster", "member count", 
regionMxBean.getMemberCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "region entry count",
+          regionMxBean.getSystemRegionEntryCount(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.region)) {
+      writeToTableAndCsv(metricsTable, "region", "lastModifiedTime",
+          regionMxBean.getLastModifiedTime(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "lastAccessedTime", 
regionMxBean.getLastAccessedTime(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "missCount", 
regionMxBean.getMissCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "hitCount", 
regionMxBean.getHitCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "hitRatio", 
regionMxBean.getHitRatio(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getsRate", 
regionMxBean.getGetsRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putsRate", 
regionMxBean.getPutsRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "createsRate", 
regionMxBean.getCreatesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "destroyRate", 
regionMxBean.getDestroyRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putAllRate", 
regionMxBean.getPutAllRate(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.partition)) {
+      writeToTableAndCsv(metricsTable, "partition", "putLocalRate", 
regionMxBean.getPutLocalRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRemoteRate", 
regionMxBean.getPutRemoteRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRemoteLatency", 
regionMxBean.getPutRemoteLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRemoteAvgLatency",
+          regionMxBean.getPutRemoteAvgLatency(), csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "bucketCount", 
regionMxBean.getBucketCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "primaryBucketCount",
+          regionMxBean.getPrimaryBucketCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "numBucketsWithoutRedundancy",
+          regionMxBean.getNumBucketsWithoutRedundancy(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalBucketSize", 
regionMxBean.getTotalBucketSize(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "averageBucketSize", 
regionMxBean.getAvgBucketSize(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.diskstore)) {
+      writeToTableAndCsv(metricsTable, "diskstore", "totalEntriesOnlyOnDisk",
+          regionMxBean.getTotalEntriesOnlyOnDisk(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskReadsRate", 
regionMxBean.getDiskReadsRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
regionMxBean.getDiskWritesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalDiskWriteInProgress",
+          regionMxBean.getTotalDiskWritesProgress(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskTaskWaiting", 
regionMxBean.getDiskTaskWaiting(),
+          csvBuilder);
+
+    }
+    if (categoriesToDisplay.contains(Category.callback)) {
+      writeToTableAndCsv(metricsTable, "callback", 
"cacheWriterCallsAvgLatency",
+          regionMxBean.getCacheWriterCallsAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "cacheListenerCallsAvgLatency",
+          regionMxBean.getCacheListenerCallsAvgLatency(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.eviction)) {
+      writeToTableAndCsv(metricsTable, "eviction", "lruEvictionRate",
+          regionMxBean.getLruEvictionRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "lruDestroyRate", 
regionMxBean.getLruDestroyRate(),
+          csvBuilder);
     }
-    return setDifference;
   }
 
-  private void writeToTableAndCsv(TabularResultData metricsTable, String 
metricName,
-      String[] metricValue, StringBuilder csvBuilder) {
-    if (metricValue != null) {
-      for (int i = 0; i < metricValue.length; i++) {
-        if (i == 0) {
-          writeToTableAndCsv(metricsTable, metricName, metricValue[i], 
csvBuilder);
-        } else {
-          writeToTableAndCsv(metricsTable, "", metricValue[i], csvBuilder);
-        }
-      }
+  private void writeRegionMetricValues(RegionMXBean regionMxBean, 
TabularResultData metricsTable,
+      StringBuilder csvBuilder, Set<Category> categoriesToDisplay) {
+    if (categoriesToDisplay.contains(Category.region)) {
+      writeToTableAndCsv(metricsTable, "region", "lastModifiedTime",
+          regionMxBean.getLastModifiedTime(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "lastAccessedTime", 
regionMxBean.getLastAccessedTime(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "missCount", 
regionMxBean.getMissCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "hitCount", 
regionMxBean.getHitCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "hitRatio", 
regionMxBean.getHitRatio(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "getsRate", 
regionMxBean.getGetsRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putsRate", 
regionMxBean.getPutsRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "createsRate", 
regionMxBean.getCreatesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "destroyRate", 
regionMxBean.getDestroyRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putAllRate", 
regionMxBean.getPutAllRate(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.partition)) {
+      writeToTableAndCsv(metricsTable, "partition", "putLocalRate", 
regionMxBean.getPutLocalRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRemoteRate", 
regionMxBean.getPutRemoteRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRemoteLatency", 
regionMxBean.getPutRemoteLatency(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "putRemoteAvgLatency",
+          regionMxBean.getPutRemoteAvgLatency(), csvBuilder);
+
+      writeToTableAndCsv(metricsTable, "", "bucketCount", 
regionMxBean.getBucketCount(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "primaryBucketCount",
+          regionMxBean.getPrimaryBucketCount(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "configuredRedundancy",
+          regionMxBean.getConfiguredRedundancy(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "actualRedundancy", 
regionMxBean.getActualRedundancy(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "numBucketsWithoutRedundancy",
+          regionMxBean.getNumBucketsWithoutRedundancy(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalBucketSize", 
regionMxBean.getTotalBucketSize(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.diskstore)) {
+      writeToTableAndCsv(metricsTable, "diskstore", "totalEntriesOnlyOnDisk",
+          regionMxBean.getTotalEntriesOnlyOnDisk(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskReadsRate", "" + 
regionMxBean.getDiskReadsRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskWritesRate", 
regionMxBean.getDiskWritesRate(),
+          csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "totalDiskWriteInProgress",
+          regionMxBean.getTotalDiskWritesProgress(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "diskTaskWaiting", 
regionMxBean.getDiskTaskWaiting(),
+          csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.callback)) {
+      writeToTableAndCsv(metricsTable, "callback", 
"cacheWriterCallsAvgLatency",
+          regionMxBean.getCacheWriterCallsAvgLatency(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "cacheListenerCallsAvgLatency",
+          regionMxBean.getCacheListenerCallsAvgLatency(), csvBuilder);
+    }
+    if (categoriesToDisplay.contains(Category.eviction)) {
+      writeToTableAndCsv(metricsTable, "eviction", "lruEvictionRate",
+          regionMxBean.getLruEvictionRate(), csvBuilder);
+      writeToTableAndCsv(metricsTable, "", "lruDestroyRate", 
regionMxBean.getLruDestroyRate(),
+          csvBuilder);
     }
   }
 
-  /**
-   * Writes to a TabularResultData and also appends a CSV string to a String 
builder
-   */
-  private void writeToTableAndCsv(TabularResultData metricsTable, String 
metricName,
+  private void writeToTableAndCsv(TabularResultData metricsTable, String type, 
String metricName,
       String metricValue, StringBuilder csvBuilder) {
-    metricsTable.accumulate(CliStrings.SHOW_METRICS__TYPE__HEADER, "");
+    metricsTable.accumulate(CliStrings.SHOW_METRICS__TYPE__HEADER, type);
     metricsTable.accumulate(CliStrings.SHOW_METRICS__METRIC__HEADER, 
metricName);
     metricsTable.accumulate(CliStrings.SHOW_METRICS__VALUE__HEADER, 
metricValue);
 
-    if (csvBuilder != null) {
-      csvBuilder.append("");
-      csvBuilder.append(',');
-      csvBuilder.append(metricName);
-      csvBuilder.append(',');
-      csvBuilder.append(metricValue);
-      csvBuilder.append('\n');
+    writeToCsvIfNecessary(type, metricName, String.valueOf(metricValue), 
csvBuilder);
+  }
+
+  private void writeToTableAndCsv(TabularResultData metricsTable, String type, 
String metricName,
+      String[] metricValue, StringBuilder csvBuilder) {
+    if (ArrayUtils.isEmpty(metricValue)) {
+      return;
+    }
+
+    for (int i = 0; i < metricValue.length; i++) {
+      if (i == 0) {
+        writeToTableAndCsv(metricsTable, type, metricName, metricValue[i], 
csvBuilder);
+      } else {
+        writeToTableAndCsv(metricsTable, "", "", metricValue[i], csvBuilder);
+      }
     }
   }
 
-  /**
-   * Defines and returns map of categories for Region Metrics
-   *
-   * @return map with categories for region metrics and display flag set to 
true
-   */
-  private Map<String, Boolean> getRegionMetricsCategories() {
-    Map<String, Boolean> categories = new HashMap<>();
-
-    categories.put("region", true);
-    categories.put("partition", true);
-    categories.put("diskstore", true);
-    categories.put("callback", true);
-    categories.put("gatewayreceiver", true);
-    categories.put("distribution", true);
-    categories.put("query", true);
-    categories.put("eviction", true);
-    return categories;
+  private void writeToTableAndCsv(TabularResultData metricsTable, String type, 
String metricName,
+      long metricValue, StringBuilder csvBuilder) {
+    writeToTableAndCsv(metricsTable, type, metricName, 
String.valueOf(metricValue), csvBuilder);
   }
 
-  /**
-   * Defines and returns map of categories for System metrics.
-   *
-   * @return map with categories for system metrics and display flag set to 
true
-   */
-  private Map<String, Boolean> getSystemMetricsCategories() {
-    Map<String, Boolean> categories = new HashMap<>();
-    categories.put("cluster", true);
-    categories.put("cache", true);
-    categories.put("diskstore", true);
-    categories.put("query", true);
-    return categories;
+  private void writeToTableAndCsv(TabularResultData metricsTable, String type, 
String metricName,
+      double metricValue, StringBuilder csvBuilder) {
+    writeToTableAndCsv(metricsTable, type, metricName, 
String.valueOf(metricValue), csvBuilder);
   }
 
-  /**
-   * Defines and returns map of categories for system-wide region metrics
-   *
-   * @return map with categories for system wide region metrics and display 
flag set to true
-   */
-  private Map<String, Boolean> getSystemRegionMetricsCategories() {
-    Map<String, Boolean> categories = getRegionMetricsCategories();
-    categories.put("cluster", true);
-    return categories;
+  private StringBuilder prepareCsvBuilder() {
+    StringBuilder csvBuilder = new StringBuilder();
+    csvBuilder.append(CliStrings.SHOW_METRICS__TYPE__HEADER);
+    csvBuilder.append(',');
+    csvBuilder.append(CliStrings.SHOW_METRICS__METRIC__HEADER);
+    csvBuilder.append(',');
+    csvBuilder.append(CliStrings.SHOW_METRICS__VALUE__HEADER);
+    csvBuilder.append('\n');
+    return csvBuilder;
   }
 
-  /**
-   * Defines and returns map of categories for member metrics
-   *
-   * @return map with categories for member metrics and display flag set to 
true
-   */
-  private Map<String, Boolean> getMemberMetricsCategories() {
-    Map<String, Boolean> categories = new HashMap<>();
-    categories.put("member", true);
-    categories.put("jvm", true);
-    categories.put("region", true);
-    categories.put("serialization", true);
-    categories.put("communication", true);
-    categories.put("function", true);
-    categories.put("transaction", true);
-    categories.put("diskstore", true);
-    categories.put("lock", true);
-    categories.put("eviction", true);
-    categories.put("distribution", true);
-    categories.put("offheap", true);
-    return categories;
+  private void writeToCsvIfNecessary(String type, String metricName, String 
metricValue,
+      StringBuilder csvBuilder) {
+    if (csvBuilder != null) {
+      csvBuilder.append(type);
+      csvBuilder.append(',');
+      csvBuilder.append(metricName);
+      csvBuilder.append(',');
+      csvBuilder.append(metricValue);
+      csvBuilder.append('\n');
+    }
+  }
+
+  private Set<Category> getCategorySet(String[] categories) {
+    return 
Stream.of(categories).map(String::toLowerCase).map(Category::valueOf)
+        .collect(Collectors.toSet());
   }
 }
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
new file mode 100644
index 0000000..97a49a5
--- /dev/null
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ShowMetricsInterceptor.java
@@ -0,0 +1,107 @@
+/*
+ * 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.geode.management.internal.cli.commands;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang.StringUtils;
+
+import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.internal.cli.AbstractCliAroundInterceptor;
+import org.apache.geode.management.internal.cli.GfshParseResult;
+import 
org.apache.geode.management.internal.cli.commands.ShowMetricsCommand.Category;
+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;
+
+public class ShowMetricsInterceptor extends AbstractCliAroundInterceptor {
+  @Override
+  public Result preExecution(GfshParseResult parseResult) {
+    String export_to_report_to = 
parseResult.getParamValueAsString(CliStrings.SHOW_METRICS__FILE);
+    if (export_to_report_to != null && !export_to_report_to.endsWith(".csv")) {
+      return ResultBuilder
+          
.createUserErrorResult(CliStrings.format(CliStrings.INVALID_FILE_EXTENSION, 
".csv"));
+    }
+
+    String regionName = 
parseResult.getParamValueAsString(CliStrings.SHOW_METRICS__REGION);
+    String port = 
parseResult.getParamValueAsString(CliStrings.SHOW_METRICS__CACHESERVER__PORT);
+    String member = parseResult.getParamValueAsString(CliStrings.MEMBER);
+    String[] categoryArgs = (String[]) 
parseResult.getParamValue(CliStrings.SHOW_METRICS__CATEGORY);
+
+    if (regionName != null && port != null) {
+      return ResultBuilder.createUserErrorResult(
+          CliStrings.SHOW_METRICS__CANNOT__USE__REGION__WITH__CACHESERVERPORT);
+    }
+
+    if (port != null && member == null) {
+      return ResultBuilder
+          
.createUserErrorResult(CliStrings.SHOW_METRICS__CANNOT__USE__CACHESERVERPORT);
+    }
+
+    if (categoryArgs != null) {
+      boolean regionProvided = regionName != null;
+      boolean portProvided = port != null;
+      boolean memberProvided = member != null;
+      List<String> validCategories =
+          getValidCategoriesAsStrings(regionProvided, memberProvided, 
portProvided);
+      Set<String> userCategories = new HashSet<>(Arrays.asList(categoryArgs));
+      userCategories.removeAll(validCategories);
+      if (!userCategories.isEmpty()) {
+        return getInvalidCategoryResult(userCategories);
+      }
+    }
+
+    return ResultBuilder.createInfoResult("OK");
+  }
+
+  static List<Category> getValidCategories(boolean regionProvided, boolean 
memberProvided,
+      boolean portProvided) {
+    if (regionProvided && memberProvided) {
+      return ShowMetricsCommand.REGION_METRIC_CATEGORIES;
+    }
+    if (regionProvided) {
+      return ShowMetricsCommand.SYSTEM_REGION_METRIC_CATEGORIES;
+    }
+    if (memberProvided && portProvided) {
+      return ShowMetricsCommand.MEMBER_WITH_PORT_METRIC_CATEGORIES;
+    }
+    if (memberProvided) {
+      return ShowMetricsCommand.MEMBER_METRIC_CATEGORIES;
+    }
+    return ShowMetricsCommand.SYSTEM_METRIC_CATEGORIES;
+  }
+
+  static List<String> getValidCategoriesAsStrings(boolean regionProvided, 
boolean memberProvided,
+      boolean portProvided) {
+
+    return getValidCategories(regionProvided, memberProvided, 
portProvided).stream().map(Enum::name)
+        .collect(Collectors.toList());
+  }
+
+
+  private CommandResult getInvalidCategoryResult(Set<String> 
invalidCategories) {
+    StringBuilder sb = new StringBuilder();
+    sb.append("Invalid Categories\n");
+    for (String category : invalidCategories) {
+      sb.append(category);
+      sb.append('\n');
+    }
+    return ResultBuilder.createUserErrorResult(sb.toString());
+  }
+}
diff --git 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
index 69dfc31..0e27fba 100644
--- 
a/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
+++ 
b/geode-core/src/main/java/org/apache/geode/management/internal/cli/i18n/CliStrings.java
@@ -2033,9 +2033,10 @@ public class CliStrings {
   public static final String SHOW_METRICS__CATEGORY__HELP =
       "Categories available based upon the parameters specified are:\n"
           + "- no parameters specified: cluster, cache, diskstore, query\n"
-          + "- region specified: cluster, region, partition, diskstore, 
callback, eviction\n"
-          + "- member specified: member, jvm, region, serialization, 
communication, function, transaction, diskstore, lock, eviction, distribution, 
offheap\n"
-          + "- member and region specified: region, partition, diskstore, 
callback, eviction";
+          + "- region specified: callback, cluster, diskstore, eviction, 
partition, region\n"
+          + "- member specified: communication, diskstore, distribution, 
eviction, function, jvm, lock, member, offheap, region, serialization, 
transaction\n"
+          + "- member and port specified: cacheserver, communication, 
diskstore, distribution, eviction, function, jvm, lock, member, notification, 
offheap, query, region, serialization, transaction\n"
+          + "- member and region specified: callback, diskstore, eviction, 
partition, region";
   public static final String SHOW_METRICS__FILE = "file";
   public static final String SHOW_METRICS__FILE__HELP =
       "Name of the file to which metrics will be written.";
diff --git 
a/geode-core/src/test/java/org/apache/geode/internal/cache/ha/Bug48571DUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/internal/cache/ha/Bug48571DUnitTest.java
index 2d15649..65110ff 100644
--- 
a/geode-core/src/test/java/org/apache/geode/internal/cache/ha/Bug48571DUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/internal/cache/ha/Bug48571DUnitTest.java
@@ -82,11 +82,11 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
   @Override
   public final void preTearDown() throws Exception {
     reset();
-    server.invoke(() -> Bug48571DUnitTest.reset());
-    client.invoke(() -> Bug48571DUnitTest.reset());
+    server.invoke(Bug48571DUnitTest::reset);
+    client.invoke(Bug48571DUnitTest::reset);
   }
 
-  public static void reset() throws Exception {
+  private static void reset() {
     lastKeyReceived = false;
     numOfCreates = 0;
     numOfUpdates = 0;
@@ -97,49 +97,47 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
     }
   }
 
-  private static void verifyProxyHasBeenPaused() {
-    Awaitility.await().atMost(60, TimeUnit.SECONDS).until(() -> {
-      CacheClientNotifier ccn = CacheClientNotifier.getInstance();
-      Collection<CacheClientProxy> ccProxies = ccn.getClientProxies();
-      boolean pausedFlag = false;
-      Iterator<CacheClientProxy> itr = ccProxies.iterator();
-
-      while (itr.hasNext()) {
-        CacheClientProxy ccp = itr.next();
-        System.out.println("proxy status " + ccp.getState());
-        if (ccp.isPaused()) {
-          pausedFlag = true;
-          break;
-        }
-      }
-      assertEquals("Proxy has not been paused in 1 minute", true, pausedFlag);
-    });
-  }
-
   @Test
   public void testStatsMatchWithSize() throws Exception {
     IgnoredException.addIgnoredException("Unexpected IOException||Connection 
reset");
     // start a server
-    int port = (Integer) server.invoke(() -> 
Bug48571DUnitTest.createServerCache());
+    int port = server.invoke(Bug48571DUnitTest::createServerCache);
     // create durable client, with durable RI
     client.invoke(() -> Bug48571DUnitTest.createClientCache(client.getHost(), 
port));
     // do puts on server from three different threads, pause after 500 puts 
each.
-    server.invoke(() -> Bug48571DUnitTest.doPuts());
+    server.invoke(Bug48571DUnitTest::doPuts);
     // close durable client
-    client.invoke(() -> Bug48571DUnitTest.closeClientCache());
+    client.invoke(Bug48571DUnitTest::closeClientCache);
 
-    server.invoke("verifyProxyHasBeenPaused", () -> 
verifyProxyHasBeenPaused());
+    server.invoke("verifyProxyHasBeenPaused", 
Bug48571DUnitTest::verifyProxyHasBeenPaused);
     // resume puts on server, add another 100.
-    server.invoke(() -> Bug48571DUnitTest.resumePuts());
+    server.invoke(Bug48571DUnitTest::resumePuts);
     // start durable client
     client.invoke(() -> Bug48571DUnitTest.createClientCache(client.getHost(), 
port));
     // wait for full queue dispatch
-    client.invoke(() -> Bug48571DUnitTest.waitForLastKey());
+    client.invoke(Bug48571DUnitTest::waitForLastKey);
     // verify the stats
-    server.invoke(() -> Bug48571DUnitTest.verifyStats());
+    server.invoke(Bug48571DUnitTest::verifyStats);
   }
 
-  public static int createServerCache() throws Exception {
+  private static void verifyProxyHasBeenPaused() {
+    Awaitility.await().atMost(60, TimeUnit.SECONDS).until(() -> {
+      CacheClientNotifier ccn = CacheClientNotifier.getInstance();
+      Collection<CacheClientProxy> ccProxies = ccn.getClientProxies();
+      boolean pausedFlag = false;
+
+      for (CacheClientProxy ccp : ccProxies) {
+        System.out.println("proxy status " + ccp.getState());
+        if (ccp.isPaused()) {
+          pausedFlag = true;
+          break;
+        }
+      }
+      assertEquals("Proxy has not been paused in 1 minute", true, pausedFlag);
+    });
+  }
+
+  private static int createServerCache() throws Exception {
     Properties props = new Properties();
     props.setProperty(LOCATORS, "localhost[" + 
DistributedTestUtils.getDUnitLocatorPort() + "]");
     props.setProperty(LOG_FILE, "server_" + OSProcess.getId() + ".log");
@@ -163,11 +161,11 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
     return server1.getPort();
   }
 
-  public static void closeClientCache() throws Exception {
+  private static void closeClientCache() {
     cache.close(true);
   }
 
-  public static void createClientCache(Host host, Integer port) throws 
Exception {
+  private static void createClientCache(Host host, Integer port) {
 
     Properties props = new Properties();
     props.setProperty(MCAST_PORT, "0");
@@ -203,7 +201,7 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
       }
 
       public void afterCreate(EntryEvent<String, String> event) {
-        if (((String) event.getKey()).equals("last_key")) {
+        if (event.getKey().equals("last_key")) {
           lastKeyReceived = true;
         }
         cache.getLoggerI18n().fine("Create Event: " + event.getKey() + ", " + 
event.getNewValue());
@@ -221,27 +219,21 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
     cache.readyForEvents();
   }
 
-  public static void doPuts() throws Exception {
+  private static void doPuts() throws Exception {
     final Region<String, String> r = cache.getRegion(region);
-    Thread t1 = new Thread(new Runnable() {
-      public void run() {
-        for (int i = 0; i < 500; i++) {
-          r.put("T1_KEY_" + i, "VALUE_" + i);
-        }
+    Thread t1 = new Thread(() -> {
+      for (int i = 0; i < 500; i++) {
+        r.put("T1_KEY_" + i, "VALUE_" + i);
       }
     });
-    Thread t2 = new Thread(new Runnable() {
-      public void run() {
-        for (int i = 0; i < 500; i++) {
-          r.put("T2_KEY_" + i, "VALUE_" + i);
-        }
+    Thread t2 = new Thread(() -> {
+      for (int i = 0; i < 500; i++) {
+        r.put("T2_KEY_" + i, "VALUE_" + i);
       }
     });
-    Thread t3 = new Thread(new Runnable() {
-      public void run() {
-        for (int i = 0; i < 500; i++) {
-          r.put("T3_KEY_" + i, "VALUE_" + i);
-        }
+    Thread t3 = new Thread(() -> {
+      for (int i = 0; i < 500; i++) {
+        r.put("T3_KEY_" + i, "VALUE_" + i);
       }
     });
 
@@ -254,7 +246,7 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
     t3.join();
   }
 
-  public static void resumePuts() {
+  private static void resumePuts() {
     Region<String, String> r = cache.getRegion(region);
     for (int i = 0; i < 100; i++) {
       r.put("NEWKEY_" + i, "NEWVALUE_" + i);
@@ -262,7 +254,7 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
     r.put("last_key", "last_value");
   }
 
-  public static void waitForLastKey() {
+  private static void waitForLastKey() {
     WaitCriterion wc = new WaitCriterion() {
       @Override
       public boolean done() {
@@ -277,7 +269,7 @@ public class Bug48571DUnitTest extends 
JUnit4DistributedTestCase {
     Wait.waitForCriterion(wc, 60 * 1000, 500, true);
   }
 
-  public static void verifyStats() throws Exception {
+  private static void verifyStats() {
     Awaitility.await().atMost(60, TimeUnit.SECONDS).until(() -> {
       CacheClientNotifier ccn = CacheClientNotifier.getInstance();
       CacheClientProxy ccp = ccn.getClientProxies().iterator().next();
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommandIntegrationTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommandIntegrationTest.java
new file mode 100644
index 0000000..f17c681
--- /dev/null
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommandIntegrationTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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.geode.management.internal.cli.commands;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.logging.log4j.Logger;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.cache.RegionShortcut;
+import org.apache.geode.internal.logging.LogService;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+import org.apache.geode.test.junit.rules.GfshShellConnectionRule;
+import org.apache.geode.test.junit.rules.GfshShellConnectionRule.PortType;
+import org.apache.geode.test.junit.rules.ServerStarterRule;
+
+@Category(IntegrationTest.class)
+public class ShowMetricsCommandIntegrationTest {
+  private static final Logger logger = LogService.getLogger();
+  private static final String REGION_NAME = "test-region";
+  private static final String MEMBER_NAME = "testServer";
+
+  @ClassRule
+  public static ServerStarterRule server =
+      new ServerStarterRule().withRegion(RegionShortcut.REPLICATE, REGION_NAME)
+          
.withName(MEMBER_NAME).withJMXManager().withEmbeddedLocator().withAutoStart();
+
+  @Rule
+  public GfshShellConnectionRule gfsh = new GfshShellConnectionRule();
+
+  @Test
+  public void everyCategoryHasAUseCase() throws Exception {
+    Set<ShowMetricsCommand.Category> categoriesUsed = new HashSet<>();
+    categoriesUsed.addAll(ShowMetricsCommand.REGION_METRIC_CATEGORIES);
+    categoriesUsed.addAll(ShowMetricsCommand.MEMBER_METRIC_CATEGORIES);
+    
categoriesUsed.addAll(ShowMetricsCommand.MEMBER_WITH_PORT_METRIC_CATEGORIES);
+    categoriesUsed.addAll(ShowMetricsCommand.SYSTEM_METRIC_CATEGORIES);
+    categoriesUsed.addAll(ShowMetricsCommand.SYSTEM_REGION_METRIC_CATEGORIES);
+
+    Set<ShowMetricsCommand.Category> categoriesSpecified =
+        
Arrays.stream(ShowMetricsCommand.Category.values()).collect(Collectors.toSet());
+
+    assertThat(categoriesSpecified)
+        .containsExactlyInAnyOrder(categoriesUsed.toArray(new 
ShowMetricsCommand.Category[0]));
+  }
+
+  @Test
+  public void commandFailsWhenNotConnected() throws Exception {
+    gfsh.executeAndAssertThat("show metrics")
+        .containsOutput("was found but is not currently available");
+  }
+
+  @Test
+  public void getRegionMetricsShowsExactlyDefaultCategories() throws Exception 
{
+    // Use --region and --member to get RegionMetricsFromMember
+    String cmd = "show metrics --region=/" + REGION_NAME + " --member=" + 
MEMBER_NAME;
+    List<String> expectedCategories =
+        ShowMetricsInterceptor.getValidCategoriesAsStrings(true, true, false);
+    // Blank lines are permitted for grouping.
+    expectedCategories.add("");
+    logger.info("Expecting categories: " + String.join(", ", 
expectedCategories));
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).tableHasColumnOnlyWithValues("Category",
+        expectedCategories.toArray(new String[0]));
+  }
+
+  @Test
+  public void getSystemRegionMetricsShowsExactlyDefaultCategories() throws 
Exception {
+    // Use --region alone to get SystemRegionMetrics
+    String cmd = "show metrics --region=/" + REGION_NAME;
+    List<String> expectedCategories =
+        ShowMetricsInterceptor.getValidCategoriesAsStrings(true, false, false);
+    // Blank lines are permitted for grouping.
+    expectedCategories.add("");
+    logger.info("Expecting categories: " + String.join(", ", 
expectedCategories));
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).tableHasColumnOnlyWithValues("Category",
+        expectedCategories.toArray(new String[0]));
+  }
+
+  @Test
+  public void getMemberMetricsShowsExactlyDefaultCategories() throws Exception 
{
+    // Use --member to get member metrics
+    String cmd = "show metrics --member=" + MEMBER_NAME;
+    List<String> expectedCategories =
+        ShowMetricsInterceptor.getValidCategoriesAsStrings(false, true, false);
+    // Blank lines are permitted for grouping.
+    expectedCategories.add("");
+    logger.info("Expecting categories: " + String.join(", ", 
expectedCategories));
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).tableHasColumnOnlyWithValues("Category",
+        expectedCategories.toArray(new String[0]));
+  }
+
+  @Test
+  public void getMemberWithPortMetricsShowsExactlyDefaultCategories() throws 
Exception {
+    // Use --member and --port to get member metrics with port info
+    String cmd = "show metrics --member=" + MEMBER_NAME + " --port=" + 
server.getPort();
+    List<String> expectedCategories =
+        ShowMetricsInterceptor.getValidCategoriesAsStrings(false, true, true);
+    // Blank lines are permitted for grouping.
+    expectedCategories.add("");
+    logger.info("Expecting categories: " + String.join(", ", 
expectedCategories));
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).tableHasColumnOnlyWithValues("Category",
+        expectedCategories.toArray(new String[0]));
+  }
+
+  @Test
+  public void getSystemMetricsShowsExactlyDefaultCategories() throws Exception 
{
+    // No specified options yield system-wide metrics
+    String cmd = "show metrics";
+    List<String> expectedCategories =
+        ShowMetricsInterceptor.getValidCategoriesAsStrings(false, false, 
false);
+    // Blank lines are permitted for grouping.
+    expectedCategories.add("");
+    logger.info("Expecting categories: " + String.join(", ", 
expectedCategories));
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).tableHasColumnOnlyWithValues("Category",
+        expectedCategories.toArray(new String[0]));
+  }
+
+  @Test
+  public void invalidCategoryGetsReported() throws Exception {
+    String cmd =
+        "show metrics 
--categories=\"cluster,cache,some_invalid_category,another_invalid_category\"";
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).containsOutput("Invalid Categories")
+        
.containsOutput("some_invalid_category").containsOutput("another_invalid_category")
+        .doesNotContainOutput("cache").doesNotContainOutput("cluster");
+  }
+
+  @Test
+  public void categoryOptionAbridgesOutput() throws Exception {
+    String cmd = "show metrics --categories=\"cluster,cache\"";
+    List<String> expectedCategories = Arrays.asList("cluster", "cache", "");
+    logger.info("Expecting categories: " + String.join(", ", 
expectedCategories));
+
+    gfsh.connectAndVerify(server.getEmbeddedLocatorPort(), PortType.locator);
+    gfsh.executeAndAssertThat(cmd).tableHasColumnOnlyWithValues("Category",
+        expectedCategories.toArray(new String[0]));
+  }
+}
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
index 151d396..ea2a489 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsDUnitTest.java
@@ -131,7 +131,7 @@ public class ShowMetricsDUnitTest {
   public void testShowMetricsMember() throws Exception {
     gfsh.executeAndAssertThat(
         "show metrics --member=" + server.getName() + " --port=" + 
server.getPort())
-        .statusIsSuccess().containsOutput("Member 
Metrics").containsOutput("cache-server");
+        .statusIsSuccess().containsOutput("Member 
Metrics").containsOutput("cacheserver");
   }
 
   @Test
@@ -141,7 +141,7 @@ public class ShowMetricsDUnitTest {
 
     gfsh.executeAndAssertThat("show metrics --member=" + server.getName() + " 
--port="
         + server.getPort() + " --file=" + 
output.getAbsolutePath()).statusIsSuccess()
-        .containsOutput("Member Metrics").containsOutput("cache-server")
+        .containsOutput("Member Metrics").containsOutput("cacheserver")
         .containsOutput("Member metrics exported to " + 
output.getAbsolutePath());
 
     assertThat(output).exists();
diff --git 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommandJUnitTest.java
 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java
similarity index 92%
rename from 
geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommandJUnitTest.java
rename to 
geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java
index e3c91b8..e6f15e4 100644
--- 
a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsCommandJUnitTest.java
+++ 
b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/ShowMetricsJUnitTest.java
@@ -1,7 +1,7 @@
 /*
  * 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
+ * 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
  *
@@ -12,7 +12,6 @@
  * or implied. See the License for the specific language governing permissions 
and limitations under
  * the License.
  */
-
 package org.apache.geode.management.internal.cli.commands;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -28,7 +27,7 @@ import org.apache.geode.test.junit.categories.UnitTest;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
 @Category(UnitTest.class)
-public class ShowMetricsCommandJUnitTest {
+public class ShowMetricsJUnitTest {
 
   @Rule
   public GfshParserRule parser = new GfshParserRule();
@@ -57,6 +56,7 @@ public class ShowMetricsCommandJUnitTest {
     ShowMetricsCommand command = spy(ShowMetricsCommand.class);
     CommandResult result = parser.executeCommandWithInstance(command, "show 
metrics --port=abc");
     assertThat(result.getStatus()).isEqualTo(Result.Status.ERROR);
-    assertThat(result.getContent().toString()).contains("Invalid port");
+    // When relying on Spring's converters, any command that does not parse is 
"Invalid"
+    assertThat(result.getContent().toString()).contains("Invalid command");
   }
 }
diff --git 
a/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
 
b/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
index f23326b..97c72dc 100644
--- 
a/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
+++ 
b/geode-core/src/test/java/org/apache/geode/test/junit/assertions/CommandResultAssert.java
@@ -132,7 +132,7 @@ public class CommandResultAssert
   public CommandResultAssert tableHasColumnWithExactValuesInExactOrder(String 
header,
       Object... expectedValues) {
     GfJsonObject resultContentJSON = actual.getCommandResult().getContent();
-    Object content = resultContentJSON.get(header);
+    Object content = getColumnContent(header, resultContentJSON);
 
     if (content == null) {
       failWithMessage(
@@ -168,7 +168,7 @@ public class CommandResultAssert
   public CommandResultAssert tableHasColumnWithExactValuesInAnyOrder(String 
header,
       Object... expectedValues) {
     GfJsonObject resultContentJSON = actual.getCommandResult().getContent();
-    Object content = resultContentJSON.get(header);
+    Object content = getColumnContent(header, resultContentJSON);
 
     if (content == null) {
       failWithMessage("Command result did not contain a table with column 
header <" + header + ">: "
@@ -188,7 +188,7 @@ public class CommandResultAssert
   public CommandResultAssert tableHasColumnWithValuesContaining(String header,
       String... expectedValues) {
     GfJsonObject resultContentJSON = actual.getCommandResult().getContent();
-    Object content = resultContentJSON.get(header);
+    Object content = getColumnContent(header, resultContentJSON);
 
     if (content == null) {
       failWithMessage("Command result did not contain a table with column 
header <" + header + ">: "
@@ -210,6 +210,38 @@ public class CommandResultAssert
     return this;
   }
 
+
+  /**
+   * Verifies that each of the actual values in the column with the given 
header contains at least
+   * one of the expectedValues.
+   */
+  public CommandResultAssert tableHasColumnOnlyWithValues(String header, 
String... expectedValues) {
+    GfJsonObject resultContentJSON = actual.getCommandResult().getContent();
+    Object content = getColumnContent(header, resultContentJSON);
+
+    if (content == null) {
+      failWithMessage("Command result did not contain a table with column 
header <" + header + ">: "
+          + resultContentJSON.toString());
+    }
+
+    Object[] actualValues = toArray((JSONArray) content);
+    assertThat(actualValues).containsOnly(expectedValues);
+    return this;
+  }
+
+  private Object getColumnContent(String header, GfJsonObject 
resultContentJSON) {
+    if (resultContentJSON.get(header) != null) {
+      return resultContentJSON.get(header);
+    }
+    try {
+      // Sometimes, the output is buried in a most questionable way.
+      return 
resultContentJSON.getJSONObject("__sections__-0").getJSONObject("__tables__-0")
+          .getJSONObject("content").get(header);
+    } catch (NullPointerException ignored) {
+    }
+    return null;
+  }
+
   public CommandResultAssert hasResult() {
     containsKeyValuePair("Result", "true");
 
diff --git 
a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
 
b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
index 583f77e..481a7d6 100644
--- 
a/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
+++ 
b/geode-core/src/test/resources/org/apache/geode/codeAnalysis/excludedClasses.txt
@@ -1,20 +1,63 @@
+org.apache.geode.internal.security.SecurableCommunicationChannel
+org/apache/geode/admin/internal/BackupStatusImpl
+org/apache/geode/cache/operations/CloseCQOperationContext
+org/apache/geode/cache/operations/DestroyOperationContext
+org/apache/geode/cache/operations/ExecuteCQOperationContext
+org/apache/geode/cache/operations/ExecuteFunctionOperationContext
+org/apache/geode/cache/operations/GetDurableCQsOperationContext
+org/apache/geode/cache/operations/GetOperationContext
+org/apache/geode/cache/operations/InterestOperationContext
+org/apache/geode/cache/operations/InvalidateOperationContext
+org/apache/geode/cache/operations/KeyOperationContext
+org/apache/geode/cache/operations/KeySetOperationContext
+org/apache/geode/cache/operations/KeyValueOperationContext
+org/apache/geode/cache/operations/OperationContext
+org/apache/geode/cache/operations/PutAllOperationContext
+org/apache/geode/cache/operations/PutOperationContext
+org/apache/geode/cache/operations/QueryOperationContext
+org/apache/geode/cache/operations/RegionClearOperationContext
+org/apache/geode/cache/operations/RegionCreateOperationContext
+org/apache/geode/cache/operations/RegionDestroyOperationContext
+org/apache/geode/cache/operations/RegionOperationContext
+org/apache/geode/cache/operations/RegisterInterestOperationContext
+org/apache/geode/cache/operations/RemoveAllOperationContext
+org/apache/geode/cache/operations/StopCQOperationContext
+org/apache/geode/cache/operations/UnregisterInterestOperationContext
+org/apache/geode/cache/operations/internal/GetOperationContextImpl
+org/apache/geode/cache/operations/internal/UpdateOnlyMap
 org/apache/geode/cache/query/CqAttributesFactory
 org/apache/geode/cache/query/internal/index/CompactRangeIndex
 org/apache/geode/cache/query/internal/index/CompactRangeIndex$1
 org/apache/geode/cache/query/internal/index/CompactRangeIndex$IMQEvaluator$1
-org/apache/geode/internal/cache/tier/CommunicationMode
 org/apache/geode/distributed/LocatorLauncher
 org/apache/geode/distributed/LocatorLauncher$Command
 org/apache/geode/distributed/ServerLauncher
 org/apache/geode/distributed/ServerLauncher$Command
+org/apache/geode/distributed/internal/DistributionConfigImpl
 org/apache/geode/distributed/internal/DistributionManager
+org/apache/geode/distributed/internal/tcpserver/LocatorCancelException
+org/apache/geode/internal/AvailablePort$Keeper
 org/apache/geode/internal/ExitCode
 org/apache/geode/internal/JarDeployer
 org/apache/geode/internal/cache/BackupLock
+org/apache/geode/internal/cache/DiskStoreAttributesCreation
+org/apache/geode/internal/cache/DiskStoreMonitor$DiskState
+org/apache/geode/internal/cache/EventStateHelper
+org/apache/geode/internal/cache/InitialImageOperation$GIITestHook
+org/apache/geode/internal/cache/Oplog$OPLOG_TYPE
+org/apache/geode/internal/cache/UserSpecifiedDiskStoreAttributes
+org/apache/geode/internal/cache/client/protocol/exception/ServiceLoadingFailureException
+org/apache/geode/internal/cache/client/protocol/exception/ServiceVersionNotFoundException
+org/apache/geode/internal/cache/operations/ContainsKeyOperationContext
+org/apache/geode/internal/cache/tier/CommunicationMode
+org/apache/geode/internal/cache/tier/InternalClientMembership$EventType
+org/apache/geode/internal/cache/tier/sockets/ClientUpdateMessageImpl$ClientCqConcurrentMap
+org/apache/geode/internal/cache/tier/sockets/ClientUpdateMessageImpl$CqNameToOpHashMap
+org/apache/geode/internal/datasource/FacetsJCAConnectionManagerImpl
 org/apache/geode/internal/exception/InvalidExecutionContextException
 org/apache/geode/internal/logging/GemFireLevel
-org/apache/geode/internal/logging/LoggingThreadGroup
 org/apache/geode/internal/logging/LogWriterImpl
+org/apache/geode/internal/logging/LoggingThreadGroup
 org/apache/geode/internal/logging/log4j/ConfigurableLogger
 org/apache/geode/internal/logging/log4j/CustomGemFireLogger
 org/apache/geode/internal/logging/log4j/ExtendedGemFireLogger
@@ -25,17 +68,76 @@ 
org/apache/geode/internal/logging/log4j/LogWriterAppenders$Identifier
 org/apache/geode/internal/logging/log4j/LogWriterLogger
 org/apache/geode/internal/logging/log4j/message/GemFireParameterizedMessage
 
org/apache/geode/internal/logging/log4j/message/GemFireParameterizedMessageFactory
+org/apache/geode/internal/memcached/Command
+org/apache/geode/internal/memcached/Command$1
+org/apache/geode/internal/memcached/Command$10
+org/apache/geode/internal/memcached/Command$11
+org/apache/geode/internal/memcached/Command$12
+org/apache/geode/internal/memcached/Command$13
+org/apache/geode/internal/memcached/Command$14
+org/apache/geode/internal/memcached/Command$15
+org/apache/geode/internal/memcached/Command$16
+org/apache/geode/internal/memcached/Command$17
+org/apache/geode/internal/memcached/Command$18
+org/apache/geode/internal/memcached/Command$19
+org/apache/geode/internal/memcached/Command$2
+org/apache/geode/internal/memcached/Command$20
+org/apache/geode/internal/memcached/Command$21
+org/apache/geode/internal/memcached/Command$22
+org/apache/geode/internal/memcached/Command$23
+org/apache/geode/internal/memcached/Command$24
+org/apache/geode/internal/memcached/Command$25
+org/apache/geode/internal/memcached/Command$26
+org/apache/geode/internal/memcached/Command$27
+org/apache/geode/internal/memcached/Command$28
+org/apache/geode/internal/memcached/Command$29
+org/apache/geode/internal/memcached/Command$3
+org/apache/geode/internal/memcached/Command$30
+org/apache/geode/internal/memcached/Command$31
+org/apache/geode/internal/memcached/Command$32
+org/apache/geode/internal/memcached/Command$33
+org/apache/geode/internal/memcached/Command$34
+org/apache/geode/internal/memcached/Command$4
+org/apache/geode/internal/memcached/Command$5
+org/apache/geode/internal/memcached/Command$6
+org/apache/geode/internal/memcached/Command$7
+org/apache/geode/internal/memcached/Command$8
+org/apache/geode/internal/memcached/Command$9
 org/apache/geode/internal/offheap/RefCountChangeInfo
 org/apache/geode/internal/process/BlockingProcessStreamReader
+org/apache/geode/internal/process/ClusterConfigurationNotAvailableException
 org/apache/geode/internal/process/NonBlockingProcessStreamReader
 org/apache/geode/internal/process/ProcessStreamReader
 org/apache/geode/internal/process/ProcessStreamReader$ReadingMode
 org/apache/geode/internal/process/ProcessTerminatedAbnormallyException
 org/apache/geode/internal/process/ProcessType
 org/apache/geode/internal/process/ProcessUtils
+org/apache/geode/internal/process/SharedConfigurationNotAvailableException
 org/apache/geode/internal/process/UnableToControlProcessException
+org/apache/geode/internal/ra/GFConnectionFactoryImpl
+org/apache/geode/internal/ra/GFConnectionImpl
+org/apache/geode/internal/ra/spi/JCAManagedConnectionFactory
 org/apache/geode/internal/redis/RegionCreationException
-org/apache/geode/redis/internal/RedisCommandType,false
+org/apache/geode/internal/security/GeodeSecurityUtil
+org/apache/geode/internal/security/IntegratedSecurityService
+org/apache/geode/internal/security/IntegratedSecurityService$SerializationProxy
+org/apache/geode/internal/security/SecurityService
+org/apache/geode/internal/security/shiro/GeodeAuthenticationToken
+org/apache/geode/internal/shared/NativeErrorException
+org/apache/geode/internal/shared/OSType
+org/apache/geode/internal/shared/OSType$1
+org/apache/geode/internal/shared/OSType$2
+org/apache/geode/internal/shared/OSType$3
+org/apache/geode/internal/shared/OSType$4
+org/apache/geode/internal/shared/OSType$5
+org/apache/geode/internal/shared/TCPSocketOptions
+org/apache/geode/internal/statistics/platform/LinuxProcFsStatistics$CPU
+org/apache/geode/internal/util/concurrent/StoppableReadWriteLock
+org/apache/geode/management/internal/BackupStatusImpl
+org/apache/geode/management/internal/cli/commands/ShowMetricsCommand$Category
+org/apache/geode/management/internal/cli/exceptions/UserErrorException
+org/apache/geode/pdx/JSONFormatter$states
+org/apache/geode/redis/internal/RedisCommandType
 org/apache/geode/redis/internal/RedisCommandType$1
 org/apache/geode/redis/internal/RedisCommandType$10
 org/apache/geode/redis/internal/RedisCommandType$100
@@ -149,6 +251,7 @@ org/apache/geode/redis/internal/RedisCommandType$96
 org/apache/geode/redis/internal/RedisCommandType$97
 org/apache/geode/redis/internal/RedisCommandType$98
 org/apache/geode/redis/internal/RedisCommandType$99
+org/apache/geode/redis/internal/RedisCommandType,false
 org/apache/geode/redis/internal/RedisDataType
 org/apache/geode/redis/internal/RedisDataType$1
 org/apache/geode/redis/internal/RedisDataType$2
@@ -212,117 +315,15 @@ org/apache/geode/redis/internal/executor/SortedSetQuery$6
 org/apache/geode/redis/internal/executor/SortedSetQuery$7
 org/apache/geode/redis/internal/executor/SortedSetQuery$8
 org/apache/geode/redis/internal/executor/SortedSetQuery$9
-org/apache/geode/internal/shared/NativeErrorException
-org/apache/geode/internal/shared/OSType
-org/apache/geode/internal/shared/OSType$1
-org/apache/geode/internal/shared/OSType$2
-org/apache/geode/internal/shared/OSType$3
-org/apache/geode/internal/shared/OSType$4
-org/apache/geode/internal/shared/OSType$5
-org/apache/geode/internal/shared/TCPSocketOptions
-org/apache/geode/internal/process/SharedConfigurationNotAvailableException
-org/apache/geode/internal/cache/tier/InternalClientMembership$EventType
-org/apache/geode/internal/util/concurrent/StoppableReadWriteLock
-org/apache/geode/rest/internal/web/exception.GemfireRestException
+org/apache/geode/redis/internal/executor/list/ListExecutor$ListDirection
 org/apache/geode/rest/internal/web/controllers/support/JSONTypes
 org/apache/geode/rest/internal/web/controllers/support/QueryResultTypes
 org/apache/geode/rest/internal/web/controllers/support/UpdateOp
+org/apache/geode/rest/internal/web/exception.GemfireRestException
 org/apache/geode/rest/internal/web/exception/MalformedJsonException
 org/apache/geode/rest/internal/web/exception/RegionNotFoundException
 org/apache/geode/rest/internal/web/exception/ResourceNotFoundException
-org/apache/geode/distributed/internal/DistributionConfigImpl
-org/apache/geode/internal/cache/EventStateHelper
-org/apache/geode/internal/cache/DiskStoreMonitor$DiskState
-org/apache/geode/internal/cache/UserSpecifiedDiskStoreAttributes
-org/apache/geode/internal/cache/DiskStoreAttributesCreation
-org/apache/geode/internal/cache/Oplog$OPLOG_TYPE
-org/apache/geode/internal/cache/tier/sockets/ClientUpdateMessageImpl$ClientCqConcurrentMap
-org/apache/geode/internal/cache/tier/sockets/ClientUpdateMessageImpl$CqNameToOpHashMap
-org/apache/geode/internal/datasource/FacetsJCAConnectionManagerImpl
-org/apache/geode/internal/process/ClusterConfigurationNotAvailableException
-org/apache/geode/internal/security/GeodeSecurityUtil
-org/apache/geode/internal/security/IntegratedSecurityService
-org/apache/geode/internal/security/IntegratedSecurityService$SerializationProxy
-org/apache/geode/internal/security/SecurityService
-org/apache/geode/internal/statistics/platform/LinuxProcFsStatistics$CPU
-org/apache/geode/internal/ra/GFConnectionFactoryImpl
-org/apache/geode/internal/ra/GFConnectionImpl
-org/apache/geode/internal/ra/spi/JCAManagedConnectionFactory
-org/apache/geode/cache/operations/internal/UpdateOnlyMap
-org/apache/geode/cache/operations/CloseCQOperationContext
-org/apache/geode/cache/operations/DestroyOperationContext
-org/apache/geode/cache/operations/ExecuteCQOperationContext
-org/apache/geode/cache/operations/ExecuteFunctionOperationContext
-org/apache/geode/cache/operations/GetDurableCQsOperationContext
-org/apache/geode/cache/operations/GetOperationContext
-org/apache/geode/cache/operations/InterestOperationContext
-org/apache/geode/cache/operations/InvalidateOperationContext
-org/apache/geode/cache/operations/KeyOperationContext
-org/apache/geode/cache/operations/KeySetOperationContext
-org/apache/geode/cache/operations/KeyValueOperationContext
-org/apache/geode/cache/operations/OperationContext
-org/apache/geode/cache/operations/PutAllOperationContext
-org/apache/geode/cache/operations/PutOperationContext
-org/apache/geode/cache/operations/QueryOperationContext
-org/apache/geode/cache/operations/RegionClearOperationContext
-org/apache/geode/cache/operations/RegionCreateOperationContext
-org/apache/geode/cache/operations/RegionDestroyOperationContext
-org/apache/geode/cache/operations/RegionOperationContext
-org/apache/geode/cache/operations/RegisterInterestOperationContext
-org/apache/geode/cache/operations/RemoveAllOperationContext
-org/apache/geode/cache/operations/StopCQOperationContext
-org/apache/geode/cache/operations/UnregisterInterestOperationContext
-org/apache/geode/cache/operations/internal/GetOperationContextImpl
-org/apache/geode/internal/cache/client/protocol/exception/ServiceLoadingFailureException
-org/apache/geode/internal/cache/client/protocol/exception/ServiceVersionNotFoundException
-org/apache/geode/internal/cache/operations/ContainsKeyOperationContext
 org/apache/geode/security/ResourcePermission
 org/apache/geode/security/ResourcePermission$Operation
 org/apache/geode/security/ResourcePermission$Resource
 org/apache/geode/security/ResourcePermission$Target
-org/apache/geode/distributed/internal/tcpserver/LocatorCancelException
-org.apache.geode.internal.security.SecurableCommunicationChannel
-org/apache/geode/internal/security/shiro/GeodeAuthenticationToken
-org/apache/geode/internal/cache/InitialImageOperation$GIITestHook
-org/apache/geode/internal/AvailablePort$Keeper
-org/apache/geode/admin/internal/BackupStatusImpl
-org/apache/geode/management/internal/BackupStatusImpl
-org/apache/geode/management/internal/cli/exceptions/UserErrorException
-org/apache/geode/pdx/JSONFormatter$states
-org/apache/geode/internal/memcached/Command
-org/apache/geode/internal/memcached/Command$1
-org/apache/geode/internal/memcached/Command$10
-org/apache/geode/internal/memcached/Command$11
-org/apache/geode/internal/memcached/Command$12
-org/apache/geode/internal/memcached/Command$13
-org/apache/geode/internal/memcached/Command$14
-org/apache/geode/internal/memcached/Command$15
-org/apache/geode/internal/memcached/Command$16
-org/apache/geode/internal/memcached/Command$17
-org/apache/geode/internal/memcached/Command$18
-org/apache/geode/internal/memcached/Command$19
-org/apache/geode/internal/memcached/Command$2
-org/apache/geode/internal/memcached/Command$20
-org/apache/geode/internal/memcached/Command$21
-org/apache/geode/internal/memcached/Command$22
-org/apache/geode/internal/memcached/Command$23
-org/apache/geode/internal/memcached/Command$24
-org/apache/geode/internal/memcached/Command$25
-org/apache/geode/internal/memcached/Command$26
-org/apache/geode/internal/memcached/Command$27
-org/apache/geode/internal/memcached/Command$28
-org/apache/geode/internal/memcached/Command$29
-org/apache/geode/internal/memcached/Command$3
-org/apache/geode/internal/memcached/Command$30
-org/apache/geode/internal/memcached/Command$31
-org/apache/geode/internal/memcached/Command$32
-org/apache/geode/internal/memcached/Command$33
-org/apache/geode/internal/memcached/Command$34
-org/apache/geode/internal/memcached/Command$4
-org/apache/geode/internal/memcached/Command$5
-org/apache/geode/internal/memcached/Command$6
-org/apache/geode/internal/memcached/Command$7
-org/apache/geode/internal/memcached/Command$8
-org/apache/geode/internal/memcached/Command$9
-org/apache/geode/redis/internal/RedisCommandType
-org/apache/geode/redis/internal/executor/list/ListExecutor$ListDirection
diff --git 
a/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
 
b/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
index eb0a719..8199dbf 100644
--- 
a/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
+++ 
b/geode-core/src/test/resources/org/apache/geode/management/internal/cli/commands/golden-help-offline.properties
@@ -2257,10 +2257,12 @@ PARAMETERS\n\
 \ \ \ \ categories\n\
 \ \ \ \ \ \ \ \ Categories available based upon the parameters specified 
are:\n\
 \ \ \ \ \ \ \ \ - no parameters specified: cluster, cache, diskstore, query\n\
-\ \ \ \ \ \ \ \ - region specified: cluster, region, partition, diskstore, 
callback, eviction\n\
-\ \ \ \ \ \ \ \ - member specified: member, jvm, region, serialization, 
communication, function,\n\
-\ \ \ \ \ \ \ \ transaction, diskstore, lock, eviction, distribution, 
offheap\n\
-\ \ \ \ \ \ \ \ - member and region specified: region, partition, diskstore, 
callback, eviction\n\
+\ \ \ \ \ \ \ \ - region specified: callback, cluster, diskstore, eviction, 
partition, region\n\
+\ \ \ \ \ \ \ \ - member specified: communication, diskstore, distribution, 
eviction, function, jvm, lock, member,\n\
+\ \ \ \ \ \ \ \ offheap, region, serialization, transaction\n\
+\ \ \ \ \ \ \ \ - member and port specified: cacheserver, communication, 
diskstore, distribution, eviction, function,\n\
+\ \ \ \ \ \ \ \ jvm, lock, member, notification, offheap, query, region, 
serialization, transaction\n\
+\ \ \ \ \ \ \ \ - member and region specified: callback, diskstore, eviction, 
partition, region\n\
 \ \ \ \ \ \ \ \ Required: false\n\
 
 show-missing-disk-stores.help=\

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to