アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Rails アプリの JavaScript エラーの通知

こんにちは、tahara です。

Rails のエラー通知に Exception Notifier を使われてたりすると思いますが、 JavaScript のエラー通知はみなさんどうされているのでしょうか?

ちょっと探してみたのですが、これだ! というもの見つからず、 PipelineDeals Dev Blog - PipelineDeals Dev blog - Javascript error reporting for fun and profit を参考にメールで JavaScript のエラー通知を行うようにしてみました。

  1. JavaScript の window.onerror でエラーをつかまえる。
  2. jQuery.post でエラー情報をサーバに送信。
  3. サーバで ActionMailer を使ってエラー情報をメール送信する。

app/assets/javascripts/onerror.js

// Determine if the error occurred before or after document ready
jQuery(function() { window.documentIsReady = true; });

window.onerror = function(errorMsg, file, lineNumber) {
    // report a maximum of n errors
    window.errorCount || (window.errorCount = 0);
    if (window.errorCount <= 3) {
        window.errorCount += 1;
        // post the error with all the information we need.
        jQuery.post('/javascript_error', {
            error: errorMsg,
            file: file,
            location: window.location.href,
            lineNumber: lineNumber,
            documentReady: window.documentIsReady,
            userAgent: navigator.userAgent
        });
    }
};
  • window.onerror で、エラーメッセージ等をサーバに POST します。
  • window.documentIsReady でエラーがおきたのが DOM 構築前か後か、わかるようにしてあります。
  • window.errorCount で1ページで3件をこえてエラーを通知しないようにしています。

app/controllers/javascript_error_controller.rb

# -*- coding: utf-8 -*-
class JavascriptErrorController < ApplicationController
  def index
    # 同じエラー1時間通知しない。
    Rails::cache.fetch("javascript_error #{params[:file]} #{params[:lineNumber]}",
                       :expires_in => 1.hours) do
      Notifier.javascript_error(params).deliver
      true
    end
    head :ok
  end
end
  • ActionMailer でメールを送るだけ。
  • memcached バックエントのキャッシュ使って、同じエラーを1時間の間は通知しないようにしています。

こんな感じで、JavaScript エラーがメールで通知されるようになりました。 もっとエレガントな方法があれば教えてください。

定期的に JavaScript のエラー殲滅デー をもうけて、品質を上げていきたいと思います。