ログ集計／時系列DB／可視化ツールの調査結果

近年、自分の中で集計／可視化は
**Fluentd(datacounter)+Growthforecast**
で定番化していました。
しかしプロダクトで新たに集計／可視化の要件が出てきたことと、
最近可視化ツール周りで
「Kibanaってなんじゃ？」「Graphiteってなんじゃ？」「InfluxDBってなんじゃ？」
など、このツール達は一体何なんだろう…？というのが前々から気になっていました。
今回良い機会なので
**◯◯は何をするものなのか？**
というのを一つ一つ調べてみました。

いわゆる「触ってみた系」の記事なので
だいぶ浅い感じです。

<br>

# 大分類
大きく分けると、可視化ツールは以下の３つに分けられそうです。

* ログ収集/集計
* 時系列DB（＋API）の担当。バックエンド側。
* 可視化部分の担当。

今回は **バックエンド** と **可視化部分** に焦点を当ててみます。

<br>

## バックエンド

### [Elasticsearch](http://www.elasticsearch.org/)
全文検索時エンジン+RestfullAPI。
最近人気急上昇らしく事例も増えてきている様子。
安定感ありそう。<sub><a href="#1">1</a></sub>
#### Fluentdプラグイン
https://github.com/uken/fluent-plugin-elasticsearch

### [Graphite](http://graphite.wikidot.com/)
リアルタイムにグラフを生成するためのバックエンド。
python製であり、以下の３つのコンポーネントで構成されている。

* graphite webapp
グラフ描画/APIを提供するDjangoアプリ。

* carbon
時系列DBを提供するバックエンド。

* whisper
RRDToolsの代替？

Graphite単体でもグラフを生成できるが「時系列DBのAPI」として使われることが多いのかな？
API部分がapache+python(wsgi)なので、慣れていないと導入が多少面倒かも。
また、いろんなコンポーネントで構成されているので少しfatな印象を受けた。

#### Fluentdプラグイン
https://github.com/studio3104/fluent-plugin-graphite

### [InfluxDB](http://influxdb.org/)
時系列データベース+API。
Go製。
Database/series(Table)というRDBMSっぽい管理ができる。でもスキーマレス。
SQLクエリを発行してグラフを表示する、というWeb画面もついてくる。
勢いを感じるが、安定度はどうなんだろうか。
#### Fluentdプラグイン
https://github.com/fangli/fluent-plugin-influxdb


<br>

## 可視化ツール
### [Kibana](http://www.elasticsearch.org/overview/kibana/)


