はちゅにっき

こっちのブログはまったり更新

GrowthForecast つかってみた

なんかすごくグラフを作成したい要件があったので、id:kazeburo さんが開発している GrowthForecast をつかってみました。

GrowthForecast
https://github.com/kazeburo/GrowthForecast

いつも通りメモだよん。

GrowthForecast を Clone する

App::gh *1 をインストールしてあるので、gh コマンドを使って

$ gh clone kazeburo/GrowthForecast

でおわり。便利ですね!

依存モジュールをインストール

cpanm さえ入っていればこれもいつものように

$ cpanm -l extlib --installdeps .

でおわり。これまた便利!

Alien::RRDtool をインストール

依存モジュールインストールしたし、もうカンペキ!と思ったけれど、実はグラフ描画ツールである RRDtool は一緒にインストールされない模様。
ということで、RRDtool も導入します。
今までは yum / aptitude などを経由してインストールしたり、自分でコンパイルしたりと大変でしたが、今は Alien::RRDtool があるので、こちらを cpanm を使っていれます。
依存するライブラリの問題でインストールできない場合もありますが、その場合は yum / aptitude などで依存ライブラリを別途インストールする必要があります。

$ cpanm -l extlib Alien::RRDtool

起動してみる

GrowthForecast には growthforecast.pl という起動スクリプトがついてくるので、これを実行してアプリケーションを起動します。

$ perl growthforecast.pl --host 0.0.0.0

これだけで準備完了。カンタン!

curl でグラフをかく

特定の URL を叩くだけでグラフを生成してくれるので、ためにし curl でグラフを書いてみます。

$ curl -F number=2.5 -F mode=gauge http://mydomain.com:5005/api/service/section/name

これだけでカンタンにグラフが。。。
あれ?なんか "number is not null" とか言うエラーが出ちゃったよ?
NULL 値なんて渡してないのにどうして!?
と思い、ソースコードを見てみると、どうやら number は整数値じゃないとダメみたい。

整数値以外のグラフも描画できるように

今回どうしても、整数値以外のグラフが書きたかったので、無理矢理整数値以外でも描画できるようにしてみました。
変更した差分は以下の通り。

diff --git a/lib/GrowthForecast/Data.pm b/lib/GrowthForecast/Data.pm
index f334efa..c88c24a 100644
--- a/lib/GrowthForecast/Data.pm
+++ b/lib/GrowthForecast/Data.pm
@@ -27,7 +27,7 @@ CREATE TABLE IF NOT EXISTS graphs (
     service_name VARCHAR(255) NOT NULL,
     section_name VARCHAR(255) NOT NULL,
     graph_name   VARCHAR(255) NOT NULL,
-    number       INT NOT NULL DEFAULT 0,
+    number       REAL NOT NULL DEFAULT 0,
     mode         VARCHAR(255) NOT NULL DEFAULT 'gauge',
     description  VARCHAR(255) NOT NULL DEFAULT '',
     sort         UNSIGNED INT NOT NULL DEFAULT 0,
@@ -60,7 +60,7 @@ EOF
     $dbh->do(<<EOF);
 CREATE TABLE IF NOT EXISTS prev_graphs (
     graph_id     INT NOT NULL,
-    number       INT NOT NULL DEFAULT 0,
+    number       REAL NOT NULL DEFAULT 0,
     subtract     INT,
     updated_at   UNSIGNED INT NOT NULL,
     PRIMARY KEY  (graph_id)
@@ -70,7 +70,7 @@ EOF
     $dbh->do(<<EOF);
 CREATE TABLE IF NOT EXISTS prev_short_graphs (
     graph_id     INT NOT NULL,
-    number       INT NOT NULL DEFAULT 0,
+    number       REAL NOT NULL DEFAULT 0,
     subtract     INT,
     updated_at   UNSIGNED INT NOT NULL,
     PRIMARY KEY  (graph_id)
@@ -83,7 +83,7 @@ CREATE TABLE IF NOT EXISTS complex_graphs (
     service_name VARCHAR(255) NOT NULL,
     section_name VARCHAR(255) NOT NULL,
     graph_name   VARCHAR(255) NOT NULL,
-    number       INT NOT NULL DEFAULT 0,
+    number       REAL NOT NULL DEFAULT 0,
     description  VARCHAR(255) NOT NULL DEFAULT '',
     sort         UNSIGNED INT NOT NULL DEFAULT 0,
     meta         TEXT NOT NULL DEFAULT '',
diff --git a/lib/GrowthForecast/Web.pm b/lib/GrowthForecast/Web.pm
index 61539e9..6dd813f 100644
--- a/lib/GrowthForecast/Web.pm
+++ b/lib/GrowthForecast/Web.pm
@@ -748,7 +748,7 @@ post '/api/:service_name/:section_name/:graph_name' => sub {
         'number' => {
             rule => [
                 ['NOT_NULL','number is null'],
-                ['INT','number is not null']
+                # ['INT','number is not null']
             ],
         },
         'mode' => {

ValidateRule とか、HTML::Shakan を使ってそうな書き方なので、本当は数値だけが通るようにとかしたほうがいいとは思うんだけれど、とりあえずこれで整数値以外の値でもグラフがかけるようになりました。
いまのところ特に問題はないし、まぁいいかな?


というわけで当初の目的通り、グラフを生成することができました。

後日談

本当は GrowthForecast ではなく、HRForecast を導入しようとしていて、MySQL ではなく PostgreSQL にも対応できるように書き換えたりとか頑張ったけれど、最終的に HRForecast も整数値しかグラフにすることができなく、その部分を直すのがめんどくさそうだったので GrowthForecast に乗り換えました。時間があるときに HRForecast 整数値以外でグラフがかけるようにしたいな。

*1:cpanm App::gh でインストールしました。