追記 2012/06/22
公式ページを作りました。そちらも参考にしてくださいませ
GrowthForecast - Lightning fast Graphing / Visualization
http://kazeburo.github.com/GrowthForecast/
Kansai.pmのLTでも紹介したんだけど、APIを叩く事でグラフを更新するツールを書きました。話の発端としては「cloudforecastのグラフを外からAPIで更新したい」ということでしたが、cloudforecastではグラフの追加が重い処理になってしまうので、別のプロダクトとしています。
サーバの負荷などのメトリクスを収集し、グラフ化することで、システムに掛かっている負荷を把握し、パフォーマンスに影響がでるまえに対策をうったり、改善の結果を知る事ができますが、同じ事はシステムだけではなく提供しているサービスの動向を確認したり、サービスの改善の結果を知ることにも言えると思います。GrowthForecastは数値だけではくグラフでこのような変化を見やすくする為のツールとして利用することができます。
↑画面はこんな感じ。
API
APIはむちゃくちゃ簡単で、
http://example.com/api/:service_name/:section_name/:graph_name
というURLにPOSTでデータを送るだけです
もし、忍者取り合いっていうサービスのアイテムの中の手裏剣が売りたい数だったら
POST http://example.com/api/ninjyatoriai/items/syuriken_no_ureta_kazu
となります。utf8でればURIに日本語も使えます。送るパラメータは
パラメータ | 説明 | 必須/オプション |
---|---|---|
number | グラフに与える数値 | 必須 |
mode | 登録済みの数値を number の値で加算する時には mode=count とします。 通常は number の数値で常に上書きます。 |
オプション |
この2つとなります。
LWP::UserAgent を使うと以下のように書けます。
my $ua = LWP::UserAgent->new;
$ua->post('http://example.com/api/ninjyatoriai/items/syuriken_no_ureta_kazu', {
number => 10,
});
送信したデータは一度SQLiteのDBに貯められ、5分毎にグラフ用のRRDデータを更新します。5分毎、30分毎、1時間毎など任意のタイミングでAPIを叩くとよいでしょう。
グラフ
データを投稿してから5分ぐらい待つとグラフが描かれます
以下は、2分毎に date +'%M' の結果をmode=countで送って描いたグラフ。上の2つは32時間と1週間のグラフです。modeがcountなので一方向に増えて行ってます。
GrowthForecastははグラフデータを更新する際に、前回との差分も取っているので、2行目のような差分グラフも表示できます。
差分グラフの表示、非表示グラフの色、単位などはWeb上のUIから変更可能です。
複合グラフ
もう一つ、GrowthForecastの機能で、複数のデータを1つのグラフにまとめて表示できる機能があります。
これは先ほどのdateを送っているグフラの差分データの上に別のデータを3つ重ねています。
複合グラフの編集もWeb UIからプレビュー表示付きで出来ます。
GrowthForecastの使い方として、エンジニアが手間をかけずにとりあえずあるサービスのデータを送るcronを設置しグラフ化、ディレクタや他のエンジニアがそれを確認しつつ、差分表示したり、グラフを重ねたりし、サービスが今どんな状態を知り、改善し、またその改善の結果を簡単に確認するというのがいいんじゃないかなと思います。弊社では既に導入されて使われています
GrowthForecastはYappo氏のアイディア+プロトタイプが元になってます。捗るツールの神ですね!
インストール方法
これまでRRDToolをインストールするのがなかなか困難でしたが、gfxがAlien::RRDToolを作ったのでだいぶ楽になりました。
$ wget http://search.cpan.org/CPAN/authors/id/G/GF/GFUJI/Alien-RRDtool-0.0*_**.tar.gz
$ cpanm Alien-RRDtool-0.0*_**.tar.gz
これでインストールできます。もちろんextlibに入れる事も可能です。pkg-config、gettext、glib、xml2、pango、cairoあたりのライブラリもあわせて必要になります。
あとはGrowthForecast本体をgithubからcloneしてinstalldeps
$ git clone git://github.com/kazeburo/GrowthForecast.git
$ cd GrowthForecast
$ cpanm --installdeps .
ここまでできたら、あとは起動
$ perl ./growthforecast.pl --port 5125
5125番ポートでStarletが起動し、定期的にRRDをアップデートするworkerも動きます。データはすべて、GrowthForecast/data以下に保存されます。
簡単ですね!
使ったソフトウェアなど
UI
- jquery
- bootstap
サーバ側
- Plack
- Starlet
- Kossy
- DBIx::Sunny
- DBD::SQLite
- Parallel::Prefork
- Parallel::Scoreboard
KossyもCPANにあげたので、いつかもうちょっと詳しく書くつもりのよてい