追記 2012/06/22
公式ページを作りました。そちらも参考にしてくださいませ
GrowthForecast - Lightning fast Graphing / Visualization
http://kazeburo.github.com/GrowthForecast/

Kansai.pmのLTでも紹介したんだけど、APIを叩く事でグラフを更新するツールを書きました。話の発端としては「cloudforecastのグラフを外からAPIで更新したい」ということでしたが、cloudforecastではグラフの追加が重い処理になってしまうので、別のプロダクトとしています。

サーバの負荷などのメトリクスを収集し、グラフ化することで、システムに掛かっている負荷を把握し、パフォーマンスに影響がでるまえに対策をうったり、改善の結果を知る事ができますが、同じ事はシステムだけではなく提供しているサービスの動向を確認したり、サービスの改善の結果を知ることにも言えると思います。GrowthForecastは数値だけではくグラフでこのような変化を見やすくする為のツールとして利用することができます。

growth1.png

↑画面はこんな感じ。

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なので一方向に増えて行ってます。

graph2.png

GrowthForecastははグラフデータを更新する際に、前回との差分も取っているので、2行目のような差分グラフも表示できます。

差分グラフの表示、非表示グラフの色、単位などはWeb上のUIから変更可能です。

graph3.png

複合グラフ

もう一つ、GrowthForecastの機能で、複数のデータを1つのグラフにまとめて表示できる機能があります。

graph4.png

これは先ほどのdateを送っているグフラの差分データの上に別のデータを3つ重ねています。

複合グラフの編集もWeb UIからプレビュー表示付きで出来ます。

graph5.png

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にあげたので、いつかもうちょっと詳しく書くつもりのよてい

このブログ記事について

このページは、Masahiro Naganoが2011年12月 1日 18:12に書いたブログ記事です。

ひとつ前のブログ記事は「 Kansai.pm #14 に参加して発表しました 」です。

次のブログ記事は「Q4Mを簡単に導入する方法 - MySQL Casual Advent Calendar 2011」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja