docs: @Override
      protected void executeRuntimeStep(OperationContext context, ModelNode operation) {
          final PathAddress address = PathAddress.pathAddress(operation.require(OP_ADDR));
          final String cacheContainerName = address.getLastElement().getValue();
          final String attrName = operation.require(ModelDescriptionConstants.NAME).asString();
          final ServiceController<?> controller = context.getServiceRegistry(false).getService(CacheContainerServiceName.CACHE_CONTAINER.getServiceName(cacheContainerName));
          DefaultCacheContainer cacheManager = (DefaultCacheContainer) controller.getValue();
  
          CacheManagerMetrics metric = CacheManagerMetrics.getStat(attrName);
          ModelNode result = new ModelNode();
  
          if (metric == null) {
              context.getFailureDescription().set(String.format("Unknown metric %s", attrName));
          } else if (cacheManager == null) {
              context.getFailureDescription().set(String.format("Unavailable cache container %s", attrName));
          } else {
              CacheContainerStats stats = cacheManager.getStats();
              ClusterContainerStats clusterContainerStats = cacheManager.getGlobalComponentRegistry().getComponent(ClusterContainerStats.class);
              switch (metric) {
                  case CACHE_MANAGER_STATUS:
                      result.set(SecurityActions.getCacheManagerStatus(cacheManager).toString());
                      break;
                  case IS_COORDINATOR:
                      result.set(SecurityActions.getCacheManagerIsCoordinator(cacheManager));
                      break;
                  case LOCAL_ADDRESS:
                      Address localAddress = SecurityActions.getCacheManagerLocalAddress(cacheManager);
                      result.set(localAddress != null ? localAddress.toString() : "N/A");
                      break;
                  case COORDINATOR_ADDRESS:
                      Address coordinatorAddress = SecurityActions.getCacheManagerCoordinatorAddress(cacheManager);
                      result.set(coordinatorAddress != null ? coordinatorAddress.toString() : "N/A");
                      break;
                  case CLUSTER_AVAILABILITY:
                      result.set(SecurityActions.getCacheManagerClusterAvailability(cacheManager));
                      break;
                  case CLUSTER_NAME:
                      String clusterName = SecurityActions.getCacheManagerClusterName(cacheManager);
                      result.set(clusterName != null ? clusterName : "N/A");
                      break;
                  case DEFINED_CACHE_NAMES:
                      String definedCacheNames = SecurityActions.getDefinedCacheNames(cacheManager);
                      result.set(definedCacheNames != null ? definedCacheNames : "N/A");
                      break;
                  case CLUSTER_SIZE:
                      List<Address> members = SecurityActions.getMembers(cacheManager);
                      result.set(members != null ? Integer.toString(members.size()) : "N/A");
                      break;
                  case CREATED_CACHE_COUNT:
                      result.set(SecurityActions.getCacheCreatedCount(cacheManager));
                      break;
                  case DEFINED_CACHE_COUNT:
                      result.set(SecurityActions.getDefinedCacheCount(cacheManager));
                      break;
                  case MEMBERS:
                      members = SecurityActions.getMembers(cacheManager);
                      result.set(members != null ? members.toString() : "N/A");
                      break;
                  case RUNNING_CACHE_COUNT:
                      result.set(SecurityActions.getRunningCacheCount(cacheManager));
                      break;
                  case VERSION:
                      result.set(Version.getVersion());
                      break;
                  case AVERAGE_READ_TIME:
                     result.set(stats.getAverageReadTime());
                     break;
                  case AVERAGE_WRITE_TIME:
                     result.set(stats.getAverageWriteTime());
                     break;
                  case AVERAGE_REMOVE_TIME:
                     result.set(stats.getAverageRemoveTime());
                     break;
                  case AVERAGE_READ_TIME_NANOS:
                      result.set(stats.getAverageReadTimeNanos());
                      break;
                  case AVERAGE_WRITE_TIME_NANOS:
                      result.set(stats.getAverageWriteTimeNanos());
                      break;
                  case AVERAGE_REMOVE_TIME_NANOS:
                      result.set(stats.getAverageRemoveTimeNanos());
                      break;
                  case TIME_SINCE_START:
                     result.set(stats.getTimeSinceStart());
                     break;
                  case EVICTIONS:
                     result.set(stats.getEvictions());
                     break;
                  case HIT_RATIO:
                     result.set(stats.getHitRatio());
                     break;
                  case HITS:
                     result.set(stats.getHits());
                     break;
                  case MISSES:
                     result.set(stats.getMisses());
                     break;
                  case NUMBER_OF_ENTRIES:
                     result.set(stats.getCurrentNumberOfEntries());
                     break;
                  case NUMBER_OF_ENTRIES_IN_MEMORY:
                      result.set(stats.getCurrentNumberOfEntriesInMemory());
                      break;
                  case DATA_MEMORY_USED:
                      result.set(stats.getDataMemoryUsed());
                      break;
                  case OFF_HEAP_MEMORY_USED:
                      result.set(stats.getOffHeapMemoryUsed());
                      break;
                  case MINIMUM_REQUIRED_NODES:
                      result.set(stats.getRequiredMinimumNumberOfNodes());
                      break;
                  case READ_WRITE_RATIO:
                     result.set(stats.getReadWriteRatio());
                     break;
                  case REMOVE_HITS:
                     result.set(stats.getRemoveHits());
                     break;
                  case REMOVE_MISSES:
                     result.set(stats.getRemoveMisses());
                     break;
                  case STORES:
                     result.set(stats.getStores());
                     break;
                  case TIME_SINCE_RESET:
                     result.set(stats.getTimeSinceReset());
                     break;
                  case ONLINE_SITES:
                  case OFFLINE_SITES:
                  case MIXED_SITES: {
                      GlobalComponentRegistry registry = SecurityActions.getGlobalComponentRegistry(cacheManager);
                      Collection<String> sites = filterSitesByStatus(registry, metric);
                      if (sites.isEmpty()) {
                          result.setEmptyList();
                      } else {
                          result.set(toModelNodeCollection(sites));
                      }
                      break;
                  }
                  case SITES_VIEW:
                      Set<String> sitesView = SecurityActions.getSitesView(cacheManager);
                      result.set(sitesView != null ? sitesView.toString() : "N/A");
                      break;
                  case MEMORY_AVAILABLE:
                      result.set(clusterContainerStats.getMemoryAvailable());
                      break;
                  case MEMORY_MAX:
                      result.set(clusterContainerStats.getMemoryMax());
                      break;
                  case MEMORY_TOTAL:
                      result.set(clusterContainerStats.getMemoryTotal());
                      break;
                  case MEMORY_USED:
                      result.set(clusterContainerStats.getMemoryUsed());
                      break;
                  case STALE_STATS_THRESHOLD:
                      result.set(clusterContainerStats.getStaleStatsThreshold());
                      break;
                  default:
                      context.getFailureDescription().set(String.format("Unknown metric %s", metric));
                      break;
              }
              context.getResult().set(result);
          }
      }