Подтвердить что ты не робот

Как заставить Delayed_Job уведомлять Airbrake, когда ActionMailer попадает в сообщение об ошибке?

В документах DelayedJob упоминаются крючки, в том числе ошибки, но только в контексте пользовательских подклассов.

Этот аналогичный вопрос (без ответов) говорит, что добавление того же самого крючка в класс почтовой программы не сработало.

Какой трюк?

Обновление:

В общем, я хотел бы посмотреть, как добавить крючки к заданиям, которые запускаются с использованием синтаксиса object.delay.action(), где я не вижу очевидной ссылки на класс ____Job.

4b9b3361

Ответ 1

Я просто искал решение этой проблемы, и я нашел этот смысл.

Я не знаю, откуда оно взялось (нашел его в Google), но, похоже, он работает хорошо, довольно просто и, кажется, следит за плагиновой системой DelayedJob, о которой я даже не подозревал...

Вот слегка улучшенный, используя части предыдущего кода обезьяны-патча:

# https://gist.github.com/2223758
# modified

module Delayed
  module Plugins
    class Airbrake < Plugin
      module Notify
        def error(job, error)
          ::Airbrake.notify_or_ignore(
            :error_class   => error.class.name,
            :error_message => "#{error.class.name}: #{error.message}",
            :parameters    => {
              :failed_job => job.inspect,
            }
          )
          super if defined?(super)
        end
      end

      callbacks do |lifecycle|
        lifecycle.before(:invoke_job) do |job|
          payload = job.payload_object
          payload = payload.object if payload.is_a? Delayed::PerformableMethod
          payload.extend Notify
        end
      end
    end
  end
end

Delayed::Worker.plugins << Delayed::Plugins::Airbrake

Он добавит сообщение об ошибке и полезную нагрузку, чтобы оно было доступно в Airbrake.

Ответ 2

Там жемчужина DJ-honeybadger. Разумеется, драгоценный камень поддерживается, что делает его намного лучше, чем использование патча обезьяны. Конечно, когда вышел патч обезьяны, для этого не было камня.

https://github.com/honeybadger-io/delayed_job_honeybadger

Ответ 3

Лучший метод - использовать Global Hooks. Кто-то предложил это в 2011 году, но похоже, что они еще не реализованы.

В то же время это работает с файлами обезьян:

# Patch delayed job to report runtime errors to Airbrake
module Delayed
  class Worker

    protected

    def handle_failed_job_with_airbrake(job, error)
      ::Airbrake.notify(
        :error_class   => error.class.name,
        :error_message => "#{error.class.name}: #{error.message}",
        :parameters    => {
          :failed_job => job.inspect,
        }
      )

      handle_failed_job_without_airbrake(job, error)
    end

    alias_method_chain :handle_failed_job, :airbrake

  end
end

Ответ 4

Вероятно, самый простой способ получить delayed_job для отправки через предупреждение Airbrake при неудачном выполнении задания на обезьяну-patch delayed_job. Это позволяет вам зацепиться за внутреннюю структуру delayed_job и немного изменить его, чтобы предупредить Airbrake, когда что-то пойдет не так.

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

Однако, возможно, самый простой пример, который я видел, как сделать то, что вы хотите, - это обезвредить метод handle_failed_job, как показано здесь. Обратите внимание, что в этом примере используется старая система Hoptoad для оповещения, поэтому, если вы используете современный драгоценный камень Airbrake, вам нужно будет изменить код, который делает фактическое уведомление таким, как описано здесь.