Как заставить Delayed_Job уведомлять Airbrake, когда ActionMailer попадает в сообщение об ошибке?
В документах DelayedJob упоминаются крючки, в том числе ошибки, но только в контексте пользовательских подклассов.
Этот аналогичный вопрос (без ответов) говорит, что добавление того же самого крючка в класс почтовой программы не сработало.
Какой трюк?
Обновление:
В общем, я хотел бы посмотреть, как добавить крючки к заданиям, которые запускаются с использованием синтаксиса object.delay.action()
, где я не вижу очевидной ссылки на класс ____Job
.
Ответы
Ответ 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, вам нужно будет изменить код, который делает фактическое уведомление таким, как описано здесь.