Posted on May 27
Sensu のメトリクスを蓄積して可視化する為のツールとして Graphite がほぼデファクトになっているのでマジメに触っておく(Graphite はメトリクスを蓄積する為のデータベースで graphite webapp が Graphite に蓄積されたメトリクスを可視化するものと考えると良いかも)Graphite では graphite webapp という可視化ツールがデフォっぽいけど Grafana というみんな大好き Kibana をフォークしたツールもあるので触っておくGraphite に関してはこちらの Dockerfile を利用して環境を構築した
Graphite は以下のような 3 つのコンポーネントで構成されている。
carbon - 時系列データを収集する(Twisted というネットワーク・プログラミング用のフレームワークで実装されている)whisper - 収集した時系列データを蓄積するシンプルなデータベースgraphite webapp - Django の Web アプリケーションで実装され、オンデマンドでグラフを描画するのに Cairo が利用されているそれほど難しくない。ディストリビュージョンによってはパッケージが用意されているのでそちらを利用しても良いかも。
Carbon の種類という言い方が正しいのか解らないが Carbon には以下のような種類のデーモンが利用出来る。
全ての設定は carbon.conf にて設定が可能で [] で区切られたセクションで個々の設定を行う。以下、各々の特徴を簡単にピックアップ。(ドキュメントの意訳と実際に試してみた結果)
whisper ライブラリにより適当な間隔でディスクにフラッシュするまた…
The [cache] section tells carbon-cache.py what ports (2003/2004/7002), protocols (newline delimited, pickle) and transports (TCP/UDP) to listen on.
とあるので Firewall 等では 2003 と 2004 そして 7002 ポートは開放しておく必要があるので注意。また、それぞれの用途については carbon.conf に色々とコメントが書かれているのでそちらも参考になる。
LINE_RECEIVER_INTERFACE = 0.0.0.0
LINE_RECEIVER_PORT = 2003
# Set this to True to enable the UDP listener. By default this is off
# because it is very common to run multiple carbon daemons and managing
# another (rarely used) port for every carbon instance is not fun.
ENABLE_UDP_LISTENER = False
UDP_RECEIVER_INTERFACE = 0.0.0.0
UDP_RECEIVER_PORT = 2003
PICKLE_RECEIVER_INTERFACE = 0.0.0.0
PICKLE_RECEIVER_PORT = 2004
# Set to false to disable logging of successful connections
LOG_LISTENER_CONNECTIONS = True
# Per security concerns outlined in Bug #817247 the pickle receiver
# will use a more secure and slightly less efficient unpickler.
# Set this to True to revert to the old-fashioned insecure unpickler.
USE_INSECURE_UNPICKLER = False
CACHE_QUERY_INTERFACE = 0.0.0.0
CACHE_QUERY_PORT = 7002
上記は carbon.conf からポートに関する部分を抜粋したもの。2003 ポート自体がメトリクスを受け入れる為のポートのようで、デフォルトでは UDP はオフになっていることが解る。また、2004 ポートは pickle という Python 独自のデータストリーム方式でのメトリクスを待ち受けるようだ。pickle についてはこちらやこちらが参考になりそう。
RELAY_METHOD = rules となっている場合に複数のホストで稼働している carbon-cache にメトリクスをリレーすることが出来るRELAT_METHOD = consistent-hashing の場合には複数の carbon-cache ホストでのシャーディングを定義出来るgraphite-web からのデータ取り出しに際しては local_settings.py の CARBONLINK_HOSTS で定義した複数の carbon-cache ホストから読み込む尚、Graphite のクラスタリングについては以下の記事に詳細に紹介されていた。
また、自分がなんやかんや言うよりも @y_uuki さんの以下の資料で一目瞭然!
解りやすい。
carbon-cache より前で動作するwhisper に書き込む前にメトリクスをバッファリングすることで whisper への負荷を減らすgranular reporting が不要な場合にも有用で whisper のサイズ削減にも貢献する(※granular reporting の意味がイマイチ解りませんでした…)storage-schemas.conf では…
whisper によって解釈されるということで、ざっくり言うとメトリクスの保存ポリシーを定義している。
尚、設定については以下の三つを設定する必要がある。
[] で囲むpattern= は正規表現での設定が可能retentions= は frequency:history といフォーマットで記載以下は例。
[hoge_collection]
pattern = hoge.huga$
retentions = 10s:14d
hoge_collection という名前で hoge.huga で終わるパスのメトリクスは 10 秒毎に取得し 14 日間保持することを示している。
また、周期や保存の期間については以下のような単位で設定が可能。
s - 秒m - 分h - 時間d - 日y - 年そろそろうんちくも疲れてきたので…こちらを参考にして、以下のように nc を利用して Graphite のホストに対してメトリクスを送ってみる。
PORT=2003
SERVER=172.17.0.2
echo "`hostname -s`.hoge.huga.test `echo $RANDOM` `date +%s`" | nc ${SERVER} ${PORT}
適当に何度か叩いていると…

おおー。(※こちらによると nc で -q0 オプションを指定しない場合には TCP 接続を開きっぱなしになるnc のバージョンもあるようなので注意する。)
ということで上記にあるように Graphite が解釈出来るメトリクスの基本的なフォーマットは以下の通りとなる。
${metric path} ${metric value} ${metric timestamp}
${metric path} については . ドットを区切りとして階層構造を持たせることが出来る。どの位の階層を持てるかを試してみたのが以下の図。

結構イケそう…(実際の限界については情報を見つけることが出来なかった)

と勝手に命名。
見ての通り Kibana にとてもよく似ているのはもちろん、グラフの設定情報については Kibana 同様に Elasticsearch に保存するような設定になっているのでちゃんと使おうとすると Elasticsearch が必要になる。

上記のようにエラーが表示される。まあ、ちょっと試す分には全然問題ないかと…
使い方はとっても簡単。一時間位使ってみた記事を以下に書いたのでそちらを見て頂くといかに簡単かが解るかも…
ポイントとしては Grafana の config.js にちゃんと graphite-web の設定を行えれば Graphite のメトリクスを以下のように自動で取得してくれているので、あとは必要に応じてメトリクスを選択するだけ。

グラフにメトリクスを追加したい場合でも Add Query をクリックするだけ。後は自動的に取得されている Graphite のメトリクスを選択していく。
ドキュメントを見ると基本的な使い方以外にも以下のような機能が実装されている。
個人的に気になったのが Scripted Dashboards とPlaylist の二つ。ざっくり言うと Scripted Dashboard は JavaScript を使って動的にダッシュボードを生成することが出来る機能、Playlist は指定した期間のグラフを保存しておいて後からも見ることが出来る機能のようだ。
この記事を通して痛感したこと、解ったこと。
Graphite とか Grafana 関係無しに英語力足りてねえPython 力が全く無い…Graphite も Grafana もさらっと使う分にはとても簡単Graphite については 2006 年くらいから続いているプロジェクトでかなり歴史はある(=実績もある?)Graphite は 3 つのコンポーネント(Carbon と whisper と graphite-web)があるCarbon は 3 つのデーモン(carbon-cache と carbon-relay と carbon-aggregator)があるcarbon-cache はメトリクス収集、carbon-relay は冗長化とシャーディング、carbon-aggregator はバッファ${metric path} ${metric value} ${metric timestamp}Grafana は Elasticsearch も必要な場合があるが基本的には操作は簡単!Graphite の Render URL API や whisper について調べるGrafana の Scripted Dashboards と Playlist について調べる2014 かっぱのほげふが