やりたいこと
コンテナ単位のCPU使用率をCloudWatchでメトリクス化したい。
Container Insightsでは最小粒度でタスク単位のメトリクスしか取得できないため。
前提
- Amazon ECSでContainer Insightsを有効にしている
やり方
Container InsightsがパフォーマンスログイベントをCloudWatch Logsに保存してくれる。
ここには使用中CPUユニット数を示すCpuUtilized
と予約済ユニット数を示すCpuReserved
というフィールドがあるので、この2つをメトリクス化する。(CPUユニットについてはこちらの記事が分かりやすい)
{
"Version": "0",
"Type": "Container",
"ContainerName": "api",
"TaskId": "XXXX",
"TaskDefinitionFamily": "XXXX",
"TaskDefinitionRevision": "5",
"ServiceName": "XXXX",
"ClusterName": "XXXX",
"Image": "XXXX",
"ContainerKnownStatus": "RUNNING",
"Timestamp": 1636001760000,
"CpuUtilized": 199.21151692708335,
"CpuReserved": 1024,
"MemoryUtilized": 510,
"MemoryReserved": 1024,
"StorageReadBytes": 0,
"StorageWriteBytes": 36864,
"NetworkRxBytes": 50032,
"NetworkRxDropped": 0,
"NetworkRxErrors": 0,
"NetworkRxPackets": 524704,
"NetworkTxBytes": 49958,
"NetworkTxDropped": 0,
"NetworkTxErrors": 0,
"NetworkTxPackets": 374928
}
手順
CloudWatch Logsの画面からパフォーマンスログイベントを選択します。
メトリクスフィルターのタブから新規作成します。

まずCpuUtilized
をメトリクス化していきます。
フィルターパターンにはコンテナ名を指定します。ここでは{ $.ContainerName = "api" }
のようにして一意のコンテナのログだけが抽出されるようにします。
パターンをテストし、一意のコンテナのログだけが抽出されていることを確認してください。

メトリクス値を$.CpuUtilized
とします。この他の項目は任意なのでお好きに設定してください。

こちらも任意ですが指定しておくとよいです。
ログ内のフィールドをディメンションとして設定することでフィルタリングしやすくなります。

変更を保存します。

以上でCpuUtilized
のメトリクス化は完了です。
同じ要領でCpuReserved
もメトリクス化してください。
しばらくすると設定した名前空間にメトリクスが保存されるようになります。

数式を追加するなどしてお好きに加工してください。
下図では(CpuUtilized/CpuReserved)*100
として目的だったコンテナ単位でのCPU使用率を取得しています。
おわり。