【问题标题】:AWS Cloudwatch GetMetricData Discrepancy between CLI and SDKsCLI 和 SDK 之间的 AWS Cloudwatch GetMetricData 差异
【发布时间】:2020-05-27 00:26:18
【问题描述】:

我正在尝试执行简单的 CloudWatch 查询以获取一些指标数据。我想获得实际的指标。使用 AWS CLI 我得到了预期的行为。但是,使用客户端 SDK(尝试了 Python 的 Boto 和 Java 的 SDK),相同的(看似)查询没有返回我的指标。

我的查询条件在query.json中定义:

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

CLI 这行得通。返回我的指标值和时间戳

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 会返回度量值,但我尝试过的两个 CDK 似乎都没有。有什么提示吗?

【问题讨论】:

  • 可能由于 cli 和 sdk 如何处理日期的差异?一个可以使用UTC时间,另一个可以使用当地时间?您是否尝试过扩展 boto3 中的范围?时间范围是一天,如果使用您的本地时间或UTC时间,您的数据点可能超出范围?
  • 好主意,我认为你是对的,我的 boto 示例滥用了日期规范。不过仍然没有变化,我在时间范围内有完整的指标。

标签: amazon-web-services boto3 amazon-cloudwatch aws-java-sdk


【解决方案1】:

所以问题出在MaxDataPoints

根据docs

请求在分页前应返回的最大数据点数。如果您省略此项,则使用默认值 100,800。

但是,实际上,将该值设置得太低会导致返回 no 值。我可以推测该值被用于限制查询中检查的度量点或周期的数量,而不是返回。

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'}],...

对比

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()),
...

也许有人可以解释这种行为?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2016-01-03
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多