Railsの性能測定用プラグイン peek/peek

peek/peekという、パフォーマンス測定を目的としたRails用プラグインのコードを読んだ。rack-miniprofilerを知っている人はそういう類のもの。peekはGitHubやGitHub Enterpriseで利用されている。peekの構造は、リクエストIDごとに情報を保存する機能、リクエストIDを元に情報を取得する機能、そして情報を描画する機能の3つの部分に分解できる。

リクエストIDごとに情報を保存する

この処理は、HTMLを返却するためのリクエストの処理中に行われる。リクエストの処理中に実行される様々な処理について、それらの実行時間や実行回数を計測し、計測結果を保存する。保存先は、故意に設定しなければメモリ (厳密にはとあるクラスオブジェクトのインスタンス変数) に保存されるが、保存先をRedisやMemcacheに変更することもできる。

リクエストIDを元に情報を取得する

測定したい対象のリクエストに対して、あるJavaScriptを実行させるHTMLを含んだレスポンスが返される。このJavaScriptが、測定結果を問い合わせるためのXHRを送信する。このリクエストに対して測定結果を返却するAPIが、peekによって追加される。

これにはRails Engineの仕組みが利用されている。Railsに依存せずRack middlewareとしても実現可能だろうが、JavaScriptやCSSをRailsアプリ本体で利用しているものと一緒にコンパイルして効率的に提供することや、Railsで利用しているHTMLテンプレートの描画の仕組みを再利用したいことなどを考え、Rails Engineで実装するほうが簡単だと判断したのかもしれない。Rack middlewareで解決しようとすれば、前者はHTMLタグの中に直接script要素やstyle要素を埋め込む、後者はERBを利用するといった方法で回避できなくもない。

取得した情報を描画する

最終的に、取得した情報はヘッダ部分に描画される。これまで説明していなかったが、どの情報を収集してどのように描画するかという振る舞いの対を、プラグインとして幾らでも追加できるようになっている。収集した情報をヘッダ内でどのように表現するかという実装は、各プラグインで実装することになっている。