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 とか要らないし。

追記

無事取り込まれました。ありがたい事です。