先日、ちょっとしたログを表示するのに Graphite の導入を検討していて、試しに走らせてみたのでそのときの記録をメモしておきます。
Graphite とは
日本語の情報が少ないのでアレですが、高機能版の rrdtool といえば当たらずとも遠からず、という感じ。rrdtool といえば munin や MRTG、あるいは GrowthForecast などでおなじみの Perl 系グラフ表示ミドルウェアですが、ユーザー側でグラフの表示期間やスケールの変更を行ったりすることはちょっと難しいのが難点でした。
また、これは個人的に盲点だったのですが、 rrdtool が扱うデータのタイムスタンプは、原則としてAPIにデータが投入された時刻になってしまうんですね(API への引数として別途時刻を指定できない)。従って、 on-time で投入可能なアクセスログや、逐次投入が可能な HW メトリクスなどの推移を見る用途には向いているものの、過去数時間分のデータを一度に処理したりするような、過去のデータを投入して時系列で表示するという用途には使えません。
この2つの問題を解決するのが Graphite で、元々は非常に大規模なスケール(1分間に数万オーダーのデータ投入があるような環境)での使用を想定しているようなので今回検討した用途には正直オーバースペックかなという感じもしましたが、実際に使ってみるとデータ収集部とグラフ表示部が分離されていること、データ投入が非常にカジュアルにできること、収集データを API を通じて簡単に取得できること、などから、 rrdtool で辟易しているなら一度は試してみた方が良いよという感じです。
準備
Graphite のコアは
- Carbon
- データ収集
- Whisper
- 回収データの保存管理
- Graphite-web
- webフロントエンド
の3ユニットから構成されており、いずれも Python 製です。web側のプラットフォームは django で、 WSGI 経由で動くことになります。なお、フロントエンドについてはいくつか Ruby 製の代替があります。
インストールした環境は Ubuntu Server 12.04(Apache 2.2) / 14.04(Apache 2.4) どちらも LTS です。なお、Pythonは両環境とも 2.7 を用いました。
導入
すべて pip でインストールが可能です。標準的な手順だと、インストールディレクトリは
/opt/graphite
になります。まずは関連する依存モジュールから入れていきます。
# apt-get install python-pip python-cairo python-dev libapache2-mod-wsgi build-essential
libapache2-mod-wsgi ですが、 Python 3 の場合は libapache2-mod-wsgi-py3 になります(動くかどうかは未確認。
次いで、 Graphite のコアと django を入れます。
# pip install graphite-web whisper carbon django django-tagging daemonize
正常にインストールされれば、設定ファイルを書き換えていきます。
$ cp /opt/graphite/conf/carbon.conf.example /opt/graphite/conf/carbon.conf $ cp /opt/graphite/conf/graphite.wsgi.example /opt/graphite/conf/graphite.wsgi $ cp /opt/graphite/conf/storage-schemas.conf.example /opt/graphite/conf/storage-schemas.conf $ vi storage-schemas.conf
storage-schemas.conf では、収集したデータをどの程度の粒度・期間で保存しておくか、というルールを決めます。デフォルトでは、1分間隔で24時間しか保存しないようになっているので、必要に応じて変更します。
Whisper のストレージは固定長になっているため、データ収集前に保存期間を決めておく必要があり、また一度データ収集が行われ、データベースが作成されてからこの粒度・期間を変更する場合は別途スクリプト(/usr/local/bin/whisper-resize.py)を走らせる必要があります。
[sensor] pattern = sensor.* retentions = 120s:365d
基本的な書式は上記の通りで、この例では2分ごとに取得されるデータを365日間保存します。 pattern 項はデータの名前空間とのマッチングを指定します(正規表現可)。 Graphite が扱う各データはドットで区切られた階層型の名前空間を有しており、たとえば
sensor.cpu.temp sensor.cpu.fanspeed
などという形になりますので、漏れのないように指定します。設定が終われば、web側の設定を行います。
$ cp /opt/graphite/webapp/graphite/local-settings.py.example /opt/graphite/webapp/graphite/local-settings.py $ vi /opt/graphite/webapp/graphite/local-settings.py
local-settings.py では、タイムゾーンに Asia/Tokyo を、秘密鍵は必要に応じて指定します。この後、管理用の DB を作成します。
$ sudo python /opt/graphite/webapp/graphite/manage.py syncdb
web 周りのスクリプトの所有者を www-data に変更します。
$ sudo chown www-data:www-data /opt/graphite/storage -R $ sudo chown www-data:www-data /opt/graphite/webapp -R
ここから Apache の設定です。Virtual Host 用の conf ファイルの見本が用意されているので、apacheの設定フォルダにコピーします。
$ sudo cp /opt/graphite/examples/example-graphite-vhost.conf /etc/apache2/sites-available/graphite.conf
$ sudo ln -s /etc/apache2/sites-available/graphite.conf /etc/apache2/sites-enabled/graphite.conf
$ sudo vi /etc/apache2/sites-enabled/graphite.conf
触るところはほとんどありませんが、
Alias /media/ "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/media/"
は django がインストールされているフォルダに書き替えが必要です。また、
節と
節はアクセス許可が必要です。既にリリースから2年近く経過した Apache 2.4 系ではアクセス制限に Allow/Deny ではなく Require を用いるようになっているので、2.4系を使う場合は間違えないように。
Order allow,deny Allow from all = 2.3> Require all granted
で書いておいてくれれば良いのですけどね。
さて、ここからは一部のスクリプトを改修する必要があります。
/opt/graphite/webapp/graphite ./urls.py ./events/urls.py ./metrics/urls.py ./dashboard/urls.py ./render/urls.py ./version/urls.py ./cli/urls.py ./graphlot/urls.py ./browser/urls.py ./composer/urls.py ./whitelist/urls.py ./account/urls.py
で、
from django.conf.urls.defaults import *
となっているのを
from django.conf.urls import *
に書き換えます。これは、
django.conf.urls.defaults will be removed. The functions include(), patterns() and url() plus handler404, handler500, are now available through django.conf.urls .
https://docs.djangoproject.com/en/1.6/internals/deprecation/#id1
となっているように Django 側のバージョンアップで更新されたものの残り物です。また、
/opt/graphite/lib/carbon/util.py
の
from twisted.scripts._twistd_unix import daemonize
を
import daemonize
に書き換えます。これでやっと準備が整いました。
$ cd /opt/graphite $ sudo service apache2 restart $ sudo ./bin/carbon-cache.py start
で走らせると、Graphite のトップページにアクセスできるはずです。