読者です 読者をやめる 読者になる 読者になる

Shoken Startup Blog

KitchHikeを作っています。ひとつずつアウトプットします。

Rails + New RelicでRuby 2.0にバージョンアップするとエラー NoMethodError undefined method `empty?'

Rails Ruby

解決するまでに時間がかかったので、情報共有。

以下に当てはまる場合は一読を

  • Rails 3.2系
  • New Relicで監視している
  • Ruby 1.9.3から2.0へバージョンアップするとエラー
  • Production環境のみで、TOP画面アクセスした場合にNoMethodErrorが出る
NoMethodError (undefined method `empty?' for nil:NilClass):
  app/controllers/xxxx

解決策はNew Relic Gemのアップデート

New RelicのGemを3.6.x以上にアップデートする。 Gem名はnewrelic_rpm

なぜ解決に時間がかかるのか

理由1. Production環境かつ、New Relicで監視している環境でしか再現しない

原因がわかった後から考えると当然なのだが、原因不明だった時はなぜ本番環境のみで発生するのかわからなかった。Production環境で起動しているステージング環境を用意していたのだが、New Relicを入れてなかったので再現せず、現象の再現までに時間がかかった。

理由2. エラーログにNew Relicとわかる情報が出ない

RailsのログにはNoMethodErrorが出るがスタックトレースにNew Relicの文字が出ない。こんなログが出る。

[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01] Started GET "/" for 50.31.164.139 at 2013-12-28 09:12:54 +0000
[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01] Processing by TopController#index as */*
[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01] Completed 500 Internal Server Error in 280ms
[2013-12-28 09:12:54] [xxx.xxx.xxx.139] [nil] [xxxxxxxxx85be8a473f10507bd9acc01]
NoMethodError (undefined method `empty?' for nil:NilClass):
  app/controllers/concerns/mobile_view_selectable.rb:32:in `render_to_body_with_rename'
  app/controllers/application_controller.rb:36:in `set_timezone'

最初はset_timezoneを追っかけてた。 他の人のブログを読むと、スタックトレース部分のエラーログは環境によって変わる。

理由3. エラーログで検索しても情報が見つけにくい

Ruby 2.0にバージョンアップすると出るので、最初は”Rails Ruby 2.0 NomethodError”や”Rails Ruby 2.0 Error set_timezone”で検索していたが、他の多くの情報に埋もれて解決できる情報にはたどり着けなかった。結局、本番環境でデバッグして、ソースコードを追っていくとNew Relicのコード内でメソッドを呼び出し例外が発生していることが判明。

Rails Ruby 2.0 New Relic”で検索すると困っている人や解決した人がいっぱいいた。