Fluentd update 2016

毎年やっているので，2016年もFluentd周りで起きたあれこれをまとめておこうと思います．v0.14がリリースされたり，CNCF入りしたりと色々と大きく前進した年でした．

## Fluentd本体

以下が現在の各リリースの最新バージョンです．

* old stable: 0.10.62
* Current stable: 0.12.31
* Development: 0.14.10

0.10は2016年末でEOLなので([アナウンス](https://groups.google.com/d/msg/fluentd/c4f9j9VMWkA/y5eLTjJTBgAJ))，これ以降新しいバージョンはリリースされないことに気をつけてください．0.10.0のリリースが2011年10月なので，約5年開発されていたことになります(実際はここ1年は開発してないので実質は4年ですが)．

また，v0.14が開発版という位置づけではあるものの，それなりに機能が実装され，gemから普通にインストールして使うことが出来るようにもなりました．Docker環境とかでは，すでにプロダクションで使っている人もいるようです．

マルチプロセスサポートなどいくつかまだやることが残っていますが，それらが入ればv1がリリースされる予定になってます．

以降では，ここ1年でv0.12に入った変更で有用そうなやつを紹介したいと思います．フルのChangeLogは[こちら](https://github.com/fluent/fluentd/blob/v0.12/ChangeLog)．

### [process_name](http://docs.fluentd.org/articles/config-file#processname) (v0.12.18)

psなどで表示されるプロセス名を変更する設定です．`<system>`ディレクティブで設定出来ます．

```
<system>
  process_name fluentd1
</system>
```
```
% ps aux | grep fluentd1
foo      45673   0.4  0.2  2523252  38620 s001  S+    7:04AM   0:00.44 worker:fluentd1
foo      45647   0.0  0.1  2481260  23700 s001  S+    7:04AM   0:00.40 supervisor:fluentd1
```


### [buffer_queue_full_action](http://docs.fluentd.org/articles/buffer-plugin-overview#bufferqueuefullaction) (v0.12.19)

v0.12.18まではバッファが詰まった場合には`BufferQueueLimitError`を投げるという実装になってました．これによって`in_tail`は読み込みを中断したりしてたんですが，この動作を選べるようにしました．

* exception: デフォルト．BufferQueueLimitErrorをInputに投げる
* block: バッファが空くまで処理をブロックする．バッチ的な用途で使う時に有用．
* drop_oldest_chunk: 一番古いチャンクを捨てて新しいチャンクを追加する．メトリックスの転送などで，古い値よりも新しい値の方が重要な時に有用．

基本は`exception`で，Inputプラグイン側に処理をゆだねるのがストリーミングでは最適です．

### simplified syntax for array / hash (v0.12.27)

v0.12.26までは，`config_param`で`array`/`hash`を指定した場合，JSONの配列やオブジェクトしか書けなかったんですが，互換性維持も含め，短く書ける記法もサポートすることにしました．

`array`の場合，以下の二つは同じです．

```
array1 a,b,c
array2 ["a", "b", "c"]
```

`hash`の場合，以下の二つは同じです．

```
hash1 a:1,b:2,c:3
hash2 {"a":"1", "b":"2", "c":"3"}
```

今まで`string`で受けて`,`でsplitとかやってましたが，そういうのがいらなくなります．

### [parser filter](http://docs.fluentd.org/articles/filter_parser) (v0.12.29)

`fluent-plugin-parser`というプラグインをコアに移植しました，dockerや色々な環境で使われるようになった結果，特定のフィールドを再度パースしたい，という要望がかなりたくさん出てきたので，入れることにしました．

### slow_flush_log_threshold (v0.12.31)

書き込み先が高負荷で詰まったりしている場合，fluentd側のバッファが溜まるようになります．こういう状況でのデバッグを容易にするためにOutputプラグインに追加しました．バッファチャンクの書き込みに掛かった時間が`slow_flush_log_threshold`を越えた場合に，以下のようなログが出ます．デフォルトは20秒です．

```
2016-12-15 17:38:05 +0900 [warn]: buffer flush took longer time than slow_flush_log_threshold: elapsed_time=1.004721702018287 slow_flush_log_threshold=0.5 plugin_id="foo"
```

これによって，一時的に書き込み先が詰まっているかどうかチェック出来ます．頻繁にこのログが出るようであれば，書き込み先のパフォーマンスが足りてないか，ネットワーク環境などに問題がありそうです．

これらのほかにも勿論，パフォーマンスやエラーハンドリングの改善，便利なパラメータの追加，既存機能のエンハンスなど色々と変更を加えているので，気になる方はChangeLogを見てみてください．

v0.14に関しては長くなるので，また時間がある時にでも書く予定です．

## エコシステム

### td-agent

最新版はtd-agent 2.3.3です．jemallocのバージョンアップやfluent-plugin-kafkaの追加など，fluentdのバージョンアップ以外にも，いくつか変更が加えられています．

そしてfluentd v0.14ベースのtd-agent 3ももうすぐリリースします([対応チケット](https://github.com/fluent/fluentd/blob/v0.12/ChangeLog))．主な変更点は以下です

- ruby 2.4による基本的なパフォーマンスの向上
- fluentd v0.14によるナノ秒や新プラグインAPIのサポート
- fluent-plugin-elasticsearchなどよく使われるプラグインの追加
- fluent-plugin-scribeなどユーザが少ないプラグインの削除
- Windows msiのサポート

td-agent 3は嬉しいユーザはかなり多いんじゃないかと思っています．

### fluent-bit

昨年公開されたfluent-bitですが，今も元気に開発が続いています．現在の最新版はv0.9ですが，もうすぐv0.10が出ます．v0.10には以下の二つの大きな機能が入ります．

- in_tailプラグイン
- Goでプラグインを書ける機能

前者は，fluentdでは厳しい環境でもログを収集できるようになります．コンテナでかなりリソースを制限している環境や，ログが大量でCPUを結構使うような環境もカバー出来るようになります．<br />
後者は，Cでプラグインを書くのが厳しい人は多いので，プラグインを書きやすくするためGoをサポートします．

### CNCF入り

[データ収集ソフト「Fluentd」が有力OSSの仲間入り、「CNCF」のプロジェクトに](http://itpro.nikkeibp.co.jp/atcl/news/16/110903305/)

この1年で一番大きい出来事かなと思ってます．

Linux FoundationにはCNCF(Cloud Native Computing Foundation)という団体があり，現在はKubernetes，Prometheus，OpenTracingというプロジェクトの開発を主導しています．それらに続いて4番目のプロジェクトとしてFluentdが選ばれました．

選ばれたといっても特別名前が変わったり開発体制が変わることはないです．CNCFからサポートを受けたり，CNCFのイベントで発表出来たりとかなり恩恵が大きいので，この環境を生かしつつ，今後も開発含めガシガシとやっていきます．

https://store.cncf.io/collections/fluentd

あと，CNCFでFluentdのグッズが買えるようですｗ

### ユーザ/コミュニティの拡大

Atlassianなど含め[testimonials](http://www.fluentd.org/testimonials)に載せて良いよ，というユーザさんが増えてます．その他，[NTTデータによるFluentd/Embulkのサポートサービスが始まったり](http://www.nttdata.com/jp/ja/news/services_info/2016/2016062101.html)，[Juniper NetworksのコレクターにFluentdが使われていたり](https://forums.juniper.net/t5/Analytics/Open-Source-Universal-Telemetry-Collector-for-Junos/ba-p/288677)と，いわゆるWeb系以外でもFluentdが使われて来てるな，という印象です．

re:Inventでも「データ分析基盤で今fluentdを使ってるんだけど〜」って感じでTDのブースに色々な国の方が来てくれたようで，日本やアメリカ以外でも着実に広がっているようです．今後も怠らずにFluentdやそのコミュニティをちゃんと回して行けたらな，と思います．

## 最後に

2016年も，パッチを投げてくれた人，バグ報告をしてくれた人，記事やプレゼンで紹介してくれた人などなど，色々な方にお世話になりました．v0.14の開発も順調で，来年はさらにfluentdが使いやすく，パフォーマンスや安定性も改善されるので，ご期待ください．

これからもよろしくお願いします :)