こちらの記事を参考に、boto3を使用してCloudWatchメトリクスデータを取得しようとしました。
標準メトリクスデータは問題なく取得できたのですが、EC2のメモリ使用率等のカスタムメトリクスデータを同じように取得しようとしてもデータ件数0件でレスポンスが返されてしまったので、原因を調査しました。
原因
メトリクスが複数のディメンションで作成されている場合、取得時に全てのディメンションを指定する必要がありました。
ディメンションとは、メトリクスの一意の識別子として機能するものです。
先の記事では標準メトリクスを取得するにあたりディメンションは「InstanceId」のみの指定で十分でしたが、カスタムメトリクスでは不十分でした。
解決方法
今回は名前空間「CWAgent」の「mem_used_percent」データを取得します。
ディメンションを調べる
コンソールで下記を実行します。
$ aws cloudwatch list-metrics --namespace CWAgent
メトリクス一覧が表示されるので、お目当てのメトリクスのDimentionsを確認します。
{
"Metrics": [
{
"Namespace": "CWAgent",
"MetricName": "mem_used_percent",
"Dimensions": [
{
"Name": "InstanceId",
"Value": "i-*******"
},
{
"Name": "ImageId",
"Value": "ami-***********"
},
{
"Name": "InstanceType",
"Value": "t2.micro"
}
]
},
:
省略
mem_ussed_percentのディメンションはInstanceId
、ImageId
、InstanceType
で作成されています。
カスタムメトリクスデータを取得
boto3でデータを取得する際のディメンションの指定箇所を変更すればOKです。
import json
from datetime import datetime
import boto3
# cloudwatchのクライアント取得
client = boto3.client('cloudwatch')
response = client.get_metric_statistics(
Namespace = "CWAgent",
MetricName = "mem_used_percent",
Dimensions=[{'Name': 'InstanceId', 'Value': 'i-*******'},{'Name': 'ImageId', 'Value': 'ami-***********'}, {'Name': 'InstanceType', 'Value': 't2.micro'}],
StartTime = datetime(2022, 3, 7, 9, 0),
EndTime = datetime(2022, 3, 10, 23, 55),
Period = 300,
Statistics = ['Maximum'],
)
参考