如何使用Boto获取实例的最新Cloudwatch指标数据?

时间:2013-05-05 11:00:48

标签: python amazon-web-services boto amazon-cloudwatch

我正在尝试获取实例的CPU利用率的最新数据(实际上,有几个实例,但只有一个开始),但是以下调用不会返回任何数据:

cw = boto.cloudwatch.connect_to_region(Region)
cw.get_metric_statistics(
    300,
    datetime.datetime.now() - datetime.timedelta(seconds=600),
    datetime.datetime.now(),
    'CPUUtilization',
    'AWS/EC2',
    'Average',
    dimensions={'InstanceId':['i-11111111']}
    # for stats across multiple instances:
    # dimensions={'InstanceId':['i-11111111', 'i-22222222', 'i-33333333']}
)

其他网站上的各个帖子表明检查区域是正确的,检查period(第一个参数)是60的倍数,(如果没有启用详细监控)大于或等于300.我检查了所有这些东西,但我仍然没有得到任何数据。

3 个答案:

答案 0 :(得分:24)

这是夏令时/时区问题!

从Cloudwatch接收统计信息时,您需要使用UTC时间:

    cw = boto.cloudwatch.connect_to_region(Region)
    cw.get_metric_statistics(
        300,
        datetime.datetime.utcnow() - datetime.timedelta(seconds=600),
        datetime.datetime.utcnow(),
        'CPUUtilization',
        'AWS/EC2',
        'Average',
        dimensions={'InstanceId':['i-11111111']}
   )

从某些实验中,似乎指定多个InstanceId维度将导致仅针对最后指定实例的数据(至少如果未启用详细监视)。

答案 1 :(得分:1)

我还看到将设备设置为“兆字节”时没有返回数据,而将单位设置为“字节”则返回数据。

API reference允许这两种情况。

data = conn.get_metric_statistics(period=60,start_time=start,end_time=end,metric_name="NetworkOut",namespace="AWS/EC2",statistics="Average",unit="Megabytes",dimensions={'InstanceId':'XXXXXX'})
print "data length: %d"%len(data)
    # data length: 0


data = conn.get_metric_statistics(period=60,start_time=start,end_time=end,metric_name="NetworkOut",namespace="AWS/EC2",statistics="Average",unit="Bytes",dimensions={'InstanceId':'XXXXXX'})
print "data length: %d"%len(data)
    # data length: 59

答案 2 :(得分:0)

我发现AWS/Billing指标仅在一个地区“生活” - us-east-1

此外,如果您尝试从CloudWatch获取超过1440个数据点,AWS CLI(aws cloudwatch get-metric-statistics)将会出错。 如果遇到它,请设置较大的--period

为避免陷阱,您可以使用我的EC2_Metrics_Plotter