perlでWEBサービスを作るなら「Devel::KYTProf」を入れよう!




YouTubeにアップされた一つの動画。その動画を見て以来、僕はWEBサービスを作る時には必ず利用させてもらっているperlモジュールがある。

そのモジュールの名前は「Devel::KYTProf

モジュールを知るきっかけになった動画は、2010年のYAPC::Asiaで発表されたもので「映画にでてくるハッカーになりたい」というタイトルだ。

ふざけた名前と思うかもしれないが、発表は面白く(このセッションはエンターテイナー賞を取得している)かつ便利なプログラムが紹介されている。

あなたはすぐにでも、YouTubeのお気に入りに登録すべきだろう。

さて、この「Devel::KYTProf」というモジュール。
Hatenaのチーフエンジニアの方が作ったもので、WEBサービスを稼動させる上で、ボトルネックとなる箇所の処理にかかる時間を計測してくれる。
※はてなのサービス内でも利用されているらしい。

具体的には、
・DB接続(DBI)
・HTTP通信(LWP::UserAgent)
・キャッシュ(Cache::Memcached::Fast)
・分散ファイルシステム(MogileFS::Client)
にかかった時間をログ出力してくれて、別途、計測したいパッケージは追加できる。

導入もすごく簡単で、上記のように可視性もいい。画質は荒いが。

ログを眺めているだけで、キャッシュ取得とDB取得の頻度や、どのSQLを発行した時に処理が遅くなっているかを監視できる。

すごく便利なモジュールなんだけど、難点があって、これを稼動させると標準エラー出力ログのファイルサイズがとんでもないことになってしまう。

なので、これまでは、ログファイルのサイズを監視して、ディスクが逼迫してきたらログファイルを消すようなアナログ的な運用をしていた。でもそれってハッカー的じゃない。

そう思っていたところ、たまたまDevel::KYTProfのログをファイルに書き出して、I/Oのボトルネックを知るというエントリーが目に入った。

そうか、ディスク容量の大きな場所に、ファイル出力すればいいじゃんか。
だけど、別途、Mouse、Log::Dispatchなんかを入れたくなかったから、適当にモジュールを作ってみた。
[perl]
package OreOre::Log::Simple;

use File::Spec;
use Encode;
use IO::File;
use DateTime;

sub new {
my ($class, $param) = @_;
my $filename = $param->{filename} || ‘default.log’;
my $path = $param->{path} || ‘(your-path)’;
my $filepath = File::Spec->catfile($path, $filename);
my $timethreshold = $param->{timethreshold} || 0;

return $self = bless +{
filepath => $filepath,
timethreshold => $timethreshold,
};
}

sub log {
my ($self, %args) = @_;
my $level = $args{level};
my $time = $args{time};
$time = int($time);
if ($time >= $self->{timethreshold}) {
my $message = $args{message};
$message = encode_utf8($message);
my $datetime = DateTime->now(time_zone => ‘Asia/Tokyo’)->strftime(‘[%Y/%m/%d %H:%M:%S]’);
my $io = IO::File->new;
$io->open(">> ".$self->{filepath});
$io->print($datetime.’ ‘.$message);
$io->close;
}
}

1;
[/perl]

オプションでtimethresholdにミリセカンドを指定することで、ログ出力する処理にかかった時間でフィルタできる。
[perl]
use Devel::KYTProf;
use OreOre::Log::Simple;

my $logger = OreOre::Log::Simple->new(+{
filename => ‘kyoprof.log’,
timethreshold => 0,
});
Devel::KYTProf->logger($logger);
[/perl]

これで少しはハッカー的になっただろうか?


この記事が気に入ったら
いいね!してね

最新情報をお届けします!