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;
}
我目前正在尝试创建一个 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;
}