使用boto3 get_metric_statistics()返回的数据的采样率

时间:2017-08-25 13:20:06

标签: amazon-web-services boto boto3 amazon-cloudwatch amazon-cloudwatch-metrics

文档在这里......

http://boto3.readthedocs.io/en/latest/reference/services/cloudwatch.html#CloudWatch.Client.get_metric_statistics

这是我们的电话

response = cloudwatch.get_metric_statistics(
    Namespace='AWS/EC2', 
    MetricName='CPUUtilization', #reported every 5 minutes

    Dimensions=[
        {
            'Name': 'AutoScalingGroupName', 
            'Value': 'Celery-AutoScalingGroup' 
        },
    ],
    StartTime=now - datetime.timedelta(minutes=12),
    EndTime=now,
    Period=60, #I can't figure out what exactly changing this is doing
    Statistics=['Average','SampleCount','Sum','Minimum','Maximum'],
)

以下是我们的回复

>>> response['Datapoints']
[{u'SampleCount': 5.0, u'Timestamp': datetime.datetime(2017, 8, 25, 12, 46, tzinfo=tzutc()), u'Average': 0.05, u'Maximum': 0.17, u'Minimum': 0.0, u'Sum': 0.25, u'Unit': 'Percent'}, {u'SampleCount': 5.0, u'Timestamp': datetime.datetime(2017, 8, 25, 12, 51, tzinfo=tzutc()), u'Average': 0.034, u'Maximum': 0.08, u'Minimum': 0.0, u'Sum': 0.17, u'Unit': 'Percent'}]

这是我的问题

查看返回列表中的第一个字典。我想,SampleCount为5是有意义的,因为我们的周期为60(秒),CloudWatch每5分钟提供一次“CPUUtilization”指标。

但如果我改变句号,说3分钟(180),我仍然得到一个5的SampleCount(我期望1或2)。

这是一个问题,因为我想要平均值,但我认为它平均有5个数据点,其中只有2个是有效的(开头和结尾,对应于Min和Max,这是CloudWatch指标在某个时间t和在时间t + 5分钟的下一次报告。

平均为3个中间0值数据点,使得平均值为(最小值+最大值+ 0 + 0 + 0)/ 5

我可以得到最小值,最大值加上它们并除以2以获得更好的读数 - 但我希望有人能够准确地解释'周期'参数正在做什么。 就像我说的那样,将它更改为360并没有改变SampleCount,但当我将其更改为600时,我的SampleCount突然变为10.0(一个数据点)(这确实有意义)。

1 个答案:

答案 0 :(得分:1)

可以通过两种不同的方式将数据发布到CloudWatch:

  1. 您可以逐个发布您的观察结果,让CloudWatch进行聚合。
  2. 您可以自己汇总数据并发布统计信息集(SampleCount,Sum,Minimum,Maximum)。
  3. 如果使用方法1发布数据,您将获得您期望的行为。但是,如果使用方法2发布数据,则会受到已发布数据的粒度限制。

    如果ec2将数据聚合5分钟然后发布统计集,那么在3分钟级别请求数据是没有意义的。但是,如果您请求的数据周期为数据周期的倍数(例如10分钟),则可以计算统计数据,CloudWatch会执行此操作。