Уведомление об исключении Rails в граблях

У меня есть простое приложение рельсов с несколькими контроллерами и некоторыми задачами рейка. Пара задач выполняется cron'ом, настроенным для каждого гема.

Одна из моих задач выполняется ежедневно, и иногда она вызывает исключение, и по умолчанию я получаю это предупреждение cron

rake aborted!
undefined method `parameterize' for nil:NilClass

Tasks: TOP => mailboxes:clean_processed
(See full trace by running task with --trace)

Я хочу отладить, что происходит, и по этой причине я только что установил этот гем уведомлений об исключениях с этой строкой в ​​моем Gemfile

gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier'

и настроил его в моем application.rb файл с

# enable exception notification
config.middleware.use ExceptionNotifier,
                      :email_prefix => "[MyAppName] ",
                      :sender_address => %{"notifier" <report@example.com>},
                      :exception_recipients => %w{me@example.com}

Поскольку этот драгоценный камень является промежуточным программным обеспечением стойки, он работает только для веб-запросов, а не для задач rake. Я хотел бы включить его также для задач грабли, и я нашел этот смысл, который делает работу.

Это работает, однако это не СУХОЙ, мне нужно повторить настройку gem в этом методе, и мне также нужно изменить все мои задачи rake, чтобы заключить их операторы в блок, как в

exception_notify { actual_task_code }

Есть ли лучший способ решить эту проблему?

PS Если мне нужно изменить гем уведомлений, это не будет проблемой, потому что я добавил всего несколько строк кода в свой проект.

PPS Я знаю, что я также могу изменить грабли в crontab, чтобы добавить --trace вариант, но мне не нравится это решение, потому что уведомитель об исключении imho - лучшее решение, которое также помогает в веб-коде.

Обновление Я только что обнаружил этот связанный вопрос: исключение-уведомление для delayed_job, но оба ответа используют один и тот же прием.

Я собираюсь попробовать онлайн-сервис, такой как Airbrake (ранее известный как hoptoad) или Exceptional, но оба они платные...

Обновление 2: я попробовал приложение Airbrake, очень хорошее приложение, но оно страдает от той же проблемы, мне все еще нужно взломать Rakefile, чтобы уведомить об исключениях из задач rake. Однако хак менее сухой, потому что вам просто нужен этот код:

# notify exceptions
def exception_notify
  yield
rescue Exception => exception
  HoptoadNotifier.notify exception
  raise exception
end

Нет необходимости повторять какой-либо параметр конфигурации. Я думаю, что я не могу сделать лучше, чем это, чтобы получать уведомления об исключениях в задачах рейка.

4 ответа

Решение

Драгоценные камни Airbrake исправляют Rake, чтобы позволить спасение, поэтому он уже делает то, что я прошу...

Создайте файл task.rb в config/initializers, который обезьяна исправляет Rake::Task#execute, чтобы включить функциональность exception_notify:

module Rake
  class Task
    alias :orig_execute :execute
    def execute(args=nil)
      orig_execute(args)
    rescue Exception => exception
      # Exception notification stuff
    end
  end
end

Протестировано с Rails 3.0.12, Rake 0.9.2.2.

Есть новое, более простое решение: гем https://github.com/nikhaldi/exception_notification-rake

Спасибо за это предложение; это прекрасно работает для меня, так как в данный момент у меня есть только одна задача cron.

Чтобы высушить его, вы можете превратить конфигурацию в константы, возможно, через APP_CONFIG: https://github.com/cjbottaro/app_config

Кроме того, вы можете расширить любой класс, который заботится о task :... do обернуть все в exception_notify { },

Другие вопросы по тегам