AWS Несоответствие GetMetricData Cloudwatch между CLI и SDK - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь выполнить простой запрос CloudWatch, чтобы получить некоторые метри c данные. Я хочу получить актуальные показатели. Используя AWS CLI, я получаю ожидаемое поведение. Однако при использовании клиентских SDK (пробовал оба пакета Boto Python и SDK Java) один и тот же (кажущийся) запрос не возвращает мои показатели.

Мои критерии запроса определены в query.json:

[
    {
        "Id": "test",
        "MetricStat": {
            "Metric": {
                "Namespace": "MyNamespace",
                "MetricName": "MyMetric",
                "Dimensions": [
                    {
                        "Name": "SOURCE",
                        "Value": "TEST"
                    }
                ]
            },
            "Period": 3600,
            "Stat": "SampleCount",
            "Unit":"Seconds"
            },
        "ReturnData": true
    }
]

CLI это работает. Возвращает мою метрику c значение и метку времени

aws cloudwatch get-metric-data --max-items 10 --start-time "2020-05-01T00:00:00Z" --end-time "2020-06-01T00:00:00Z" --metric-data-queries file://./query.json
{
    "MetricDataResults": [
        {
            "Id": "test",
            "Label": "MyMetric",
            "Timestamps": [
                "2020-05-15T13:00:00Z",
...
            ],
            "Values": [
                1.0,
...
            ],
            "StatusCode": "Complete"
        }
    ],
    "Messages": []
}

Boto не возвращает метрики даже из того же файла

In [77]: cw.get_metric_data(MetricDataQueries=json.load(open("query.json")), StartTime=datetime.datetime(2020,5,1), EndTime=datetime.datetime(2020,6,1), MaxDatapoints=10)
Out [77]: {'MetricDataResults': [{'Id': 'test',
   'Label': 'MyMetric',
   'Timestamps': [],       <--Why isn't this populated?
   'Values': [],
   'StatusCode': 'PartialData'}],

Java Примерно те же критерии ввода

MetricDataQuery query = new MetricDataQuery().withReturnData(true);
query.setMetricStat(new MetricStat()
                    .withStat("SampleCount")
                    .withPeriod(36000)
                    .withMetric(
                            new Metric()
                                    .withMetricName("MyMetric")
                                    .withNamespace("MyNamespace)
                                    .withDimensions(new Dimension()
                                            .withName("SOURCE")
                                            .withValue("TEST"))));

cw.getMetricData(new GetMetricDataRequest()
                    .withStartTime(Date.from(Instant.now().minus(100, ChronoUnit.DAYS)))
                    .withEndTime(Date.from(Instant.now()))
                    .withScanBy(ScanBy.TimestampDescending)
                    .withMaxDatapoints(10)
                    .withMetricDataQueries(query))


// Result ==> {Id: TestQuery,Label: MyMetric,Timestamps: [],Values: [],StatusCode: PartialData,Messages: []}

Я не понимаю, почему cli вернет значения metri c, но оба CDK, которые я пробовал, похоже, не верят. Есть подсказки?

1 Ответ

0 голосов
/ 27 мая 2020

Значит, проблема была с MaxDataPoints.

Согласно docs :

Максимальное количество точек данных, которые запрос должен вернуть перед разбивкой на страницы. Если вы опустите это значение, используется значение по умолчанию 100 800.

Однако на практике установка слишком низкого значения приводит к возврату no значений. Я могу предположить, что это значение используется для ограничения количества метри c точек или периодов, проверенных в запросе, но не возвращаемых.

In [77]: cw.get_metric_data(MetricDataQueries=json.load(open("query.json")), StartTime=datetime.datetime(2020,1,5), EndTime=datetime.datetime(2020,1,6), MaxDatapoints=10)
...
{'MetricDataResults': [{'Id': 'test',
   'Label': 'Errors',
   'Timestamps': [],
   'Values': [],
   'StatusCode': 'PartialData'}],...

vs

In [78]: cw.get_metric_data(MetricDataQueries=json.load(open("query.json")), StartTime=datetime.datetime(2020,1,5), EndTime=datetime.datetime(2020,1,6), MaxDatapoints=1000)
...
{'MetricDataResults': [{'Id': 'test',
   'Label': 'Errors',
   'Timestamps': [datetime.datetime(2020, 5, 27, 15, 0, tzinfo=tzutc()),
    datetime.datetime(2020, 5, 27, 14, 0, tzinfo=tzutc()),
    datetime.datetime(2020, 5, 27, 13, 0, tzinfo=tzutc()),
...

Может быть, кто-то можно объяснить такое поведение?

...