profiler for Ramazeさんなパッチ
Ramazeさんでだって profile 採りたいじゃないですか。そういうわけなのでそういうパッチを作りました。Ramaze::Contribでプラグインを作成する実験も兼ねるつもりで書いてみましたが、いや、簡単ですね。さすがはRamazeさん、素晴しい!
http://groups.google.co.jp/group/ramaze/browse_thread/thread/fe00b195a88eddbb
使い方は次のような感じです。
# profiling をロード Ramaze::Contrib.load :profiling # あとはサーバを普通に起動するだけ Ramaze.start
で、これであとはブラウザでアクセスして下さい。これだけで対応する action の profile が採れます。profile の結果はログに記録されることになっております。
実装に関してはruby-prof の Rails プラグインをお手本にしました。Ramazeだから良いところを無理矢理挙げるとすれば Dispatcher::FILTER がとってもありがたい感じです。Dispatcher::FILTER は、リクエストが来た時にこのフィルタをくぐらせるもの。普通は Dispatcher::File と Dispatcher::Action が入っていて、前者は static なファイルを配信するのに使われ、後者は Controller の action を実行するのに使われます。プロファイラは結局この action を ruby-prof で包んでやれば良いわけです。だから、Dispatcher::Action を継承する Dispatcher::ActionProfiler を作成して、次のようにフィルタを交換しました。
module Contrib class Profiling trait :min_percent => 1 def self.startup Dispatcher::FILTER.delete(Dispatcher::Action) Dispatcher::FILTER << Dispatcher::ActionProfiler end end end
こんな感じで Dispatcher::FILTER から Dispatcher::Action を削除して、Dispatcher::Action を包んだ Dispatcher::ActionProfiler を追加しました。一方、ruby-prof の Rails プラグインは直接 ActionController をいじっちゃってるんですよね。Rails 版は Rails 的に実装されているわけなのですが、Ramazeのやり方がより素直なんじゃないのかな、と個人的には思います。with とか without とか要らないし。
追記
無事取り込まれました。ありがたい事です。