我正在try 使用Java SDK 1.x从CloudWatch中检索一些Elasticache指标.我有几个类用于多个服务,它们都可以工作,除了Elasticache.这个类被传递一个Elasticache node 列表,以及开始和结束时间.对于每个 node ,我try 在30分钟内从Elasticache中检索一些指标.然而,出于某种原因,我一直得到每个指标的值为0.0.我已经确认AWS控制台中的指标不是空的.下面是我的代码:

public class ElastiCacheCWMetricsRetriever {
    private final AmazonCloudWatch cloudWatchClient;

    public ElastiCacheCWMetricsRetriever(AmazonCloudWatch cloudWatchClient) {
        this.cloudWatchClient = cloudWatchClient;
    }


    public Map<String, Map<String, Object>> getElastiCacheMetrics(List<String> nodeNames, 
        String startTimeStr, String endTimeStr) {
        Map<String, Map<String, Object>> elastiCacheMetricsMap = new HashMap<>();

        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
            Date startTime = dateFormat.parse(startTimeStr);
            Date endTime = dateFormat.parse(endTimeStr);

            for (String nodeName : nodeNames) {
                Map<String, Object> nodeMetrics = new HashMap<>();

                nodeMetrics.put("SwapUsage", getAverageMetricValue("AWS/ElastiCache", 
                    "SwapUsage", "CacheNodeId", nodeName, startTime, endTime));
                Double SwapUsage = getSumMetricValue("AWS/ElastiCache", "SwapUsage", 
                    "CacheNodeId", nodeName, startTime, endTime);
                System.out.println("SwapUsage for " + nodeName + " is " + 
                    String.valueOf(SwapUsage));

                nodeMetrics.put("CurrentConnections", getSumMetricValue("AWS/ElastiCache", 
                    "CurrConnections", "CacheNodeId", nodeName, startTime, endTime));

                nodeMetrics.put("DatabaseMemoryUsagePercentage", 
                getAverageMetricValue("AWS/ElastiCache", "DatabaseMemoryUsagePercentage", 
                    "CacheNodeId", nodeName, startTime, endTime) * 100.0);

                nodeMetrics.put("EngineCPUUtilization", 
                     getAverageMetricValue("AWS/ElastiCache", "EngineCPUUtilization", 
                     "CacheNodeId", nodeName, startTime, endTime) * 100.0);

                Double EngineCPUUtil = getAverageMetricValue("AWS/ElastiCache", 
                    "EngineCPUUtilization", "CacheNodeId", nodeName, startTime, endTime) * 100.0;
                System.out.println("EngineCPUUtilization for " + nodeName + " is " + String.valueOf(EngineCPUUtil));
                elastiCacheMetricsMap.put(nodeName, nodeMetrics);
            }
        } catch (Exception e) {
            System.out.println("Error in Elasticache" + e.getMessage());
        }   
        return elastiCacheMetricsMap;
    }

     private double getAverageMetricValue(String namespace, String metricName, String 
         dimensionName, String dimensionValue, Date startTime, Date endTime) {
         int period = calculatePeriod(startTime, endTime);
         return getMetricValue(namespace, metricName, dimensionName, dimensionValue, startTime, endTime, period, "Average");
     }

    private double getSumMetricValue(String namespace, String metricName, String dimensionName, String dimensionValue, Date startTime, Date endTime) {
        int period = calculatePeriod(startTime, endTime);
        return getMetricValue(namespace, metricName, dimensionName, dimensionValue, startTime, endTime, period, "Sum");
    }

    private double getMetricValue(String namespace, String metricName, String dimensionName, String dimensionValue, Date startTime, Date endTime, int period, String statistic) {
        try {
            GetMetricStatisticsRequest request = new GetMetricStatisticsRequest()
                .withNamespace(namespace)
                .withMetricName(metricName)
                .withDimensions(new Dimension().withName(dimensionName).withValue(dimensionValue))
                .withStartTime(startTime)
                .withEndTime(endTime)
                .withPeriod(period)
                .withStatistics(statistic);

            GetMetricStatisticsResult result = cloudWatchClient.getMetricStatistics(request);
            System.out.println("Result for " + dimensionValue + " is " + result.toString());
            return result.getDatapoints().isEmpty() ? 0 : result.getDatapoints().get(0).getAverage();
        } catch (Exception e) {
            System.out.println("Error in Elasticache" + e.getMessage());
            return 0;
        }
    }


    private int calculatePeriod(Date startTime, Date endTime) {
        long diffInSeconds = (endTime.getTime() - startTime.getTime()) / 1000;
        int periods = (int) Math.ceil(diffInSeconds / 1800);

        return (periods > 0) ? 1800 : 60;
    }
}

我正在使用System.out.println("SwapUsage for " + nodeName + " is " + String.valueOf(SwapUsage));进行故障排除.我不确定下一步该往哪里看.有什么 idea /建议吗?

编辑:所以我又测试了一些,我在getMetricValue中添加了这行System.out.println("Result for " + dimensionValue + " is " + result.toString());.我得到的结果是Result for scrsquy-001 is {Label: EngineCPUUtilization,Datapoints: []}.为什么它是空的,我怎么才能让它工作?

推荐答案

好的,我发现了哪里出了问题.我查看了Cloudwatch指标中的AWS指标(不是在ElastiCache指标选项卡中),结果发现ElastiCache中的每个 node 都被视为CacheClusterId,而我以 for each node 都是CacheNodeId.所以我有一个有3个 node 的集群,每个 node 都有自己的CacheClusterId个 node ,而在它下面有CacheNodeId个,比如001.在上面的代码中,我只需将CacheNodeId更改为CacheClusterId,它就非常有效.

Java相关问答推荐

在Java中将Charsequence数组更改为String数组或List String<>

Mat. n_Delete()和Mat. n_release的区别

JsonPath在多个线程中返回错误的值

为什么BasicComboBoxRenderer在文本不存在或文本为空的情况下设置两次文本?

Java inline Double条件和值解装箱崩溃

对运行在GraalVM-21上的JavaFX应用程序使用分代ZGC会警告不支持JVMCI,为什么?

对某一Hyroby控制器禁用@cacheable

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

计算两个浮点数之间的距离是否对称?

什么是Java原子属性的正确getter和setter

如何在EXCEL单元格中添加形状和文本

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

内存和硬盘中的Zip不同,这会导致下载后的Zip损坏

如何在JavaFX中制作鼠标透明stage

无法使用Freemarker从XML中读取重复的标记值

我可以在@Cacheable中使用枚举吗

如何使用MapStrCut转换双向链接

使用迭代器遍历HashMap不会因IF条件而停止

Java集合:NPE,即使没有添加空值

放置在变量中的Java成员引用不相等