【Munin】koboストア書籍数グラフ化プラグイン書いてみた(Perl)

【Munin】koboストア書籍数グラフ化プラグイン書いてみた(Perl) はてなブックマーク - 【Munin】koboストア書籍数グラフ化プラグイン書いてみた(Perl)


◆今度は Perl の Munin プラグインです。

Munin のプラグインは、シェルスクリプトだけではなく、様々な言語を利用することが出来ます。今日は Perl で書いたプラグインをご紹介。

プラグイン名称は「kobo_counter」。名前からお察しのように、国内大手電子出版プラットフォームの、日本語書籍数をカウントするものです。画面のデモは、こちらのページからご覧いただけます。

しくみは、LWP::Simple モジュールを使用しています。プラグイン本体である perl スクリプトそのものが、サイトから HTML 文を取得します。そして、文中の書籍数だけを抽出・加工し、Munin に引き渡す動作を行います。

このプラグインがあれば、日本語書籍数の推移を自分で確認することが出来ます。

中身は、次の通りです。

#!/usr/bin/perl

# Munin plugin - kobo counter
# The MIT License
# Sep 27, 2012  ver 0.01 created by Masahito Zembutsu <zem@pocketstudio.jp>

use LWP::Simple;

if ($ARGV[0]) {
 &print_config if ($ARGV[0] eq "config");
} else {
 &main;
}

exit;

sub print_config {

 print "graph_args -r --lower-limit 0","\n";
 print "graph_title kobo store's counter","\n";
 print "graph_category kobo","\n";
 print "graph_info How many books does this store?","\n";
 print 'graph_vlabel books',"\n";

 print "Total.label Total number of books","\n";
 print "Total.draw AREA","\n";
 print "Total.type GAUGE","\n";

 return;
}

sub main {

 my $url = 'http://kobo.rakuten.co.jp/';
 my $html = get $url;
 my $count = 0;

 if ($html =~ m#(<big>)(.*)(</big>)#) {
 $count = $2;
 $count =~ s/,//g;
 }

 print "Total.value $count\n";
 return;
}

1;

こちらは Perl を書かれている方であれば、お分かりかと思いますが、基本的に構造はシンプルです。処理の流れは、先日公開したシェルスクリプトによるプラグインと殆ど同じです。引数に “config”があれば、グラフの定義情報を返します。何も引数がなければ、書籍数を返すものです。

では、今回も上から順に見ていきましょう。

#!/usr/bin/perl

普通に Perl なシバン行。

# Munin plugin - kobo counter
# The MIT License
# Sep 27, 2012  ver 0.01 created by Masahito Zembutsu <zem@pocketstudio.jp>

コメントとクレジット。

use LWP::Simple;

ここで Perl のモジュール LWP::Simple を用いることを宣言。

if ($ARGV[0]) {
 &print_config if ($ARGV[0] eq "config");
} else {
 &main;
}

exit;

そして、引数の有無のチェックを行います。引数があり、かつ “config” の文字列であれば、サブルーチン print_config に処理を引き渡します。そうでなければ、サブルーチン main に処理が移ります。

sub print_config {

 print "graph_args -r --lower-limit 0","\n";
 print "graph_title kobo store's counter","\n";
 print "graph_category kobo","\n";
 print "graph_info How many books does this store?","\n";
 print 'graph_vlabel books',"\n";

 print "Total.label Total number of books","\n";
 print "Total.draw AREA","\n";
 print "Total.type GAUGE","\n";

 return;
}

サブルーチン print_config は、RRDTool のグラフに引き渡す定義情報です。グラフの件名や軸ラベル、Munin 上のカテゴリを等を指定しています。

では、次に main を見ていきましょう。

sub main {

 my $url = 'http://kobo.rakuten.co.jp/';
 my $html = get $url;
 my $count = 0;

ここは変数を初期化しています。$url が電子書籍ストアの URL です。そして、その次の【 get $url 】で対象 URL のページ情報を取得し、HTML データを、変数 $html に格納しています。$count は、書籍の冊数です。

if ($html =~ m#(<big>)(.*)(</big>)#) {
 $count = $2;
 $count =~ s/,//g;
 }

そして、変数 $html に含まれるものから <big>~</big> で囲まれている箇所を抽出します。このタグで囲まれてるところに冊数が記述されているからです。そして、冊数には , がありますが、不要なので削ります。

print "Total.value $count\n";
 return;
}

そして、最後は Munin に「Total.value xxx」という形式でデータを返します。

1;

これは Perl の末尾に記述します。サブルーチンで処理におかしなトコロがあれば、エラーとして表示されるようにするためです。

では、実際にこのプラグインを使いたいときは、以下の手順でお試し下さい。

# vi /usr/share/munin/plugins/kobo_counter
# chmod 755 /usr/share/munin/plugins/kobo_counter
# ln -s /usr/share/munin/plugins/kobo_counter /etc/munin/plugins
# /etc/init.d/munin-node restart

今回の例では、対象の数値前後に分かりやすいタグがあったため、正規表現によって比較的簡単に抽出することが出来ました。もし複雑な構文の場合は HTML::TokeParser モジュールを使った解析がオススメです。