Time to Read

3分

Rails のパフォーマンス計測といえば New Relic !」みたいなオーラもありつつ、普通に Rack アプリケーション一般でも使えるので、そのやり方をメモする。

以下の手順の前に、まずは New Relic への登録をしておこう。そんで、イントロを一通り読んどこうね。

Gemfile の編集

一行追加。

1
gem 'newrelic_rpm'
1
bundle

はい。

計測用の Rack Middleware を自作

Rack 向けミドルウェアと言うかたちで切り離されているわけではないようなので、以下の手順で。

NewRelic::Agent::Instrumentation::Rack の説明のとおりに、メトリックだけをするミドルウェアを作成。

lib/app_metric.rb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
require 'new_relic/agent/instrumentation/rack'
class AppMetric
  # アプリケーションをスルーするミドルウェアを実装:
  def initialize(app)
    @app = app
  end
 
  def call(env)
    @app.call(env)
  end
 
  # call を定義した後で include すること:
  include NewRelic::Agent::Instrumentation::Rack
end

config.ru や Sinatra/Padrino のアプリケーションクラス本体で use 宣言する。

1
  use AppMetric

また、公式ページの手順にしたがい、 newrelic.yml をダウンロードして config/ ディレクトリなどに配置する。

ちなみに、 Sinatra 用の何か があるっぽいけど使い方が判然としない。無視して良さそう。

ローカル環境で確認する

ローカルの開発環境でのみ動くモニタリングツールを、 Rack Middleware として利用する。 Sinatra であれば、

1
2
3
4
5
6
7
class FooApp < Sinatra::Base
  #...
  configure :development do
    require 'new_relic/rack/developer_mode'
    use NewRelic::Rack::DeveloperMode
  end
end

Sinatra 系でない場合も同等の設定をすればよい。普通に本番環境でも見えてしまうので、 ENV が development でないなら有効にしないほうが良さそう。

あわせて、 config/newrelic.yml を以下のように直し、デベロップメンツ時も計測が動くようにする。

189
190
191
192
193
194
195
development:
  <<: *default_settings
  # Turn off communication to New Relic service in development mode (also
  # 'enabled').
  # NOTE: for initial evaluation purposes, you may want to temporarily 
  # turn agent communication on in development mode.
  monitor_mode: true

開発時は、 Thin のような単一プロセスのサーバを使うことが推奨されている。 rackup -s Thin したのち、何度かアクセスして、 http://localhost:9292/newrelic を見てみると:

うまいこと取れてそうですね。

なお、 {APP_ROOT}/log/newrelic_agent.log にログを吐く。また、正常に計測されていれば同じディレクトリに newrelic_agent_store.db, newrelic_agent_store.pid というものも現れる。参考までに。

本番環境で見てみるわけだが、その際、 unicorn 使いは注意

上記のような注意書きがある(なお、この注意書きページなぜか Firefox 9.0α で見られない……)。聞いてね~よ感強いけれど、指示にしたがって config/unicorn.rb 的なものに一行追加。

1
2
3
4
5
listen 8099
worker_processes 2
# ...
# これを追加
preload_app true

しかるのち、本番環境にデプロイメントして、 New Relic にログイン、管理画面を見てみよう:

おめでとう! これでガンガン計測できますね。

SQL チューニングとかその辺の設定はまた別途いろいろ必要そう。今回個人的には mongoDB だしやってない。とりあえず「Application settings」->「Availability monitoring」で URL の ping 設定をしといた。生死監視だけでも個人サービス運用者にはどんだけありがたいか……。

こんな感じ。 Enjoy Rack Hacking!