まあ、どうも、お世話になっております。名刺を見せるとちょっと「僕も面白く出来ていますかね」と自問してしまいます、どうもマコピーです。
さて、なんで昨日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