web-dev-qa-db-ja.com

Botoを使用してインスタンスの最新のCloudwatchメトリックデータを取得するにはどうすればよいですか?

インスタンスのCPU使用率に関する最新のデータ(実際には複数のインスタンスですが、最初は1つだけです)を取得しようとしていますが、次の呼び出しではデータが返されません。

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.これらすべてをチェックしましたが、まだデータを取得していません。

13
James

これは夏時間/タイムゾーンの問題です!

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ディメンションを指定すると、最後に指定されたインスタンスのデータのみが生成されるようです(少なくとも詳細な監視が有効になっていない場合)。

26
James

また、単位を「メガバイト」に設定するとデータが返されませんでしたが、単位を「バイト」に設定するとデータが返されました。

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
1
storm_m2138

見つけた AWS/Billingメトリックは1つのリージョンでのみ「ライブ」-us-east-1

また、AWS CLI(aws cloudwatch get-metric-statistics)CloudWatchから1440を超えるデータポイントを取得しようとすると、エラーが発生します。遭遇した場合は大きく設定してください--period

落とし穴を避けるために、my EC2_Metrics_Plotter を使用できます。

0
Alex B