Graphite のインストールについて

先日、ちょっとしたログを表示するのに 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 のトップページにアクセスできるはずです。