AWS API 与 Cloudwatch 集成返回空白数据点

AWS API integration with Cloudwatch returning blank datapoints

我目前正在尝试创建一个 Java 应用程序,它可以通过 AWS Java SDK 调用和引用亚马逊 AWS API。我已经能够直接调用 S3 和 EC2 等服务,但是当我尝试从 Cloudwatch 提取数据时,我无法获得任何数据点。

我尝试过调整不同的变量(维度、调整时间变量),并且尝试通过 CLI 提取数据。当我通过 CLI 请求数据时,我能够获取数据点,但 Java 应用程序无法获取相同的数据。这是我的 CLI 代码:

aws cloudwatch get-metric-statistics --metric-name BucketSizeBytes --namespace "AWS/S3" --start-time 2019-06-21T00:00:00Z --end-time 2019-06-22T00:00:00Z --period 3600 --statistics Average --unit Bytes --output json --region us-east-1 --dimensions Name=BucketName,Value=XXXXX Name=StorageType,Value=StandardStorage

这是我在 Java 端使用的。变量namespace等于字符串"AWS/S3",变量region设置为Region.US_EAST_1

设置 CloudWatch 客户端

 private CloudWatchClient cwClient = CloudWatchClient.builder().region(region).build();

调用数据

public S3 individualS3BucketSize(S3 s3) {
        Instant now = Instant.now();
        Dimension dimensions = Dimension.builder().name("BucketName").value("XXXXX").name("StorageType").value("StandardStorage").build();

        GetMetricStatisticsRequest request = GetMetricStatisticsRequest.builder().namespace(namespace).metricName("BucketSizeBytes")
            .statistics(Statistic.AVERAGE)
            .startTime(now.minus(Duration.ofDays(1))).endTime(now).period(3600)
            .dimensions(dimensions)
            .build();

        GetMetricStatisticsResponse response;

        response = cwClient.getMetricStatistics(request);
        System.out.println(response.toString());
}

当方法被调用并且打印方法是运行时,我得到:

GetMetricStatisticsResponse(Label=BucketSizeBytes, Datapoints=[])

关于为什么它在 Java 应用程序而不是 CLI 中返回空白的任何想法?

上面代码的问题出在时间片上。此对 Cloudwatch 的特定调用 (BucketSizeBytes) 不会 return 数据,除非由于此特定指标的报告时间而处于 1d window 的时间。如果您进入 CloudWatch 的 Web 仪表板,除非时间范围设置为 1d,否则不会提取任何数据。

由于上述代码的开始时间和结束时间相差不超过 24 小时,因此不会出现任何数据点。我修改了代码以提高可读性和正确的功能。

public S3 individualS3BucketSize(S3 s3) {
        Instant now = Instant.now();
        Instant earlier = now.minusSeconds(259201); //3 Days in the past in seconds
        Statistic stat = Statistic.AVERAGE;
        GetMetricStatisticsResponse response;

        Dimension dimensionsName = Dimension.builder().name("BucketName").value(XXXXX).build();
        Dimension dimensionsStorage = Dimension.builder().name("StorageType").value("StandardStorage").build();

        Collection<Dimension> dimensions = new ArrayList<>();
        dimensions.add(dimensionsName);
        dimensions.add(dimensionsStorage);

        GetMetricStatisticsRequest request = GetMetricStatisticsRequest.builder().namespace(namespace).metricName("BucketSizeBytes")
            .dimensions(dimensions)
            .startTime(earlier).endTime(now).period(3600)
            .unit("Bytes").statistics(stat).build();

        response = cwClient.getMetricStatistics(request);
        System.out.println(response.toString());
        return null;
    }