読者です 読者をやめる 読者になる 読者になる

ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

HRForecastを使ってみる

まあ、どうも、お世話になっております。名刺を見せるとちょっと「僕も面白く出来ていますかね」と自問してしまいます、どうもマコピーです。

さて、なんで昨日GitHubなんかのAPI使うぜみたいなこと書いたかというと、新しいおもちゃを使ってみようと思って、それには取ってくる数字が必要だったわけです。

それが、HRForecast。
HRForecast - もうひとつのデータビジュアライズツール - blog.nomadscafe.jp
GrowthForecastに比べて使っているよという話が少ないのですがどうでしょうか。やっぱりドキュメントがGrowthForecastに比べるとあまりないような気がします。
というわけで、ちょっくら使ってみます。

GrowthForecast vs HRForecast

これら2つはどちらも数字の可視化ツールなわけでございますが、少し毛色が違っていて用途も少し違うような気がします。
ちょっと気づいた点をまとめたのが以下の表になります。

GrowthForecast HRForecast
導入 依存パッケージのRRDToolが鬼門 落としてきて実行するだけ
ドキュメント 公式を始めたくさんの作例 あまり見かけない
データベース SQLite or MySQL MySQLのみ?(ちょっと書き換えればSQLiteでもいけそう)
インポート RRDTool頼み MySQLで流しこむことは可能そう。そもそもAPIで時間指定で投げることが出来る
エクスポート JSONで可能*1 CSV出力可能(そもそもグラフ化ライブラリがCSVを元にグラフ化するもののようです)
時間分解能 RRDToolに依存(たぶん秒単位) 1時間単位

多分一番最後のが両者を分ける最大の要素だと思っています。
あとHRForecastはJavaScript製のグラフ化ライブラリがフロントエンドになっているので拡大縮小がzabbixのように出来る点も見逃せません。

導入

kazeburoさん本人がエントリを書いてらっしゃるので、この通りにやってみます。

1. 落としてくる

$ git clone https://github.com/kazeburo/HRForecast.git
$ cd HRForecast

2. 依存パッケージを入れる

$ cpanm --installdeps .

cpanminus導入についてはもうperlberwかplenv使えばいいじゃないんですかねっという感じです。
perlbrewで構築するモダンなPerl環境 | シーズクリエイターズブログ
☆plenv☆ 〜 brand new perl5 installation management tool♪ 〜 - tokuhirom's blog.
あ、ちなみにHRForecastはGrowthForecast同様Perl製です。イマドキのPerl環境はperlbrewで作っちゃうのが流行りらしいですぞ。
僕は手元ではplenv、今回検証したサーバ上ではperlbrewを使っています。

3. データベースの用意

$ mysql
> CREATE DATABASE `hrforecast`;
> GRANT ALL ON hrforecast.* hrforecast@localhost IDENTIFIED BY "password";
> exit;
$ mysql -uhrforecast hrforecast -p < schema.sql

とりあえずこんなかんじでデータベース作ったり流し込んだり。

4. 設定
config.plをいじります

{
    dsn => 'dbi:mysql:hrforecast;hostname=127.0.0.1',
    username => 'hrforecast', #dbのユーザ名
    password => 'password', #dbのパスワード
    port => '5127', #bindするport
    host => '127.0.0.1', #bindするIP
    front_proxy => [],
    allow_from => [],
};

5. 起動

$ perl hreforecast.pl --config config.pl

これでとりあえずlocalhost:5127にアクセスすると見えるはずです。
僕はこの後にnginxの設定を書き換えてdigest認証を掛けてプロキシ設定をかけました。

なんかデータを放り込んでみる

たぶんfluentd界隈の人はプラギンか何かを使って放り投げるんでしょうが僕はよくわからないのでyappoさんのgrouthforecast-workerを使って投げています。

これも簡単で、cloneしてきて、ちょっといじります

diff --git a/grouthforecast.pl b/grouthforecast.pl
index c1192de..c816516 100755
--- a/grouthforecast.pl
+++ b/grouthforecast.pl
@@ -6,14 +6,15 @@ use File::Spec;
 use File::Basename;
 use LWP::UserAgent;
 use Path::Class;
+use Time::Piece;
 
 my $script_dir = shift @ARGV;
 
 # GrowthForecast の /api の URL
-my $growthforecast_endpoint = 'http://example.com/api';
+my $growthforecast_endpoint = 'http://localhost:5127/api';
 
 # グラフをどのサービスに属するかを example の変わりに入れてね
-my $service_name = 'example';
+my $service_name = 'gistream';
 
 # 必要に応じて以下を書いてね
 my $MYSQL_BATHCH_HOST     = '';
@@ -26,6 +27,7 @@ sub post {
     my($section, $name, $number) = @_;
     my $res = $ua->post("$growthforecast_endpoint/$service_name/$section/$name", {
         number => $number,
+        datetime => Time::Piece->new->datetime,
     });
 }

とりあえず投げるAPIのURLを書いたのと、あとサービス名(今回はgistream)、それからGrowthForecastと違ってdatetimeというパラメータが必須なのでそれも投げているのを追加しています。

で、こんなかんじの構造にします。

$ pwd
/home/mackee/grouthforecast-worker
$ tree
.
├── README.pod
├── grouthforecast.pl
└── scripts
    └── languages
        └── bulk_files
2 directories, 3 files

scripts以下にlanguagesというディレクトリを掘ってbulk_filesというスクリプトを置いときます。
languagesってのはグラフのセクション名です。
bulk_filesは以下の様な感じです。

まあやってることはGitHubAPIでGistにアップされたファイルを取ってきて使われているプログラミング言語を抽出してTSVで数を吐いているだけです。
grouthforecast-workerはbulk_なんとかってつけるとtsvで複数の値を一気に投げれるのでこんなかんじにしています。

で、これをcronで10分ごとに投げるように登録します。
なんで10分毎かというと、Gistの制限でsinceを1時間前とかに設定しても最大30件までしか取ってこれないみたいなので10分毎にしてStorableにしている感じです。で、これを毎時9分、19分、29分……とかに投げています。もうちょっとうまくすればなんか各1分の取りこぼしを防げるのですがもうなんかゆるふわな感じになっています。眠かったのです。

完成品

で、出来たのがこちらです。

複合グラフで色々組み合わせています。
こんなかんじで埋め込みも出来るようです。


というわけでGrowthForecastほど「今」を知りたくないのであればHRForecastでもできるし、あとCSVで吐けるので過去の同時間帯とかと比較することも出来そうです。GrowthForecastもいいけれどHRForecastも使ってみてはいかがでしょうか。

追記

なんか埋め込んだら超横圧縮されてるのでリンク。
http://gistream.topolog.info/ifr_complex/gistream/languages/LL?t=m

*1:ちなみに僕のブランチにCSV出力対応を中途半端にしたものが……