Datadog で Fluentd のバッファ監視をする方法

**---- ---- ----**
追記: 2015/10/12
今では Datadog の公式エージェント (dd-agent) に組み込まれているので、[How to monitor Fluentd with Datadog](https://www.datadoghq.com/blog/monitor-fluentd-datadog/) を読むことをオススメします。
**---- ---- ----**

Fluentd のバッファ監視といえば、弊社の @moaikids さんが書いた [munin-fluentd](http://itsneatlife.blogspot.jp/2013/06/td-agentfluentdmonitoragentbuffer.html) をはじめとして、いくつか既存のソリューションがありますが、弊社のメトリクス監視を [Datadog](https://www.datadoghq.com/) に移行するタイミングで、munin-fluentd と同じ監視が Datadog にも欲しいよねということになって書いたので、それを紹介したいと思います。

## Datadog Fluentd Integration

一言で説明すると、munin-fluentd と同じように、output プラグイン毎の `retry_count`、 `buffer_queue_length`、 `buffer_total_queued_size` を Datadog に送るための Integration になります。例えば下記のようなグラフでバッファの状態を可視化したり、バッファの状況に合わせてアラートを送るといったことが簡単にできます。

### ホスト毎にみる

メトリクス名は `fluentd.${output_plugin}.retry_count` のような名前になります。

![fluentd_datadog.png](https://qiita-image-store.s3.amazonaws.com/0/1915/ca712d7c-fc5e-8bae-d4c6-b157da96a7a5.png)

### ロール毎にみる

ロール毎にまとめてみることで、特定のホストだけおかしいみたいなことに早めに気づけたりするので捗っています。

![fluentd_datadog.png](https://qiita-image-store.s3.amazonaws.com/0/1915/2597d909-6e8b-056a-1b5d-47c3309ae045.png)

### 設定方法

Datadog 公式の監視エージェント (dd-agent) に [PR](https://github.com/DataDog/dd-agent/pull/1080) を送ってましたが、マージが間に合わなかったので、dd-agent をインストールしただけでは使えない状況です。v5.2.0 に入れてもらうべく進めていますが、もしマージされる前に使い始めたい場合は、[check](https://github.com/takus/dd-agent/blob/feature/fluentd_check/checks.d/fluentd.py) を `/etc/dd-agent/checks.d` 配下に、[yaml](https://github.com/takus/dd-agent/blob/feature/fluentd_check/conf.d/fluentd.yaml.example) を `/etc/dd-agent/conf.d` 配下に置くことでご利用いただくことが可能です。

## 課題

今の実装だと、複雑なコンフィグを扱う時に若干の制約がでてきてしまっていますが、`monitor_agent` の機能的に仕方ないのかなと思っています。この辺り、何か上手くできる方法がありましたら教えていただけると助かります。

### 課題1. 同じ type のプラグインが複数ある場合の対処

同 type のプラグインで output 先が複数あるようなケース (例えば out_forward で 2 つ以上のホストに forward して、それぞれのバッファの設定が異なるような場合) は、それらの違いを判別できる仕組みがないので、個別に閾値を設定するみたいなことができません。どうしても個別に監視したい場合は fluentd のインスタンスを分けてしまえばできそうな気もしますが、設定ファイルが複雑になるのであまりやりたくない感じです。

### 課題2. forest プラグインの場合、どのプラグインが詰まってるのか分かりにくい

forest プラグインを使うと、下記のように `type` が null になってしまうので、どのプラグインで詰まっているか分かりにくいです。サーバにログインして `curl http://127.0.0.1:24220/api/plugins.json | jq .` みたいなことをすればなんとかなりますが、Datadog だけで完結させたい...。

```json
    {
      "config": {
        "format": "out_file",
        "reduced_redundancy": "true",
        "buffer_chunk_limit": "536870912",
        "time_slice_wait": "10m",
        "s3_bucket": "bucket",
        "s3_endpoint": "s3-ap-northeast-1.amazonaws.com",
        "s3_object_key_format": "key_format",
        "path": "path",
        "buffer_path": "buffer_path",
        "time_slice_format": "%Y-%m-%d/%H"
      },
      "retry_count": 0,
      "buffer_total_queued_size": 58,
      "buffer_queue_length": 0,
      "output_plugin": true,
      "type": null,
      "plugin_id": "object:3f81962b46dc"
    }
```

## まとめ

Datadog で Fluentd のバッファ監視をする方法を紹介しました。

あとは、小ネタで "[Fluentd で HTTP ステータスコードを集計して Datadog で可視化 or 監視する - Qiita](http://qiita.com/takus/items/f3dfaa1ab431644b922b)" というのも書いたので、興味がある方がいましたらご覧くださいませー。

## おまけ - Fluentd のバッファ監視をする方法あれこれ

- [How does it feel?: td-agent/fluentdのmonitor_agentを使用してbuffer使用領域の監視](http://itsneatlife.blogspot.jp/2013/06/td-agentfluentdmonitoragentbuffer.html)
    - munin でやる方法
- [CloudWatch に fluentd monitor_agent のメトリクスを追加](http://lab.sonicmoov.com/development/server/cloudwatch-fluentd/)
    - CloudWatch でやる方法
- [Monitoring monitor_agent by Sensu - さよならインターネット](http://blog.kenjiskywalker.org/blog/2014/07/09/monitor_agent-and-sensu/)
    - Sensu でやる方法