**※2014/10/17追記：kibana4がベータリリースされました**
いくつか大きな変更点があるようです。詳しくは以下の参考URLをご参照下さい。
[Kibana 4 Beta 1 released](http://www.elasticsearch.org/blog/kibana-4-beta-1-released/)
[Kibana 4 BETAファーストインプレッション](http://qiita.com/harukasan/items/3737a1cc0bed2facc14e)


**※以下、kibana3の説明です**
ログ解析&可視化ツール。
Kibana+Elasticsearchというのが今の流行りっぽい<sub><a href="#1">1</a></sub>。
KibanaはただのWebページ（ブラウザから直接Elasticsearchを参照する）。
バックエンドはElasticsearch。

ダッシュボードを自分でカスタマイズできる（逆に、ある程度自分で作りこむ必要がある）
luceneクエリで集計／フィルタ出来る。
集計だけでなく、生ログ検索が出来るのが良い。
あとTopN分析などもKibanaの設定で可能。
今回紹介する中では一番柔軟に出来そうなイメージ。
[Splunk](http://ja.splunk.com/)に近い?という印象。
![kibana.png](https://qiita-image-store.s3.amazonaws.com/0/9099/22bd9078-2629-16b6-96e6-19ef8e3a3f10.png)


### [Grafana](http://grafana.org/)
Graphiteをバックエンドとし、Kibanaっぽいダッシュボードを生成するためのソリューション。
(というか、Kibanaがお父さん)
元々はGraphite用であったが、最近InfluxDBにも対応した様子。

Kibanaと同様に、GrafanaもただのWebページで構成されている。
バックエンドはGraphite or InfluxDB。ただしダッシュボードの保存にはElasticsearchを利用しているらしい。
以下は、Kibanaと比べて地味に嬉しい点。

* パネルのコピーが出来る
* ダッシュボード変更してから未保存でページ閉じる時、きちんとアラートを出してくれる

![grafana-bks.png](https://qiita-image-store.s3.amazonaws.com/0/9099/a66574c0-ae28-91fc-c6b6-cf652ad7d954.png)


### [Tasseo](http://dashboarddude.com/blog/2013/11/09/dashboard-tasseo/)
Graphite/InfluxDBのリアルタイムダッシュボード生成ツール。
Ruby製のwebサーバ。
出来ることは少ないが、config.jsにメトリクスを羅列するだけで
リアルタイムグラフが描けるお手軽さは良い。
サーバのリソース監視には向いて無いかも…<sub><a href="#1">1</a></sub>
※[コメント](http://qiita.com/toritori0318/items/1861baa79afb96d6f5ad#comment-b103b23f1643cd0763e4) で補足して頂きました


![tasseo.png](https://qiita-image-store.s3.amazonaws.com/0/9099/34e1efb9-d8c2-a0c7-fb9b-b2c690e0c554.png)


### [Giraffe](http://dashboarddude.com/blog/2013/12/16/dashboard-giraffe/)
Graphiteのダッシュボード生成ツール。
dashboard.jsを設定するだけでいい感じに可視化出来る。
以下で「ユーザデータ集計／サーバリソース監視／HTTPリクエスト集計」 などのダッシュボードデモが見れる。
とても良さそうな印象<sub><a href="#1">1</a></sub>。
[Giraffeデモサイト](http://giraffe.kenhub.com/)
![giraffe.png](https://qiita-image-store.s3.amazonaws.com/0/9099/0401a4f5-e65b-168a-1dc9-d3a62509b06c.png)



### [Influga](http://hakobera.github.io/influga/)
InfluxDBのダッシュボード生成用ツール。Grafanaの対抗馬？
Node製。
設定は画面からポチポチ系だが
Kibanaなどと比べるとだいぶお手軽にグラフを作ることが出来る<sub><a href="#1">1</a></sub>。
まだリリースされたばかりということもあり、表示が微妙なところもあったり。
しかし開発は活発なようです。
![influga.png](https://qiita-image-store.s3.amazonaws.com/0/9099/b8c25023-2e22-31b0-dc5b-2af4f34ca693.png)

<br>

## 番外編：[Norikra](http://norikra.github.io/)
ストリーム集計ツール。SQLっぽく検索集計出来るのが特徴。
上記とは少しロールが異なり、直接バックエンドになるという感じではなく
集計する部分にのみ特化しているツール。
ログ収集の途中に差し込んで集計を柔軟／楽にする、という立ち位置？
（Fluentdでいうところのdatacounterとかその辺りをさらに柔軟に書くことが出来る）
また、JVMを運用したことがないのでその辺りが不安ポイント。

### Fluetndプラグイン
https://github.com/norikra/fluent-plugin-norikra

<br>

# まとめ

## 表にしてみた

|可視化ツール名|構成要素|時系列DB|
|:-----------|------------:|:------------:|
|Kibana4|JRuby|Elasticsearch|
|Grafana|webページ|Graphite/InfluxDB|
|Tasseo|Ruby|Graphite/InfluxDB|
|Giraffe|webページ|Graphite|
|Influga|Node.js|InfluxDB|


## 雑感
今回、元々の要件ではリアルタイムログ表示+集計がしたかったので、
Kibana＋Elasticsearchが合ってるのかなぁと思いました。
お手軽さ優先ならInfluxDB+Tasseo/Influga。
Graphite+Giraffeも軽く触った印象は良かったのでもう少し試す予定。

ちなみに性能/安定性は考慮していません。
ログが集中するとどうなるか、またはメトリクスの数を増やした時にどうなるか、は気になるところ。


## 補足
いろいろ調べているうちに
ログ集計だけでなくてリソースモニタリングも出来そうということがわかり
そうなると[Sensu](http://sensuapp.org/)も紹介したほうがいいのかなぁと思いましたが
そこまで調べるとだいぶ大変そうだったので今回は入れておりません。
またの機会に触ってみたいと思います。


## 参考

* [Norikra vs InfluxDB](http://blog.livedoor.jp/sonots/archives/37980269.html)
* [Grafana on InfluxDB をちょっとだけ触ってみた](http://qiita.com/sonots/items/8fbc92ff1c3e57ee7de7)
* [Norikra 0.1を使ってみた](http://qiita.com/harukasan/items/a7c1dd1a11a61cd1ad75)
* [InfluxDB を引き続き触ってみるぜよ（Grafana とか使ってみる）](http://hogehuga.inokara.com/2014/04/20/influxdb-dashboard.html)
* [InfluxDB と fluentd を組み合わせを試してみた](http://qiita.com/hakobera/items/fbe7669a1c2b763bcd8d)
* [dstat + fluentd + Graphite + Grafana でサーバモニタリングする ](http://blog.nomadscafe.jp/2014/04/dstat-fluentd-graphite-grafana.html)
* [dstat + fluentd + Elasticsearch + kibana でサーバモニタリングする](http://blog.nomadscafe.jp/2014/03/dstat-fluentd-elasticsearch-kibana.html)



<a name="1">1.</a> 個人の感想です