24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails アプリケーションに Bugsnag を導入したら開発環境以外では動かなかったけどちゃんとかんがえたら原因がわかってすぐに解決できたというお話

Posted at

こんにちは! みなさん! 今日も元気に Rails を使ったウェブアプリケーションの開発を行っていますか? わたしは元気ではありませんが、がんばってコードを書き続けています。

さて、ウェブアプリケーションに限った話ではありませんが、アプリケーションの開発にあたって大切なのはエラーを正しく確認してそこを修正していくというものがあります。エラーが発生しないアプリケーションを開発するというのが大前提ではあるのですが、開発するのが人間である以上どうしてもミスが起こります。

というわけでエラーが発生したらそれを開発者側に伝えられる良いのですが、発生したエラーを全て通知するということをしていると同じような内容のエラーが発生している場合には、それを切り分けるという手間が発生します。これは明確に無駄な工数となってしまい、また見落としを発生させてしまいがちです。なので、適切にエラー情報をまとめて、それを選り分ける仕組みづくりが大切です。

そこで便利に使えるウェブサービスが Bugsnag です。

Bugsnag は前述したアプリケーションで発生したエラーを送信すると、それを適切にまとめて整理した上で開発者に通知してくれるウェブサービスです。使いかたも単純で Bugsnag のアカウントを作り API Key を手に入れたあとは Bugsnag 側が提供している Ruby ライブラリーの README の手順に従えば通常の Rails を使ったウェブアプリケーションであればそれだけで Bugsnag の導入は完了です。

非常にお手軽です。

……で済めば良かったのですが、自身の手元の開発環境では発生したエラーの確認がきちんとできるのですが、ステージング環境やプロダクション環境では確認ができませんでした。

ステージング環境とプロダクション環境で確認できなければ意味がないので、どうしたものかと思っていましたが、少しかんがえたら原因は単純なものでした。アプリケーション側で rescue_from を用いて例外を握り潰し独自のテンプレートを表示させていたためでした。

単純な原因によって発生している問題なので、解決方法も単純で、

class ApplicationController < ActionController::Base

  # ...

  unless Rails.env.development?
    rescue_from Exception, with: :handle_500
  end

  # ...

  def handle_500(exception = nil)
    # 明示的に Bugsnag へ例外を通知する
    if exception.is_a? Exception
      Bugsnag.auto_notify(exception)
    end
    render template: "errors/500"
  end
end

のように Bugsnag.auto_notify を使い、例外を明示的に Bugsnag 側に通知するだけで解決です。便利ですね。

エラーを確認しながら、一つづつ潰して、元気に元気にがんばって開発を進めましょう。

元気!

24
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?