amazon-web-services - CLI 和 SDK 之间的 AWS Cloudwatch GetMetricData 差异
问题描述
我正在尝试执行一个简单的 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 似乎都没有。有什么提示吗?
解决方案
所以问题出在MaxDataPoints
.
根据文档:
请求在分页前应返回的最大数据点数。如果省略此项,则使用默认值 100,800。
但是,在实践中,将该值设置得太低会导致不返回任何值。我可以推测该值被用来限制查询中检查的度量点或周期的数量,而不是返回。
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()),
...
也许有人可以解释这种行为?
推荐阅读
- angular - 我可以为 Angular 中每个加载的组件创建一个服务实例吗?
- java - 使用 JGrapht 的 BreadthFirstIterator,通过选择一种特定的边类型
- arduino - wl-330 nrf24l01+pa+lna 只接收 W
- sql-server - 如何获取 SQL Server 系统 procs 列表
- apache-spark - 增量表统计信息
- r - 如何将 Corrplot 与手动创建的相关矩阵一起使用(列表类型)
- google-bigquery - Bigquery将字符串转换为时间戳
- csv - Hadoop 独立集群 Pyspark 加载 CSV 文件不存在(hdfs://home/usr/filepath.csv)
- node.js - 如何使用 SuperTest 进行单元测试以使用 multer 发布文件
- r - R- 仅不加载所有 5 个变量 1