Devel::KYTProfが大幅にパワーアップしたぞ!
ということで、Devel::KYTProf 0.9991をリリースしました。
https://metacpan.org/pod/Devel::KYTProf
YAPC::Tokyoのfujiwaraさんの「Perlでも分散トレーシングしたい」というトークでDevel::KYTProfに褒められが発生していて、AWS X-Rayという現代のテクノロジーでDevel::KYTProfがパワーアップして華麗に復活するの面白いなーとか思ったので、ちょっと古かった点とかissueとかをカンファレンス駆動で一気に直した。やっぱカンファレンス翌日のhack day欲しくなりますね。
そこから少し間が空いてしまったのですが、onishiさんにコラボとcomaint付けてもらってリリースした次第。以下変更点など。
DBI Profilerを改善
https://github.com/onishi/perl5-devel-kytprof/pull/16
今回の目玉。
DBIのクエリ呼び出しを網羅してフックするのは実はかなり大変で、Devel::KYTProfも不十分だという積年の課題がありましたが、この度めでたく解決しました。
具体的には do, selectall_arrayref, selectrow_arrayref, selectrow_array辺りをMySQLでフックできてなかったのを対応しています。内部的にはDBIx::Tracerを使うようにしたので、以前よりわずかにオーバーヘッドがあるかもしれません。
それと同時にadd_prof の引数の末尾に $sampler_sub を渡せるようになりました。これはメソッド実行前に処理され、プロファイルをおこなうかどうかの真偽値を返すためのsubrefを渡せるものです。偽値を返した場合、メソッドが直ちに実行され、プロファイルは行われないようになっています。ただ、これはDBI Profiler改善のために無理やりつけた機能感が否めないため、今のところEXPERIMENTALな機能だと考えています。
Profilerをパッケージ定義できるように
https://github.com/onishi/perl5-devel-kytprof/pull/14
これも結構便利です。
すでに、Devel::KYTProf::Logger::XRay のようにLoggerは独自のパッケージに差し替え可能になっていますが、Profilerもユーザーが独自のパッケージを定義できるようになりました。
"Devel::KYTProf::Profiler::" . $target_pkg と言った名前空間でパッケージ定義します。例えば、組み込みの DBI だと Devel::KYTProf::Profier::DBI という具合です。
Profilerパッケージの作成は簡単で、そのパッケージに apply という関数を定義しておくだけです。これを、 Devel::KYTProf->apply_prof('DBI') のようにすれば読み込みができます。詳しくは組み込みのProfierの実装を見ればイメージが沸くでしょう。
組み込みのProfierは、 DBI, LWP::UserAgent, Cache::Memcached::Fast, MogileFS::Client, Furl::HTTP を提供しています。これらは今のところ全て自動で読み込まれますが、流石にMogileFSとかどうなのかと言う感じなので、変更する可能性はあります。
ということで、独自のProfilerを追加できるようになったので、是非作成してCPANizeして活用してみてください。Devel::KYTProf::Profiler::Redis::Fastとかあると良さそうですね!Redisは組み込みで欲しいくらいですが。
組み込みProfilerの自動読み込みをオフれるように
() 付きでuseすれば、何も組み込みProfilerを読み込まないようになりました。
use Devel::KYTProf ();
Devel::KYTProf->apply_prof('DBI');
Devel::KYTProf->apply_prof('Furl::HTTP');
などとすれば使いたいProfilerだけを選択的に読み込むことができます。
UNIVERSAL::require から Module::Load へ
https://github.com/onishi/perl5-devel-kytprof/pull/13
UNIVERSAL::require は一世を風靡しましたが、今はModule::Loadを使う方が良かろう、ということでスイッチしました。
Devel::KYTProf::Logger::XRay とかと組み合わせてトレーシング用途で本番で使うとなると、UNIVERSALにrequireが生えているのはやはりちょっと怖いので、というのもあります。
ただ、 Devel::KYTProf で use UNIVERSAL::require; されていることを期待しているコードを書いている場合は動かなくなる場合があるかも知れないのでその場合は別途明示的にコード内で、 use UNIVERSAL::require; してください。
Class::Data::Inheritance から Class::Data::Lite へ
https://github.com/onishi/perl5-devel-kytprof/pull/15
これは個人的な趣味ですが、 Class::Data::Inheritable が Inheritableである必要とか、@ISA 変更する必要とか無いよなーとかそういうのを思ったので、 Class::Data::Lite というのを新たに作って、そちらに切り替えました。つまり、Class::Accessor::Lite と同じような動機です。多少は効率良くなっているかも知れません。久々の新作CPANizeです。
https://metacpan.org/pod/Class::Data::Lite
まとめ
ということで是非お使いください。結構中身をゴリッといじったので、0.9991というバージョンで出しています。今後、多少非互換修正も加える可能性もありますが、様子を見てversion 1を出したいと考えています。