Datadog で Docker コンテナをモニタリングする

More than 3 years have passed since last update.


概要

Datadog というモニタリングサービスを利用して Docker コンテナの CPU やメモリなどのメトリクス収集・監視とコンテナの死活監視をするという話。


Datadog を使うメリット


Docker をどうモニタリングすべきかのモデルとなる

Datadog のエージェントは、 Docker が依存する Linux の "namespace" と "cgroup" が提供するメトリクスを 15 秒ごとに収集することでモニタリングを行っている。また Docker コンテナをどうモニタリングするか・どうメトリクスを収集するか・どんなメトリクスがあるかを学ばさせてもらっている。

参考: "How Docker monitoring works" Monitor Docker with Datadog - Datadog Blog


コンテナへ自動でタグ付け

Datadog は


  • Docker コンテナ名

  • Docker のイメージ

  • Docker コンテナの起動コマンド

  • Docker ホストのホスト名 etc

という属性情報をタグとして自動で付与してくれる。


タグを使って特定のコンテナ群のメトリクスをグラフ化

自動で付与されたタグを組み合わせることで任意のダッシュボードやグラフを作成できる。

例えば、


  • redis イメージを利用したコンテナ群のメモリ使用量のグラフ化

  • "hello" というホスト名上に起動しているコンテナ数の推移をグラフ化

  • メモリを多く使っているコンテナ名のランキング化

といったことが簡単にできる。(ちなみにグラフは任意の期間を見たりリアルタイムに見たりできる)

CPU 使用量を Docker イメージ毎に分類してグラフ化した例:


柔軟なアラート設定

グラフ化と同様にタグを使ってコンテナを指定・グルーピングし、それぞれのメトリクスや状態によってアラートを出すができる。例えば、



  • web という Docker ホスト群上で止まっているコンテナがあればアラート


  • elasticsearch イメージのコンテナの最大メモリ使用量が閾値に達したらアラート

さらに、アラートの飛ばし先も色々選択肢がある。


  • メール

  • チャット(HipChat とか Slack とか)

  • Webhook

  • Pagerduty

  • etc

redis2.8 というイメージのコンテナの平均メモリ使用量が閾値に達したらアラートを出す例:

Slack へグラフをシェアした例(アラートもこんな感じで出る):

Slack.png


コンテナのライフサイクルのモニタリング

コンテナは VM のような 1 サーバではなく、OS のプロセスとして存在するよう設計されているので、より頻繁に作成や消去が行われる。Datadog を使うと、 Docker コンテナの create/start/stop/destroy イベントがイベントストリーム(インフラのタイムラインみたいなもの)に流れる

Docker コンテナのメトリクスとイベントストリームを並べて表示した例:


メトリクスを探す

インクリメンタルに Docker のメトリクスを探すことができる


Datadog でモニタリングする

Datadog のエージェント、dd-agent を使って docker コンテナをモニタリングする場合、2 種類の方法がある


  • Docker ホストに dd-agent をインストールしてモニタリングする

  • モニタリング専用コンテナとして dd-agent コンテナを起動する

CoreOS ならば後者一択になる。どちらにしても必要な作業はほんのちょっと。


Docker ホストにインストールした dd-agent を利用する

ホスト OS が ununtu の例

Setup___Datadog.png

# インストール

$ DD_API_KEY=<DATADOG_API_KEY> bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/dd-agent/master/packaging/datadog-agent/source/install_agent.sh)"

# docker 監視設定ファイル作成
$ sudo cp /etc/dd-agent/conf.d/docker.yaml.example /etc/dd-agent/conf.d/docker.yaml
$ ls -la /etc/dd-agent/conf.d/docker.yaml
-rw-r--r-- 1 dd-agent root 1114 Aug 5 20:12 /etc/dd-agent/conf.d/docker.yaml

# dd-agent 起動
$ sudo dd-agent start

# 起動状態を確認
$ sudo dd-agent info
Checks
======

docker
------
- instance #0 [OK]
- Collected 29 metrics, 0 events & 0 service checks

これで完了。


dd-agent コンテナを利用する

コンテナが動いているマシンにて、 dd-agent コンテナを立ち上げる。

$ docker run \

-d \
--privileged \
--name dd-agent \
-h `hostname` \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /proc/mounts:/host/proc/mounts:ro \
-v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
-e API_KEY=<DATADOG_API_KEY> \
datadog/docker-dd-agent

これで完了。

参考: Datadog で CoreOS をモニタリングする


スクリーンショット


ステータス確認用ダッシュボードの例:

Docker_Status___Datadog.png

Docker_Status___Datadog.png


runnning/stopped コンテナ数のグラフ例:

Docker_Status___Datadog.png

コンテナだと数秒で台数を増やせるので、今コンテナ何台立ってるのか見られるの楽しい。


全コンテナが利用してるメモリの合計グラフの例:

Docker_-_Overview___Datadog.png

heroku の dyno grid だったり mesos で ホストマシンを 1 つの大きなマシン(リソース)として見なすような環境であればアグリゲートしたメモリ使用量とかも見たくなる。こういうのも sum:docker.mem.rss {*} みたいにしてグラフ化できる。(kibana でもできるけど...)

アグリゲーションについての考え方は Cluster Management and Containerization by Benjamin Hindman From Twitter

ですごくわかりやすく説明されてる。


メモと感想


TODO コンテナ上で起動してるサービスのモニタリング方法を追記する


TODO Runtime Metrics について別記事を書く

WIP


REF