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

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

Этот похожий вопрос (без ответов) говорит добавление того же хука в класс почтовика не сработало.

Что за хитрость?

Обновление:

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

12 голосов | спросил Jordan Feldstein 2 +04002012-10-02T05:28:47+04:00312012bEurope/MoscowTue, 02 Oct 2012 05:28:47 +0400 2012, 05:28:47

4 ответа


0

Я тоже просто искал решение этой проблемы и нашел эту суть .

Я не знаю, откуда он (нашел его в 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.

ответил rchampourlier 5 Jpm1000000pmSat, 05 Jan 2013 17:16:53 +040013 2013, 17:16:53
0

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

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

ответил lsaffie 21 FebruaryEurope/MoscowbFri, 21 Feb 2014 04:58:06 +0400000000amFri, 21 Feb 2014 04:58:06 +040014 2014, 04:58:06
0

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

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

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

ответил Andrew Hill 12 WedEurope/Moscow2012-12-12T21:09:43+04:00Europe/Moscow12bEurope/MoscowWed, 12 Dec 2012 21:09:43 +0400 2012, 21:09:43
0

Лучший способ - использовать 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
ответил Jordan Feldstein 19 12012vEurope/Moscow11bEurope/MoscowMon, 19 Nov 2012 22:04:01 +0400 2012, 22:04:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132