Интеграция AWS API с Cloudwatch, возвращая пустые точки данных
В настоящее время я пытаюсь создать приложение Java, которое может вызывать и ссылаться на API Amazon AWS через AWS Java SDK. Мне удалось напрямую звонить в такие службы, как 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. Пространство имен переменной равно строке "AWS/S3", а переменная область имеет значение 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());
}
Когда метод вызывается и метод print запускается, я получаю:
GetMetricStatisticsResponse(Label=BucketSizeBytes, Datapoints=[])
Любые мысли о том, почему он возвращается пустым в приложении Java, но не CLI?
1 ответ
Проблема с приведенным выше кодом находится внутри отрезка времени. Этот конкретный вызов (BucketSizeBytes) для Cloudwatch не возвращает данные, если только он не находится в одном окне времени из-за времени сообщения этой конкретной метрики. Если вы перейдете на веб-панель управления CloudWatch, никакие данные не будут извлечены, если временной диапазон не установлен на 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;
}