Уведомление об исключении Rails в граблях - PullRequest
15 голосов
/ 23 августа 2011

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

Одна из моих задач выполняется ежедневно, и иногда она вызывает исключение, и по умолчанию я получаю это предупреждение 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 }

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

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

P.P.S. Я знаю, что я также могу изменить грабли в 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 ]

14 голосов
/ 30 мая 2012

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

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.

6 голосов
/ 24 февраля 2013

есть новое, более простое решение: драгоценный камень https://github.com/nikhaldi/exception_notification-rake

4 голосов
/ 15 мая 2012

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

1 голос
/ 08 октября 2011

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

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

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

...