DatadogでECS Fargateのメトリクス収集・監視

# 概要
サービス公開にあたり、[こちらの記事](https://qiita.com/goemp/items/4ee8c4d3030ad7dd6505)に続き、Datadog IntegrationsによるAWSのECS Fargateのメトリクス収集と監視方法についてまとめていきます。コンテナの作成などについてはAWSのCloudFormationを利用して説明します。

![スクリーンショット 2019-11-03 14.32.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/ac43c90e-a2ae-29b4-b4e4-f49740abe501.png)


参考
https://docs.datadoghq.com/ja/integrations/ecs_fargate/

# Datadog ECS Fargate Integrationsの機能
- CPU/Memoryの使用量と限界のメトリクスの収集
- Datadog Integrations又はカスタムメトリクスによるFargate上で起動しているアプリケーションの監視

なおメトリクスはECS Taskのメタデータエンドポイントによって収集されます。
このメタデータのエンドポイントはタスク定義内でのみ利用可能なため、タスク定義内に追加でDatadog Agent用のコンテナを一つ作成する必要があります。

参考
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint.html
https://docs.docker.com/engine/api/v1.30/#operation/ContainerStats

# 設定手順

1. ECS Fargate Taskの作成
2. IAM Policyの作成又は修正
3. レプリカサービスとしてタスクを実行

なお、この設定による全機能を有効にするにはDatadog Agentのバージョンが6.1.1以上である必要があります。


## 1. ECS Fargate Taskの作成

CFNの定義に基づいて,CPU, Memoryのサイズを指定し、さらに次のセクションで説明するタスク実行用のRoleなどを指定します。

続けて、ContainerDefinitionsの設定でDatadog Agent用のコンテナの設定をします。

![スクリーンショット 2019-11-03 14.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/6740f894-f1a4-2e6f-49b7-99f9f4d1af99.png)

上のように、Nameに `datadog-agent`, Imageに`datadog/agent:latest`を指定します。
さらに Cpuで整数値`10`を指定します。
環境変数として `DD_API_KEY`をキーに、値にDatadogのアカウントのAPI KEYの値を指定します。もう一つ環境変数として`ECS_FARGATE `をキーに`true`を値として設定します。

さらに、監視対象のコンテナをContainerDefinitionsに定義します。


https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html

## 2. IAM Policyの作成又は修正
ECS Fargateのメトリクス収集の権限を与えるために以下の権限をDatadog IAM Policyに追加します。

| AWS Permission | 内容 |
|:-----------|:------------|
| ecs:ListClusters  | List available clusters. |
| ecs:ListContainerInstances  | List instances of a cluster.| 
| ecs:DescribeContainerInstances |Describe instances to add metrics on resources and tasks running.|


参考
https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html

## 3. レプリカサービスとしてタスクを実行
サービススケジューラとしてレプリカ型としてサービスを作成、タスクを起動します。

参考
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs_services.html

# メトリクス収集
上の設定手順完了後、[ecs_fargae_check](https://github.com/DataDog/integrations-core/blob/master/ecs_fargate/datadog_checks/ecs_fargate/data/conf.yaml.example)がメトリクスを収集します。追加のメトリクスを収集するためにメトリクス収集対象のアプリ側のコンテナにDocke Labelを追加します。

![スクリーンショット 2019-11-03 15.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/5e437469-f376-fb68-6df4-97cf1716bab0.png)

【Docker Label設定例】

参考
https://docs.datadoghq.com/ja/integrations/faq/integration-setup-ecs-fargate/?tab=rediswebui

### DOGSTATSD
[DogStatsD](https://docs.datadoghq.com/ja/developers/dogstatsd/)によってUDPポート番号8125でメトリクスが収集されます。
DogStatsDパケットによってカスタムメトリクスを収集するためにはDatadog Agentコンテナの環境変数としてキー`DD_DOGSTATSD_NON_LOCAL_TRAFFIC`が値が`true`を設定します。

### LIVE PROCESS MONITORING
Datadog Agentコンテナの環境変数に`DD_PROCESS_AGENT_ENABLED`を値をtrueにしてセットすることでDatadogのProcess Agentを有効にします。

### そのほか環境変数
[こちら](https://docs.datadoghq.com/ja/agent/docker/?tab=standard#environment-variables)を参考にしてください。
ただし一部Fargateタイプでは利用できないものもあります。

グローバルなタギングのために、`DD_DOCKER_LABELS_AS_TAGS `を設定することが推奨されています。このメソッドにより、AgentはDocker container labelsからタグを取得します。


# クローラに基づいたメトリクス
Datadog Agentによるメトリクスの収集に加えて、 ECSのCloudWatch Metricsによるメトリクスの収集も行うことができます。Fargateを使っている場合はCPUとMemoryの使用率のメトリクスがこの方法によって収集されます。

この方法による収集を行うためには、 ECSのAWS integrationの設定を行う必要があります。
ただし、 データ取得の間隔が多くなり、かつDatadogへのレポートに遅延します。

参考
https://docs.datadoghq.com/integrations/amazon_ecs/?tab=python#data-collected

# ログ収集
AWS Firelens integrationによる方法又は`awslogs`log driverとLambda Functionを使ってログをDatadogに送ることでFargateのログをモニタリングすることができます。
Fluent Bitの設定をFargate Task内で直接できるため公式ではAWS Firelensを使った方法を推奨されています。

参考
https://docs.datadoghq.com/ja/integrations/ecs_fargate/#log-collection

# Trace Collection

**設定方法**
1. Datadog Agent Containerに環境変数としてKeyを `DD_APM_ENABLED `にValueを`true`にして追加します
2. [setup方法](https://docs.datadoghq.com/ja/tracing/setup/)に応じてアプリケーション側の設定を行います
3. アプリケーションのコンテナとDatadog Agentコンテナが同じタスク定義で起動していることを確認します

https://docs.datadoghq.com/tracing/

# 収集したメトリクスをDatadog上で確認
![スクリーンショット 2019-11-03 19.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/9a06d16a-9905-d238-1009-ef74427923ba.png)

Datadogのメニュー Infrastructure containersで対象のコンテナを指定して表示した結果になります。

# まとめ
AWS ECS Fargate上で動かしているアプリケーションのDatadogでのメトリクやログ、Traceの収集のための設定に説明しました。簡単な設定でDatadogが自動で監視設定をしてくれるのでアプリケーションの開発に集中して取り組むことができます。継続的なサービスの運用を実現するために日々監視をよりよくしていくことが大事だと思いました。