AWS Container InsightのメトリクスをDatadogで表示し、CloudWatch Logsと連携する

## はじめに

Datadogのメトリクスやログは[統合タグ付け](https://docs.datadoghq.com/ja/getting_started/tagging/unified_service_tagging/)を設定すると、関係するデータ間を自動的にリンクしてくれるのでとても使いやすいのですが、統合タグ付けが設定されていないデータもダッシュボードのContext Linkを設定することで行き来することができます。

今回はこの頃AWSで強化された下記のメトリクスをカスタムメトリクスとしてDatadogに連携したのち、作成したダッシュボードからCloudWatch Logsに連携するようにContext Linkを設定してみます。

https://aws.amazon.com/jp/blogs/news/container-insights-with-enhanced-observability-now-available-in-amazon-ecs/

## オブザーバビリティーが強化されたContainer Insight

2024年12月に公開された改善で、EKSではすでに提供されていたコンテナレベルのメトリクスをECSでも利用できるようにした改善です。これまでもCloudWatch Logsに出力されたContainer Insightのログを集計すれば同様の情報は手に入ったのですが、メトリクスとして提供されることでECSのサービスに含まれるタスクやコンテナごとのメトリクスを簡単に視覚化することができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/0c403ea3-8496-7717-45d1-a27fdce260ce.png)

Datadogには似たような（ほぼ同じ）機能としてライブコンテナがあるのですが、こちらは[Fargateとのインテグレーション](https://docs.datadoghq.com/ja/integrations/ecs_fargate/)が設定されたサービスのみ表示されるのと、表示できる期間が36時間と短いので注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/2cb37259-6a2b-3625-1058-c9b3b20b2a35.png)

## ContainerInsightで収集できるメトリクス

下のキャプチャはAWS側でオブザーバビリティーが強化されたContainer Insightを有効にしていないテナントと、有効にしたテナントで流れてきたメトリクスサマリーをContainer Insightという文字でフィルタした例です。
タスクごとやコンテナごとのCPU、メモリ、ネットワーク、ストレージアクセスなどの情報を取得できるようになったことがわかります。

有効にしていないテナントのメトリクスサマリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/156e0906-e45c-a541-09b2-ad3c413290c9.png)

有効にしたテナントのメトリクスサマリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/3bca517c-6f2c-d112-022e-ddfe38a6fb10.png)

下のグラフは`ecs.containerinsights.ContainerCpuUtilized`をサービス、タスク、コンテナごとのCPU利用率を表示した例です。
このメトリクスを使うと、Fargateとのインテグレーションを設定していないタスクについてもコンテナレベルのメトリクスをDatadogへ表示できるようになります。また、メトリクスとして取り込まれたデータは[APIクローラーが収集したデータとして15か月保存される](https://docs.datadoghq.com/ja/developers/guide/data-collection-resolution-retention/)ので、これまでよりもかなり長い期間表示することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/70428afd-4ffe-db79-eed8-cba8f98ee4ca.png)

## Context Menuを追加する
これだけでもだいぶうれしいのですが、せっかくDatadogを利用しているので、ダッシュボードにContext Linkを作成してグラフからCloudWatch Logs Insightのクエリへ移動できるようにしてみましょう。

### ダッシュボードにコンテナごとのCPU利用率を表示する

コンテナごとのCPU利用率は`ecs.containerinsights.ContainerCpuUtilized`メトリクスで提供されるので、コンテナごとのCPU利用率をグラフに表示させたい場合次のようなグラフを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/975664ec-a0b7-25c4-a9ee-7b7a14a87e29.png)


### DatadogのダッシュボードからCloudWatch Logs Insightに連携する

DatadogのダッシュボードからDatadogにログの連携をしていないコンテナのログをCloudWatch Logs Insightで検索するには、次のようにグラフを設定します。

CloudWatch Logs Insightでログを検索するクエリとURLから確認していきます。

ECSではawslogsログドライバーでCloudWatch Logsにログを出力する場合、LogStream名は`awslogs-stream-prefix`/`コンテナの名前`/`タスク ID`という[ルールで設定](https://dev.classmethod.jp/articles/tsnote-ecs-awslogs-log-stream-naming-conventions/)されます。

例えば、awslogs-stream-prefixを標準の`ecs`にした場合、特定のタスク（7ab9a90e0f6axxxxxxxxxxxxxxxxxxx）に含まれる`app`コンテナのログを検索するCWL Insightのクエリは次のようになります。

```
filter @logStream = 'ecs/app/7ab9a90e0f6axxxxxxxxxxxxxxxxxxx'
| fields @timestamp, @logStream, @message
```

ロググループ`MyApp`に対し直近６０分間のログを対象に検索する場合、CWL InsightのURLは次のようになります（見やすくするため改行を追加していますが本来は1行のURLです）。

```
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1
#logsV2:logs-insights$3F
queryDetail$3D~(end~0~start~-3600~timeType~'RELATIVE~tz~'LOCAL~unit~'seconds~
editorString~'
filter*20*40logStream*20*3d*20*27ecs*2fapp*2f7ab9a90e0f6axxxxxxxxxxxxxxxxxxx*27*0a*
7c*20fields*20*40timestamp*2c*20*40logStream*2c*20*40message
~source~(~'*2fecs*2fMyApp)~lang~'CWLI)
```

コンテナのタスクIDは{{taskid.value}}で参照できるので、コンテキストリンクのURLは次のようになります。

```
https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1
#logsV2:logs-insights$3F
queryDetail$3D~(end~0~start~-3600~timeType~'RELATIVE~tz~'LOCAL~unit~'seconds~
editorString~'
filter*20*40logStream*20*3d*20*27ecs*2fapp*2f{{taskid.value}}*27*0a*
7c*20fields*20*40timestamp*2c*20*40logStream*2c*20*40message
~source~(~'*2fecs*2fMyApp)~lang~'CWLI)
```

Context Linksの`+ Add a Context Link`をクリックしメニューを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/3e3fa7c3-e7bd-1621-ee27-c59619c22a40.png)

適当に名前を付け、URLにはCWL InsightのクエリURLを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/fe6c2b0c-7fb7-518f-346c-1d43f7ac4b28.png)

メトリクスをクリックすると、設定した値でコンテキストリンクが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/735b8251-620f-d4dc-30a1-8ec22d6dd992.png)

クリックすると、CWL Insightに移動しそのまま検索できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/fd487897-c148-ee3a-198e-5ac490a9fcc5.png)

## おわりに

DatadogのダッシュボードでAWSのカスタムメトリクスを表示すると、関連するデータへのリンクを簡単に追加することができるようになります。最初はダッシュボードをカスタマイズするというと少し難しく感じますが設定してみると意外と簡単にできるのでぜひ試してみてください。