graphiteのインストール

Graphiteは「スケーラブルなエンタープライズ向けリアルタイム・グラフ・システム」だそうだ。これを使うと何がいいのかは別のポストでまとめるとして、インストールの手順をメモっておきたい。

これがサイト http://graphite.wikidot.com/

構成

graphiteはdjangoアプリによるフロントエンドとcarbonというバッケンドから構成される。carbonは独自のプロトコル(何でhttp使わないのか、スケーラビリティーの為か)でグラフ表示するデータを受ける。ウェブアプリはcarbonが管理するデータをグラフとして綺麗に見せる。グラフエンジンはcairo。依存モジュールが多くインストールはちょっと面倒なので整理してみた。

graphite関係

https://launchpad.net/graphiteで入手

  • graphite-web: graphiteのフロントエンド。djangoによるウェブアプリ
  • carbon: graphiteのバッケンド。表にするデータを受けDBにコミットするデーモン。
  • whisper: DBライブラリ
cairoグラフィックスライブラリ関係

cairographics.orgが提供

  • pixman
  • cairo
  • pycairo
標準debianモジュール

cairo構築にあった方が良さそうなパッケージ

  • libpng12-dev:
  • librsvg2-dev
  • libx11-xcb1

一般的なもの

  • python-twisted: carbonデーモン
  • python2.6-dev
  • python-setuptools
  • apache2
  • libapache2-mod-python: graphite-webはmod-pythonの中に住みたがる。
その他

インストール

pixman


$ wget http://cairographics.org/releases/pixman-0.24.0.tar.gz
$ tar xzf pixman-0.24.0.tar.gz
$ cd pixman-0.24.0/
$ ./configure
$ make
$ sudo make install

cairo


# cairoが依存するグラフィックスライブラリを入れておくといい
$ sudo apt-get install libpng12-dev librsvg2-dev libx11-xcb1
$ wget http://cairographics.org/releases/cairo-1.10.2.tar.gz
$ tar xzf cairo-1.10.2.tar.gz
$ cd cairo-1.10.2/
$ ./configure && make
$ sudo make install

pycairo

パイソンモジュールなのに./configure。 graphite webappはこれに依存するがチェックはなく、インストールし忘れるとグラフの部分がリンク切れマークになる。さらにタチが悪いことに、エラーはログに残らない。グラフがリンク切れしたときはそれを別タブで空けるとエラーメッセージが見れる。

carbon
whisper
django

easy_installしたバージョンだとdjango-1.3.1からインポートエラーが。


ImportError: cannot import name parse_lookup
最新のdjango-tagging-0.3.1.tar.gzでこの問題を解決。http://code.google.com/p/django-tagging/downloads/listからダウンロードしてソースからpython setup.py install

graphite-web (0.9.9)
設定
  • ログやDBのあるディレックトリをウェブサーバから書き込めるようにする

sudo chown -R www-data:www-data /opt/graphite/storage/

cd /opt/graphite/webapp/graphite; ./manage.py syncdb

graphite-web, django, apache2

mod_pythonがインストールされていることを確認
$ ls /etc/apache2/mods-enabled/python.load

apache設定

/etc/apache2/sites-enabled/graphite.conf



ServerName my-graphite-host
DocumentRoot "/opt/graphite/webapp"
ErrorLog /opt/graphite/storage/log/webapp/error.log
CustomLog /opt/graphite/storage/log/webapp/access.log common

SetHandler python-program
PythonPath "['/opt/graphite/webapp'] + sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE graphite.settings
PythonDebug Off
PythonAutoReload Off


SetHandler None


SetHandler None

Alias /media/ "/usr/lib/python2.6/site-packages/django/contrib/admin/media/"

$ sudo /etc/init.d/apache2 restart

carbon設定ファイル


$ cd /opt/graphite/conf/
# お任せ設定
$ cp carbon.conf.example carbon.conf
$ cp storage-schemas.conf.example storage-schemas.conf

carbonデーモン起動


$ sudo -u www-data /opt/graphite/bin/carbon-cache.py start

carbonクライアントで表にするデータをcarbonに送る


$ ~/src/graphite-web-0.9.9/examples/example-client.py
sending message
...
こいつはsystem.loadavg_{1,5,15}minのデータをひたすらカーボンに送り続ける。ブラウザをhttp://my-graphite-hostに向けると「Graphite」と「User Graphs」というフォルダがあるが空だ。example-client.pyを起動してしばらくするとGraphite->system->loadavg_5minなどにデータが入り始め、右にグラフが表われる。「Auto-Refresh」を押しておくと、勝手にグラフを更新してくれる。


これが見れたら成功したっていうことになるんだろう。

参照

アプリケーションからのデータをグラフ化するだけのために大工事になってしまった。djangoアプリがmod_pythonの中で動いたり(fcgiにできなかったのかね)、また別プロセスでバックエンドが動く。あとグラフィックスライブラリの依存が面倒。しかも未だあるのだ。次はstatsdというgraphiteの前に置くサービスを設定する。tcpで同期的なgraphiteのAPIに対してアプリケーションにとって楽なUDPインターフェースを提供するnode-jsサービスだ。これもやると、グラフ表示のためにプロセスを三つも管理しなきゃいけないことになる。やれやれ。

gnuplotか何か使えばもっと簡潔なグラフサービスができそうな気がする。