[ 
https://issues.apache.org/jira/browse/GEODE-3961?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16251842#comment-16251842
 ] 

ASF GitHub Bot commented on GEODE-3961:
---------------------------------------

PurelyApplied closed pull request #1046: GEODE-3961: Refactor 
ShowMetricsCommand to behave uniformly...
URL: https://github.com/apache/geode/pull/1046
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 9cebc63c34..4fc7d4e8b0 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 @@ else if (!userInput.endsWith("=")) {
   /**
    * @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 6783925533..bf303f5a63 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.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.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 Result showMetrics(
       @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 Result preExecution(GfshParseResult parseResult) {
    * @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 @@ private ResultData getSystemWideMetrics(String 
export_to_report_to, String[] cat
    * @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 @@ private ResultData getMemberMetrics(DistributedMember 
distributedMember,
     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 @@ private ResultData getMemberMetrics(DistributedMember 
distributedMember,
    * @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 @@ private ResultData getDistributedRegionMetrics(String 
regionName, String export_
    * @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 @@ private ResultData getRegionMetricsFromMember(String 
regionName,
     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 @@ private ResultData getRegionMetricsFromMember(String 
regionName,
       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 0000000000..97a49a5d8b
--- /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 69dfc31e85..0e27fba208 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 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 2d1564927b..65110ffc03 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 final void postSetUp() throws Exception {
   @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 static void reset() 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;
-      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 static int createServerCache() throws Exception {
     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 void afterInvalidate(EntryEvent<String, String> 
event) {
       }
 
       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 void afterUpdate(EntryEvent<String, String> event) 
{
     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 void run() {
     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 static void resumePuts() {
     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 String description() {
     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 0000000000..f17c681250
--- /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 1a34a3e69a..467002fc19 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 void testShowMetricsRegion() throws Exception {
   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 void testShowMetricsMemberWithFileOutput() throws 
Exception {
 
     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 e3c91b810b..e6f15e4dcd 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.rules.GfshParserRule;
 
 @Category(UnitTest.class)
-public class ShowMetricsCommandJUnitTest {
+public class ShowMetricsJUnitTest {
 
   @Rule
   public GfshParserRule parser = new GfshParserRule();
@@ -57,6 +56,7 @@ public void invalidPortNumber() throws Exception {
     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 f23326ba67..97c72dcdf3 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 CommandResultAssert statusIsError() {
   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 CommandResultAssert 
tableHasColumnWithExactValuesInExactOrder(String head
   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 CommandResultAssert 
tableHasColumnWithExactValuesInAnyOrder(String header
   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 CommandResultAssert 
tableHasColumnWithValuesContaining(String header,
     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 583f77e2d4..481a7d6ef1 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 eb0a719f52..8199dbf123 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=\


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> Show metrics disregards specified --categories for CacheServer (--port option 
> related) metrics 
> -----------------------------------------------------------------------------------------------
>
>                 Key: GEODE-3961
>                 URL: https://issues.apache.org/jira/browse/GEODE-3961
>             Project: Geode
>          Issue Type: Bug
>            Reporter: Patrick Rhomberg
>
> Those CacheServer metric categories ({{query}}, {{notification}}, and 
> {{cache-server}}) are not checked against those categories specified by the 
> user and are only checked against the cache server bean being non-null 
> (implicitly: that the port was provided and valid).
> For unification and consistency, these categories should not be displayed 
> when the {{--categories}} option is specified and excludes them.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to