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

13

我正在尝试获取一个实例(实际上是几个实例,但只先从其中一个开始)的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个回答

28

这是一个与夏令时/时区相关的问题!

当接收来自Cloudwatch的统计数据时,您需要使用UTC时间:

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

从一些实验中看,似乎指定多个InstanceId纬度将只返回最后一个指定实例的数据(至少在未启用详细监控的情况下)。

3
目前为止我见过的最好例子! - Eagle
尺寸必须是一个列表。这个答案需要更新。 - xApple

1
当将单位设置为“兆字节”时,我也发现没有返回数据,而将单位设置为“字节”则可以返回数据。
API参考中两种方式均可。
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

0

我发现AWS/Billing指标只在一个区域-us-east-1中“实时”。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接