ECS Fargate で実行されているすべてのコンテナからメトリクスを取得します。
Datadog Agent は、ECS のタスクメタデータエンドポイントからタスク定義のコンテナのメトリクスを取得します。このエンドポイントに関する ECS のドキュメントには、以下のように記載されています。
このエンドポイントは、タスクに関連付けられたすべてのコンテナの Docker 統計 JSON を返します。返される統計の詳細については、Docker API ドキュメント内の ContainerStats を参照してください。
タスクメタデータエンドポイントは、タスク定義自体の内部からのみ使用できます。このため、Datadog Agent をタスク定義内の追加コンテナとして実行する必要があります。
このメトリクスの収集を有効にするために必要な構成は、タスク定義内で環境変数 ECS_FARGATE
を "true"
にすることだけです。
以下の手順では、AWS ECS Fargate 内で Datadog Container Agent をセットアップします。注: Fargate インテグレーションを最大限活用するには、Datadog Agent バージョン 6.1.1 以降が必要です。
Datadog Agent を持たないタスクも Cloudwatch からメトリクスを報告しますが、Autodiscovery、詳細なコンテナメトリクス、トレーシングなどの機能には Agent が必要です。さらに、Cloudwatch メトリクスは粒度が低く、Datadog Agent から直接発送されるメトリクスより報告のレイテンシーが高くなります。
Datadog で ECS Fargate タスクを監視するには、アプリケーションと同じタスク定義内のコンテナとして Agent を実行します。Datadog でメトリクスを収集するには、各タスク定義にアプリケーションコンテナのほかに Datadog Agent コンテナを含める必要があります。以下のセットアップ手順を実行します。
Fargate の主要な作業単位はタスクで、これはタスク定義内で設定されます。タスク定義は、Kubernetes のポッドに相当します。タスク定義には 1 つ以上のコンテナが含まれる必要があります。Datadog Agent を実行するには、アプリケーションコンテナおよび Datadog Agent コンテナを実行するためのタスク定義を作成します。
以下の手順は、AWS CLI ツールまたは Amazon Web Console を使用したタスクの構成方法を示します。
my-app-and-datadog
など)。datadog-agent
と入力します。datadog/agent:latest
と入力します。256
を入力します。10
と入力します。DD_API_KEY
を追加し、Datadog API キーを値として入力します。シークレットを s3 に保存する場合は、ECS 構成ガイドを参照してください。ECS_FARGATE
と値 true
を使用して、もう 1 つ環境変数を追加します。Add をクリックしてコンテナを追加します。DD_SITE
と値 datadoghq.eu
を使用して別の環境変数を追加します。ECS_FARGATE
は既に "true"
に設定されています。aws ecs register-task-definition --cli-input-json file://<ファイルへのパス>/datadog-agent-ecs-fargate.json
AWS CloudFormation テンプレートを使用して Fargate コンテナを構成することができます。CloudFormation テンプレート内で AWS::ECS::TaskDefinition
リソースを使用して Amazon ECS タスクを設定し、そのタスクで必要な起動タイプとして FARGATE
を指定します。以下の例のように、ログ管理の構成に Datadog
オプションを使用することも可能です。
Resources:
ECSTDNJH3:
Type: 'AWS::ECS::TaskDefinition'
Properties:
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Cpu: 256
Memory: 1GB
ContainerDefinitions:
- Name: tomcat-test
Image: 'tomcat:jdk8-adoptopenjdk-openj9'
LogConfiguration:
LogDriver: awsfirelens
Options:
Name: datadog
Host: http-intake.logs.datadoghq.com
TLS: 'on'
dd_service: test-service
dd_source: test-source
provider: ecs
apikey: <API_KEY>
MemoryReservation: 500
- Name: log_router
Image: 'amazon/aws-for-fluent-bit:latest'
Essential: true
FirelensConfiguration:
Type: fluentbit
Options:
enable-ecs-log-metadata: true
MemoryReservation: 50
注: プレーンテキストで apikey
を公開しないようにするには、TaskDefinition シークレットを使用します。
CloudFormation のテンプレートと統語法に関する詳細は、AWS CloudFormation ドキュメントをご参照ください。
ECS Fargate のメトリクスを収集するには、次のアクセス許可を Datadog IAM ポリシーに追加します。ECS ポリシーの詳細については、AWS Web サイトのガイドを参照してください。
AWS アクセス許可 | 説明 |
---|---|
ecs:ListClusters | 使用できるクラスターをリストします。 |
ecs:ListContainerInstances | クラスターのインスタンスをリストします。 |
ecs:DescribeContainerInstances | リソースおよび実行中のタスクに関するメトリクスを追加するためのインスタンスを記述します。 |
ECS Fargate では、タスクを Replica サービスとして実行するオプションしかありません。Datadog Agent は、アプリケーションやインテグレーションコンテナと同じタスク定義内で実行されます。
AWS CLI ツールを使用して次のコマンドを実行します。
注: Fargate バージョン 1.1.0 以降が必要です。したがって、以下のコマンドでは、プラットフォームバージョンを指定します。
必要に応じてクラスターを作成します。
aws ecs create-cluster --cluster-name "<クラスター名>"
クラスターのサービスとしてタスクを実行します。
aws ecs run-task --cluster <クラスター名> \
--network-configuration "awsvpcConfiguration={subnets=["<プライベート_サブネット>"],securityGroups=["<セキュリティ_グループ>"]}" \
--task-definition arn:aws:ecs:us-east-1:<AWS_アカウント番号>:task-definition/<タスク名>:1 \
--region <AWS_リージョン> --launch-type FARGATE --platform-version 1.1.0
1
と入力し、Next step ボタンをクリックします。上述のように Datadog Agent をセットアップすると、オートディスカバリーを有効にした状態で ecs_fargate チェックがメトリクスを収集します。その他のメトリクスを収集するには、同じタスク内の他のコンテナに Docker ラベルを追加します。
インテグレーションメトリクスの収集の詳細については、ECS Fargate のインテグレーションセットアップを参照してください。
メトリクスは DogStatsD を使用して UDP ポート 8125 を介して収集されます。
他のコンテナからの DogStatsD パケットをリスニングすることによってカスタムメトリクスを送信するには、Datadog Agent コンテナ内の環境変数 DD_DOGSTATSD_NON_LOCAL_TRAFFIC
を true
に設定します。
Docker Agent コンテナと共に使用できる環境変数については、Docker Agent ページを参照してください。注: 一部の変数は Fargate では使用できません。
グローバルなタグ付けには、DD_DOCKER_LABELS_AS_TAGS
の使用をお勧めします。Agent は、この方法を使用して、Docker コンテナラベルからタグを取得します。それには、他の Docker コンテナに適切なラベルを追加する必要があります。ラベルは、タスク定義で直接追加できます。
Agent コンテナのフォーマット
{
"name": "DD_DOCKER_LABELS_AS_TAGS",
"value": "{\"<収集するラベル名>\":\"<DATADOG_用タグキー>\"}"
}
Agent コンテナの例
{
"name": "DD_DOCKER_LABELS_AS_TAGS",
"value": "{\"com.docker.compose.service\":\"service_name\"}"
}
注: DD_HOSTNAME
を使用しないでください。Fargate には、ユーザーに対するホストという概念がないからです。従来からホストタグを割り当てるために DD_TAGS
が使用されていますが、Datadog Agent バージョン 6.13.0 では、環境変数を使用してインテグレーションメトリクスにグローバルタグを設定することもできます。
Datadog Agent によって収集されるメトリクスのほかに、Datadog には CloudWatch ベースの ECS インテグレーションがあります。このインテグレーションは、Amazon ECS CloudWatch メトリクスを収集します。
そこに記載されているように、Fargate タスクも次のようにメトリクスを報告します。
使用できるメトリクスは、クラスター内のタスクとサービスの起動タイプによって異なります。サービスに Fargate 起動タイプを使用している場合は、サービスの監視に役立つように、CPU とメモリの使用率メトリクスが提供されます。
この方法は Datadog Agent を使用しないため、インテグレーションタイルで ECS をチェックすることで、Datadog の AWS インテグレーションを構成する必要があります。これで、自動的に Datadog アプリケーションが CloudWatch メトリクス (Datadog 内の aws.ecs.*
ネームスペースを使用) を取得します。ドキュメントの収集データセクションを参照してください。
必要なメトリクスがこれだけの場合は、このインテグレーションに依存して CloudWatch メトリクスを収集できます。注: CloudWatch データは粒度が低く (有効にした監視の種類に応じて 1-5 分)、Datadog への報告にも遅延があります。これは、Agent を使用して Datadog にデータをプッシュするのではなく、AWS の API 制限の範囲内で CloudWatch からデータを収集する必要があるためです。
Datadog のデフォルトの CloudWatch クローラーは、10 分ごとにメトリクスをポーリングします。クローリングスケジュールを速くする必要がある場合は、それが可能かどうかを Datadog のサポートチームにお問い合わせください。注: CloudWatch の API 呼び出しは課金対象なので、AWS 側のコストが増大します。
Datadogs Fluentbit アウトプットプラグインに構築されている AWS FireLens インテグレーションを使用してログを Datadog に送信したり、awslogs
ログドライバーと Lambda 関数を使用してログをルーティングしたりすることで、Fargate ログを監視できます。AWS FireLens を使用すると Fluent Bit を Fargate タスクで直接構成できるため、Datadog では AWS FireLens の使用をお勧めしています。
Datadog の Fluent Bit アウトプットプラグインに組み込まれている AWS FireLens インテグレーションを構成して、監視している FireLens のログデータを Datadog ログと接続します。
Fargate タスクの FireLens ログルーターコンテナで Fluent Bit を有効化します。FireLens の有効化については、専用の AWS Firelens ドキュメントを参照してください。Fargate コンテナの定義については、AWS コンテナ定義ドキュメントを参照してください。AWS では、リージョン別 Docker イメージの使用を推奨しています。下記に、Fluent Bit イメージが構成されたタスク定義の例を示します。
{
"essential": true,
"image": "amazon/aws-for-fluent-bit:latest",
"name": "log_router",
"firelensConfiguration": {
"type": "fluentbit",
"options": { "enable-ecs-log-metadata": "true" }
}
}
コンテナがシリアル化された JSON ログを stdout 上で公開している場合は、ログが Datadog 内で正しくパースされるよう、次の 追加 Firelens コンフィギュレーションを使用する必要があります。
{
"essential": true,
"image": "amazon/aws-for-fluent-bit:latest",
"name": "log_router",
"firelensConfiguration": {
"type": "fluentbit",
"options": {
"enable-ecs-log-metadata": "true",
"config-file-type": "file",
"config-file-value": "/fluent-bit/configs/parse-json.conf"
}
}
}
これにより、シリアル化された JSON が log:
フィールドから上位レベルのフィールドに変換されます。詳細については、JSON がシリアル化されたコンテナの stdout ログをパースしている AWS サンプルを参照してください。
次に、同じ Fargate タスクで、AWS FireLens をログドライバーとして使用し、Fluent Bit にデータが出力されるようにログコンフィギュレーションを定義します。下記に、ログドライバーに FireLens が使用され、Fluent Bit にデータを出力しているタスク定義の例を示します。
{
"logConfiguration": {
"logDriver": "awsfirelens",
"options": {
"Name": "datadog",
"apikey": "<DATADOG_API_KEY>",
"Host": "http-intake.logs.datadoghq.com",
"dd_service": "firelens-test",
"dd_source": "redis",
"dd_message_key": "log",
"dd_tags": "project:fluentbit",
"TLS": "on",
"provider": "ecs"
}
}
}
注: Datadog EU サイトのオーガニゼーションをご利用の場合は、代わりに Host
オプションとして http-intake.logs.datadoghq.eu
を使用してください。ご利用可能なパラメーターの全リストは Datadog Fluentbit ドキュメントに記載されています。
これで、Fargate タスクの実行中は常に、Fargate タスクが管理するコンテナの情報を監視しながら、Fluent Bit から Datadog にコンテナログが送信されるようになります。Log Explorer ページで生ログを確認したり、ログ用のモニターを作成し Live Container ビューで確認したりすることが可能です。
awslogs
ログドライバーと Lambda 関数を使用して Fargate ログを監視し、Datadog にルーティングします。
タスクに Fargate AwsLogDriver を定義します。手順については、AWS Fargate 開発者ガイドを参照してください。
Fargate タスク定義は、ログ構成で awslogs ログドライバーのみをサポートします。これは、Fargate タスクがログ情報を Amazon CloudWatch Logs に送信するように構成します。次は、awslogs ログドライバーを構成するためのタスク定義のスニペットです。
{
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/fargate-task-definition",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
}
}
タスク定義で awslogs ログドライバーを使用して、コンテナログを CloudWatch Logs に送信する方法については、awslogs ログドライバーを使用するを参照してください。このドライバーは、コンテナが生成したログを収集し、CloudWatch に直接送信します。
最後に、Lambda 関数を使用して CloudWatch からログを収集し、Datadog に送信します。
上の手順に従ってタスク定義に Datadog Agent コンテナを追加し、追加の環境変数 DD_APM_ENABLED
を true
に設定し、ポートマッピングでホストポート(8126 と tcp プロトコルを使用)を設定します。
現在のセットアップに基づいてアプリケーションをインスツルメントします。
アプリケーションが Datadog Agent コンテナと同じタスク定義内で実行されていることを確認します。
ecs.fargate.io.ops.write (rate) | # write operations to the disk |
ecs.fargate.io.bytes.write (rate) | # bytes written to the disk Shown as byte |
ecs.fargate.io.ops.read (rate) | # read operation on the disk |
ecs.fargate.io.bytes.read (rate) | # bytes read on the disk Shown as byte |
ecs.fargate.cpu.user (gauge) | Total CPU time consumed per container Shown as nanosecond |
ecs.fargate.cpu.system (gauge) | Total CPU time consumed by the system Shown as nanosecond |
ecs.fargate.cpu.limit (gauge) | Limit in percent of the CPU usage Shown as percent |
ecs.fargate.cpu.percent (gauge) | Percentage of CPU used per container Shown as percent |
ecs.fargate.mem.cache (gauge) | # of bytes of page cache memory Shown as byte |
ecs.fargate.mem.active_file (gauge) | # of bytes of file-backed memory on active LRU list Shown as byte |
ecs.fargate.mem.inactive_file (gauge) | # of bytes of file-backed memory on inactive LRU list Shown as byte |
ecs.fargate.mem.limit (gauge) | # of bytes memory limit Shown as byte |
ecs.fargate.mem.active_anon (gauge) | # of bytes of anonymous and swap cache memory on active LRU list Shown as byte |
ecs.fargate.mem.usage (gauge) | # of bytes of memory used Shown as byte |
ecs.fargate.mem.rss (gauge) | # of bytes of anonymous and swap cache memory (includes transparent hugepages) Shown as byte |
ecs.fargate.mem.pgpgout (rate) | # of uncharging events to the memory cgroup. The uncharging event happens each time a page is unaccounted from the cgroup |
ecs.fargate.mem.pgpgin (rate) | # of charging events to the memory cgroup. The charging event happens each time a page is accounted as either mapped anon page(RSS) or cache page(Page Cache) to the cgroup. |
ecs.fargate.mem.pgfault (rate) | # of page faults per second |
ecs.fargate.mem.pgmajfault (rate) | # of major page faults per second |
ecs.fargate.mem.mapped_file (gauge) | # of bytes of mapped file (includes tmpfs/shmem) Shown as byte |
ecs.fargate.mem.max_usage (gauge) | Show max memory usage recorded Shown as byte |
ecs.fargate.mem.hierarchical_memory_limit (gauge) | # of bytes of memory limit with regard to hierarchy under which the memory cgroup is Shown as byte |
ecs.fargate.mem.hierarchical_memsw_limit (gauge) | # of bytes of memory+swap limit with regard to hierarchy under which memory cgroup is Shown as byte |
ecs.fargate.net.rcvd_errors (gauge) | # received errors (Fargate 1.4.0+ required) Shown as error |
ecs.fargate.net.sent_errors (gauge) | # sent errors (Fargate 1.4.0+ required) Shown as error |
ecs.fargate.net.packet.in_dropped (gauge) | # ingoing packets dropped (Fargate 1.4.0+ required) Shown as packet |
ecs.fargate.net.packet.out_dropped (gauge) | # outgoing packets dropped (Fargate 1.4.0+ required) Shown as packet |
ecs.fargate.net.bytes_rcvd (rate) | # bytes received (Fargate 1.4.0+ required) Shown as byte |
ecs.fargate.net.bytes_sent (rate) | # bytes sent (Fargate 1.4.0+ required) Shown as byte |
ECS Fargate チェックには、イベントは含まれません。
fargate_check:
Agent が Fargate に接続できない場合は CRITICAL
を返します。それ以外の場合は OK
を返します。
ご不明な点は、Datadog のサポートチームまでお問合せください。