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


## 概要
[Datadog](https://www.datadoghq.com/) というモニタリングサービスを利用して Docker コンテナの CPU やメモリなどのメトリクス収集・監視とコンテナの死活監視をするという話。

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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage2_Screenboard.png)


参考: "How Docker monitoring works" [Monitor Docker with Datadog - Datadog Blog](https://www.datadoghq.com/2014/06/monitor-docker-datadog/) 

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

* Docker コンテナ名
* Docker のイメージ
* Docker コンテナの起動コマンド
* Docker ホストのホスト名 etc

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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage3_tags.png)

### タグを使って特定のコンテナ群のメトリクスをグラフ化
自動で付与されたタグを組み合わせることで任意のダッシュボードやグラフを作成できる。
例えば、

* redis イメージを利用したコンテナ群のメモリ使用量のグラフ化
* "hello" というホスト名上に起動しているコンテナ数の推移をグラフ化
* メモリを多く使っているコンテナ名のランキング化

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

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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage4_graph_by_image.png)

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

* `web` という Docker ホスト群上で止まっているコンテナがあればアラート
* `elasticsearch` イメージのコンテナの最大メモリ使用量が閾値に達したらアラート

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

* メール
* チャット（HipChat とか Slack とか）
* Webhook
* Pagerduty
* etc

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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage5-multi-alert.png)

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

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/20833/e07412e4-cee8-bbfa-cdbe-1de24165c5c9.png "Slack.png")


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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage6_Events.png)

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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage7_Correlations.png)

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

![](https://www.datadoghq.com/wp-content/uploads/2014/06/DockerImage8_metrics.png)

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

* Docker ホストに dd-agent をインストールしてモニタリングする
* モニタリング専用コンテナとして dd-agent コンテナを起動する

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

### Docker ホストにインストールした dd-agent を利用する
ホスト OS が ununtu の例

![Setup___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/20833/af168676-48f4-56b5-7b7e-9b463a82ee56.png "Setup___Datadog.png")

```bash
# インストール
$ 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 コンテナを立ち上げる。


```bash
$ 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 をモニタリングする](http://qiita.com/spesnova/items/882e0a61ddbe6c356394)

## スクリーンショット
### ステータス確認用ダッシュボードの例:
![Docker_Status___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/20833/c4abee04-d3d2-5b13-99b9-2d567f7c2b1c.png "Docker_Status___Datadog.png")

![Docker_Status___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/20833/bda9cc4e-c549-8aff-9efe-bbcc51c88a3a.png "Docker_Status___Datadog.png")

### runnning/stopped コンテナ数のグラフ例:
![Docker_Status___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/20833/f02a090b-f8ec-3545-4b21-3974ea77a4d6.png "Docker_Status___Datadog.png")

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

### 全コンテナが利用してるメモリの合計グラフの例:
![Docker_-_Overview___Datadog.png](https://qiita-image-store.s3.amazonaws.com/0/20833/6913bc7f-d98c-9be2-b595-e9a23d10e113.png "Docker_-_Overview___Datadog.png")

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

アグリゲーションについての考え方は [Cluster Management and Containerization by Benjamin Hindman From Twitter
](http://www.youtube.com/watch?v=F1-UEIG7u5g&feature=youtu.be) ですごくわかりやすく説明されてる。


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

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

## REF

* [Runtime Metrics - Docker Documentation](https://docs.docker.com/articles/runmetrics/)
* [Monitor Docker with Datadog - Datadog Blog](https://www.datadoghq.com/2014/06/monitor-docker-datadog/)
 * 翻訳版: [モニターリングサービスのDatadogを使ってDockerをモニターリング&管理](http://jhotta.github.io/blog/2014/06/10/monitoring-docker-with-the-datadog/)
* [Docker-ize Datadog with agent containers - Datadog Blog](https://www.datadoghq.com/2014/06/docker-ize-datadog/)
 * 翻訳版: [コンテナ化したDatadog agentを使ってDockerのモニターリング&管理](http://jhotta.github.io/blog/2014/06/11/docker-ize-datadog-with-agent-containers/)
* [Datadog で CoreOS をモニタリングする](http://qiita.com/spesnova/items/882e0a61ddbe6c356394)