2009-08-14 1 views
5

я с удовольствием используя DelayedJob идиомы:Как интегрировать Hoptoad с DelayedJob и DaemonSpawn?

foo.send_later(:bar) 

Это вызывает бар метод объекта обув в процессе DelayedJob.

И я использую DaemonSpawn для запуска процесса DelayedJob на моем сервере.

Но ... если foo выбрасывает исключение, Hoptoad не поймает его.

Это ошибка в любом из этих пакетов ... или мне нужно изменить какую-то конфигурацию ... или мне нужно вставить некоторые обработки исключений в DS или DJ, которые будут вызывать уведомитель Hoptoad?


В ответ на первый комментарий ниже.

class DelayedJobWorker < DaemonSpawn::Base 
def start(args) 
    ENV['RAILS_ENV'] ||= args.first || 'development' 
    Dir.chdir RAILS_ROOT 
    require File.join('config', 'environment') 

    Delayed::Worker.new.start 
end 

ответ

0

Просто выбросьте его - ваш демон должен требовать среды рельсов, над которыми вы работаете. Он должен выглядеть примерно так:

RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'production' 
require File.join('config', 'environment') 

Таким образом вы можете указать среду, в которой вызывается демона.

Поскольку у него есть отсроченные шансы на работу, демон уже делает это (ему нужен activerecord), но, возможно, вам требуется минимальный activerecord, чтобы сделать delayed_job счастливым без рельсов.

+0

Это хороший ответ, но ди-джей делает это сделать, когда она начинается.DJ начинается с script/delayed_job и содержит этот код: класс DelayedJobWorker 2009-08-15 05:09:14

1

Hoptoad использует Rails rescue_action_in_public метод hook для перехвата исключений и регистрации их. Этот метод выполняется только тогда, когда запрос отправляется контроллером Rails. По этой причине Hoptoad полностью не знает ни одного генерируемого исключения, например, с помощью задач рейка или скрипта/бегуна rails.

Если вы хотите, чтобы Hoptoad отслеживал ваше исключение, вы должны вручную интегрировать его. Это должно быть довольно просто. Следующий фрагмент кода показывает, как жаба вызывается

def rescue_action_in_public_with_hoptoad exception 
    notify_hoptoad(exception) unless ignore?(exception) || ignore_user_agent? 
    rescue_action_in_public_without_hoptoad(exception) 
end 

Просто включите библиотеку жаба в вашей среде и вызвать notify_hoptoad(exception) должны работать. Убедитесь, что ваша среда предоставляет тот же API контроллера Rails, что и Hoptoad.

3

проверить источник Отложенную :: Работа ... есть фрагмент кода, как:

# This is a good hook if you need to report job processing errors in additional or different ways 
def log_exception(error) 
    logger.error "* [JOB] #{name} failed with #{error.class.name}: #{error.message} - #{attempts} failed attempts" 
    logger.error(error) 
end 

Я не пробовал, но я думаю, что вы могли бы сделать что-то вроде:

class Delayed::Job 
    def log_exception_with_hoptoad(error) 
    log_exception_without_hoptoad(error) 
    HoptoadNotifier.notify(error) 
    end 

    alias_method_chain :log_exception, :hoptoad 
end 
5

Попробуйте monkeypatching Задержка :: Worker # handle_failed_job:

# lib/delayed_job_airbrake.rb 

module Delayed 
    class Worker 

    protected 

    def handle_failed_job_with_airbrake(job, error) 
     say "Delayed job failed -- logging to Airbrake" 
     HoptoadNotifier.notify(error) 
     handle_failed_job_without_airbrake(job, error) 
    end 

    alias_method_chain :handle_failed_job, :airbrake 

    end 
end 

Это работает для меня.

(в Rails 3.0.10 приложения, используя delayed_job 2.1.4 и 2.4.11) hoptoad_notifier

+0

Спасибо за указание версий! –

+1

Где определяется 'handle_failed_job_without_airbrake'? Относительно нового к этому и пытающегося понять этот патч. У нас уже есть этот код, но я его настраиваю, потому что мы обновляемся от hoptoad_notifier-2.4.11 до airbrake_notifier-3.0.9. – Bradley

+2

Он создается метапрограммированием в alias_method_chain. Когда вы говорите «alias_method_chain: handle_failed_job,: airbrake», alias_method_chain по существу переименовывает «handle_failed_job» в «handle_failed_job_without_airbrake» и переименовывает «handle_failed_job_with_airbrake» в handle_failed_job. Это позволяет обернуть первоначальную реализацию и сделать что-то до или после. Взгляните на код, если вам интересно: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/aliasing.rb – bonkydog