FargateをDatadogで監視してみます。前回調べたECSでは、ECS Container Instance(Docker Host)のDockerソケット等をコンテナ上にマウントして情報収集するという方法でしたが、Dockerホストが公開されていないFargateではどのように収集しているのか、併せて確認します。
公式のドキュメントはこちら。
作業
監視する方法ですが、監視対象とするタスク定義にて、Docker Anget用コンテナを一緒に起動しろ、との話です。タスク定義で追加する情報は公式で教えてくれており、下記となります。
- 予約CPUユニット
- 10
- 予約Memoryサイズ
- 256
- Image
- datadog/agent:latest
- コンテナ環境変数
CloudFormationで準備した場合は下記となります。CloudwatchLogsにログ出力する設定を合わせて入れています。
ContainerDefinitions: - # Command: # - String Cpu: 10 # DisableNetworking: Boolean # DnsSearchDomains: # - String # DnsServers: # - String # DockerLabels: # 文字列: String # DockerSecurityOptions: # - String # EntryPoint: # - String Environment: - Name: "DD_API_KEY" Value: "xxxxxxxxxxxxxxxxxxxxx" - Name: "ECS_FARGATE" Value: "true" Essential: "true" # ExtraHosts: # - HostEntry # HealthCheck: # HealthCheck # Hostname: String Image: "datadog/agent:latest" # Links: # - 文字列 # LinuxParameters: # LinuxParameters LogConfiguration: LogDriver: "awslogs" Options: awslogs-create-group: true awslogs-group: "/fargate/datadog-agent" awslogs-region: !Ref "AWS::Region" awslogs-stream-prefix: "datadog-agent" # Memory: Integer MemoryReservation: 256 # MountPoints: # - MountPoint Name: "datadog-agent" # PortMappings: # - PortMapping # Privileged: Boolean # ReadonlyRootFilesystem: Boolean # RepositoryCredentials: # RepositoryCredentials # Ulimits: # - Ulimit # User: String # VolumesFrom: # - VolumeFrom # WorkingDirectory: String
IAMユーザの用意
利用するECS Task Roleで、以下のIAMポリシーを許可する必要があります。
- ecs:ListClusters
- ecs:ListContainerInstances
- ecs:DescribeContainerInstances
サービス起動
で、作ったタスク定義を、サービスにしてFargateで動かせばDatadogで監視できるようになります。その際に、DatadogではFargateのIntegrationが自動でインストールされるようです。
取得できるメトリックスは下記となります。ECSで取得できるメトリックスとは異なっていますね。
どこから情報を取得しているのか
Datadog Agent コンテナは、どこから情報を取得しているのか。
それは タスクメタデータエンドポイント
となります。最近のFargateやECSでは、DockerのStats情報を返してくれるHTTPエンドポイントが提供されています。
Amazon ECS コンテナエージェントのバージョン 1.17.0 から、さまざまなタスクメタデータおよび Docker 統計を、Amazon ECS コンテナエージェントによって指定される HTTP エンドポイントで awsvpc ネットワークモードを使用するタスクで利用できます。
awsvpc ネットワークモードで起動されたタスクに属するすべてのコンテナには、事前定義されたリンクローカルアドレス範囲内のローカル IPv4 アドレスが割り当てられます。コンテナがメタデータエンドポイントをクエリする場合、Amazon ECS コンテナエージェントによって、一意の IP アドレスに基づきコンテナが属するタスクが判別され、そのタスクのメタデータと統計が返されます。
タスクメタデータエンドポイントバージョン 2 - Amazon Elastic Container Service
エンドポイントには、以下4種類が用意されています。
- 169.254.170.2/v2/metadata
- タスクに関連付けられたすべてのコンテナのコンテナ ID および名前のリストを返す
- 169.254.170.2/v2/metadata/<container-id>
- 指定された Docker コンテナ ID のメタデータを返す
- 169.254.170.2/v2/stats
- タスクに関連付けられたすべてのコンテナの Docker 統計 JSON を返す
- 返される情報は、DockerエンジンAPIのStatsの情報となる
- Docker Engine API v1.30 Reference
- 169.254.170.2/v2/stats/<container-id>
- 指定された Docker コンテナ ID のDocker 統計 JSON を返す
- 返される情報は、DockerエンジンAPIのStatsの情報となる
- Docker Engine API v1.30 Reference
実際に、sshdを動作するコンテナをFargate上で動かして、コンテナにssh接続してエンドポイントにアクセスすると、以下のように情報を取得できます。
# curl http://169.254.170.2/v2/metadata { "Cluster": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXX:cluster/fargate-sample", (略) "PullStoppedAt": "2019-04-04T05:09:05.532884872Z" }
Datadog Agentは、この情報を収集してくれています訳ですね。