【Amazon ECS】コンテナ単位のCPU使用率をCloudWatchでメトリクス化する

# やりたいこと
コンテナ単位のCPU使用率をCloudWatchでメトリクス化したい。
Container Insightsでは最小粒度でタスク単位のメトリクスしか取得できないため。

# 前提
- Amazon ECSでContainer Insightsを有効にしている

# やり方
Container Insightsが[パフォーマンスログイベント](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Container-Insights-reference-performance-logs-ECS.html)をCloudWatch Logsに保存してくれる。
ここには使用中CPUユニット数を示す`CpuUtilized`と予約済ユニット数を示す`CpuReserved`というフィールドがあるので、この2つをメトリクス化する。（CPUユニットについては[こちらの記事](https://qiita.com/_akiyama_/items/e9760dd61d94b8031247)が分かりやすい）

```performance.json
{
    "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の画面からパフォーマンスログイベントを選択します。
![077)1-7 (44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/bdb2d75d-4fad-a7f5-145c-c9cf895192f8.png)

メトリクスフィルターのタブから新規作成します。
![Log groups awsecscontainerinsightswear2-service-prd-apiperformance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/115ca594-dfc7-ba20-7b21-22e3cee0726d.png)
￼
まず`CpuUtilized`をメトリクス化していきます。

フィルターパターンにはコンテナ名を指定します。ここでは`{ $.ContainerName = "api" }`のようにして一意のコンテナのログだけが抽出されるようにします。
![717-3-1FR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/9a20b5c3-c77b-9ab0-a360-6dff54e93654.png)

パターンをテストし、一意のコンテナのログだけが抽出されていることを確認してください。
![FargateTelemetry-6603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/53d39498-ebba-cbc7-57de-a65b4b59bf85.png)
￼
メトリクス値を`$.CpuUtilized`とします。この他の項目は任意なのでお好きに設定してください。
![ARUZKOHILT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/ad892575-c612-f198-5828-d15e7e2a0360.png)
￼
こちらも任意ですが指定しておくとよいです。
ログ内のフィールドをディメンションとして設定することでフィルタリングしやすくなります。
![ContainerName.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/6aa02abe-cd21-27c1-c318-c725aa41f4ba.png)
￼
変更を保存します。
![Review and confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/7d930f70-376d-2185-784c-abab0d3e1a50.png)
￼
以上で`CpuUtilized`のメトリクス化は完了です。

同じ要領で`CpuReserved`もメトリクス化してください。
![Review and confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/77c4743d-f8a9-a0c3-2b2d-c9f11dbd32b7.png)

しばらくすると設定した名前空間にメトリクスが保存されるようになります。
![0550 0550 0550 0550 0551 0551 0551 0551 0552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/60045d5d-3e69-d0a7-ba26-3f11ae677591.png)
￼
[数式を追加する](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/using-metric-math.html)などしてお好きに加工してください。
下図では`(CpuUtilized/CpuReserved)*100`として目的だったコンテナ単位でのCPU使用率を取得しています。
![api CpuUtilizedapi_CpuReserved100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619762/2d9d92fb-8731-f9ca-dd69-030e91480b60.png)

おわり。