Datadog で ECS タスクのメトリクスを見れるようになるまで


Datadog で ECS のメトリクスを見れるようになるまでちょっとハマったのでメモ。

やろうとしたこと

Datadog の公式ドキュメント を参考に、 Datadog コンテナを ECS タスクで動かして、 Datadog 上で ECS クラスタのコンテナの状況を見れるようにしようとしました。

構成

下記構成でハマりました。
ECS + EC2
amzn-ami-2018.03.x-amazon-ecs-optimized (ami-0a7edd69bbca1d1f0)
ECS エージェントバージョン 1.31.0

ハマったところ

タスク定義が見れない

上記ドキュメント内に Datadog のコンテナを動かすための ECS タスク定義のJSONのリンクがあったのですが、リンクが間違っているのか見ることができないです(2019/11/12 現在)

ブログのリンクをお借りする

とりあえず、こちらのブログに貼ってあったリンクを使いました(URL を見た限りだと最新の JSON っぽいけどどうなんだろう・・・)。

メトリクスが取れない

上記 JSON を使って無事 Datadog コンテナが起動できた!
・・・しかし動いているタスクの一覧は表示されるけど、 CPU やメモリなどのメトリクスが取れていない。

ログを見てみる

Datadog タスクのログを取ってみたところ、下記のログが出力されていました。

2019-11-12 07:48:05 UTC | PROCESS | WARN | (pkg/util/containers/metrics/cgroup_detect.go:126 in parseCgroupMountPoints) | No mountPoints were detected, current cgroup root is: /host/sys/fs/cgroup/

cgroup のパスがおかしい?

調べてみたら、 Datadog はタスクのメトリクスを cgroup から取ってるらしく、 cgroup がうまくマウントされていない?
github でもこんな Issue が。パスが間違っている?

EC2 を確認

ECS のクラスタとして動かしている EC2 にログインして タスク定義 JSON に記載されている cgroup のパスを確認してみました。

 # cd /sys/fs/cgroup/
 # ls -a
.  ..

空っぽ・・・。
上記 github の Issue のパスを見てみると

 # cd /cgroup/
 # ls -a
.   blkio  cpuacct  devices  hugetlb  perf_event
..  cpu    cpuset   freezer  memory

こちらが正しいパスのようです。

タスク定義を直す

このパスを直して以下のような JSON にすると Datadog 上での正しくコンテナの様子を見れるようになりました。

{
  "containerDefinitions": [
    {
      "name": "datadog-agent",
      "image": "datadog/agent:latest",
      "cpu": 10,
      "memory": 256,
      "essential": true,
      "mountPoints": [
        {
          "containerPath": "/var/run/docker.sock",
          "sourceVolume": "docker_sock",
          "readOnly": true
        },
        {
          "containerPath": "/host/sys/fs/cgroup",
          "sourceVolume": "cgroup",
          "readOnly": true
        },
        {
          "containerPath": "/host/proc",
          "sourceVolume": "proc",
          "readOnly": true
        }
      ],
      "environment": [
        {
          "name": "DD_API_KEY",
          "value": "<YOUR_DATADOG_API_KEY>"
        },
        {
          "name": "DD_SITE",
          "value": "datadoghq.com"
        }
      ]
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/var/run/docker.sock"
      },
      "name": "docker_sock"
    },
    {
      "host": {
        "sourcePath": "/proc/"
      },
      "name": "proc"
    },
    {
      "host": {
        "sourcePath": "/cgroup/"
      },
      "name": "cgroup"
    }
  ],
  "family": "datadog-agent-task"
}