Graphite+Diamondでシステム情報をグラフ化する

Graphiteについては 「Graphiteのインストール」を参照。

Diamondとは

CPU、メモリ、ネットワーク、IO、ディスクなどのシステム情報(metrics)を収集してGraphiteに送るPythonデーモン。カスタムメトリックスを表示するためのAPIもある。

ホームページ: http://opensource.brightcove.com/project/Diamond/

インストール


$ mv /home/tengu/Downloads/BrightcoveOS-Diamond-8e4977a.zip .
$ unzip BrightcoveOS-Diamond-8e4977a.zip
$ cd BrightcoveOS-Diamond-8e4977a/
$ ant package
$ sudo apt-get install python-pysnmp4 python-configobj # dependency
$ sudo dpkg -i build/diamond-2.0.2-0.deb
Pythonプロジェクトなのにantを使うという異様なコンビネーション。でも、コマンド一発でdebianパッケージができるところなんかよく出来ている。

起動


$ sudo /etc/init.d/diamond start
* Starting diamond [ OK ]
$ ps auxww | grep diam| grep -v grep
root 30376 18.5 0.0 62512 10588 ? Sl 01:23 0:00 /usr/bin/python /usr/lib/python2.6/dist-packages/diamond/server.py -v
ルートで走るのか…

フットプリント

初期状態で10メガのメモリを消費する。


tengu@takao:carbon-cache-a$ ps -p31241 -o cmd,rss
CMD RSS
/usr/bin/python /usr/lib/py 10448

トラブルシューティング

hinohara$ tail -f /var/log/diamond/diamond.log


[2011-11-17 01:25:45,788] [Thread-1] GraphiteHandler: Socket unavailable.
[2011-11-17 01:25:45,789] [Thread-1] GraphiteHandler: Failed to connect to graphite:2003. [Errno 111] Connection refused
$ sed -i.orig 's/host = graphite/host = localhost/' /etc/diamond/diamond.cfg
$ /etc/init.d/diamond restart
初期設定ではGraphiteの走っているホストが「graphite」となっている。これを自分の環境に合わせる。今回はテストなので同じホストでGraphiteがうごいているので、localhostとした。
このように、ログをtail-->diamond再起動-->補修作業を繰替えす。

carbon側にデータが届いているかを確認

データの流れ: diamond --> carbon --> graphite webapp --> 左のツリーにデータ名が表われ、右のグラフに表示される
diamondはモニタ対象ホスト(hinohara)で動く。carbonとgraphite webappはデータ収集・グラフィングホスト(あるいはクラスタ)(ここではgraphiteホストと呼ぶ)で動く。
監視対象ホストhinoharaのdiamondがgraphiteホストのcarbonに届いているか確認。


graphite$ tail -f /opt/graphite/storage/log/carbon-cache-a/listener.log
17/11/2011 02:28:43 :: MetricLineReceiver connection with {hinoharaのIP}:55706 established
モニタ対象ホストからcarbonのMetricLineReceiverに接続があればデータた届いていることになるだろう。少なくともfirewallなどの問題は克服したことになる。

手動テスト

ncで直接carbonと対話してみる。ログをtailしながらこれをやるとリアルタイムに挙動が把握できる。


t@hinohara$ date "+%s"
1321496888
t@s17$ nc graphite-host 2003
foo.bar.baz 42 1321496888

^D

フォーマット: [metric名 数値 タイムスタンプ]からなる複数の行と最後に空行一つ。


graphite$ tail -f /opt/graphite/storage/log/carbon-cache-a/creates.log
17/11/2011 02:28:52 :: new metric foo.bar.baz matched aggregation schema default
17/11/2011 02:28:52 :: creating database file /opt/graphite/storage/whisper/foo/bar/baz.wsp (archive=[(60, 1440)] xff=None agg=None)
これが来たらデータが届いて新しいスキーマ・データベースファイルが生成されたことになる。

whisperデータベースファイルのタイムスタンプを観察する

ls -l /opt/graphite/storage/whisper/systems/hinohara/cpu/total/system.wsp
これがwhisperDBファイルのようだ。理論的なメトリック名とファイル階層が一対一対応になっている。このファイルのタイムスタンプが常に新しい(diamonの更新頻度以内)ならデータは届いていることになる。

うまく表示されない?

diamondのメトリックスがgraphiteで認識されているが、上手く表示されない。値が全部ゼロで地を這っているよう。と思ったら、これはグラフの見方が間違っていた。左のメトリックスを次々にクリックするとその度にそれが一つのグラフに追加されていく。メトリックスの値のレンジはスケールが全く異る。一番高い数値のデータに合せてグラフがスケールされ、比較的レンジの小さい値が0近くに潰れてしまっていただけだ。

違ったメトリックスを一個ずつ見て回るにはどうすればいいのだろう? アプリケーションの使い方を勉強しなければならない。(答: Dashboardページだと個々のグラフが別表示される)

DiamondがモニタするデータをGraphiteで見る

とりあえずデータが見れるようになった。

左のデータツリーを見てもらうとわかるが、CPUだけでも沢山のデータがある。このようなカテゴリが、diskspace,iostat,loadavg,memory,network,tcp,vmstatとある。これがDiamondをインストールするだけで得られる基本的なホストメトリックスだ。Systems下にはこのようなホストがいくつも入る。

更にアプリケーション毎のメトリックスを見たいだけ生成することができる。例えば、ウェブサーバのアクセスログからの各種のデータを見ることができる。Graphiteグラフィングシステムはこのような膨大なデータを表示することを可能にするシステムだ。個々のメトリックス追加に設定は必要ない。データを送ることによって、スキーマが自動生成され表示が始まる。つまり、気軽に思い付き次第で「何でも表示する」モニタシステムと言える。

DiamonはこのGraphiteエコシステムにおいて、ホストの基本メトリックス抽出サービスと位置付けられる。

次回: ログからデータをgraphiteに送るlogster。あと、graphiteのUIの使い方が少しわかってきたので、それも紹介したい。