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!






