2009-08-14 11 views
5

I zostały szczęśliwie używając idiomu DelayedJob:Jak mogę zintegrować Hoptoad z DelayedJob i DaemonSpawn?

foo.send_later(:bar) 

Wymaga to pasek metodę na foo obiektu w procesie DelayedJob.

Używam DaemonSpawn do rozpoczęcia procesu DelayedJob na moim serwerze.

Ale ... jeśli foo zgłasza wyjątek, Hoptoad go nie łapie.

Czy jest to błąd w którymkolwiek z tych pakietów ... czy muszę zmienić konfigurację ... lub czy muszę wstawić wyjątek obsługi w DS lub DJ, który wywoła powiadomienie Hoptoad?


W odpowiedzi na pierwszy komentarz poniżej.

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 

Odpowiedz

0

Po prostu go tam wyrzucam - twój demon powinien wymagać środowiska, w którym pracujesz. Powinno to wyglądać następująco:

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

W ten sposób można określić środowisko, w którym demon jest wywoływany.

Ponieważ działa z opóźnioną szansą na zadanie, demon już to robi (potrzebuje activerecord), ale być może potrzebujesz tylko minimalnego activerecord, aby uczynić delayed_job szczęśliwym bez szyn.

+0

to jest dobra odpowiedź, ale DJ robi, że po uruchomieniu.DJ zaczyna od skryptu/delayed_job i zawiera ten kod: klasa opóźnionaJobWorker

1

Hoptoad używa metody przechwytywania Railsów rescue_action_in_public do przechwytywania wyjątków i ich rejestrowania. Ta metoda jest wykonywana tylko wtedy, gdy żądanie jest wywoływane przez kontroler Rails. Z tego powodu Hoptoad jest całkowicie nieświadomy generowanego wyjątku, na przykład przez zadania rake lub skrypt/runner rails.

Jeśli chcesz śledzić wyjątek Hoptoad, powinieneś ręcznie go zintegrować. To powinno być dość proste. Poniższy fragment kodu pokazuje, jak Hoptoad jest wywoływana

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 

Wystarczy obejmują bibliotekę Hoptoad w swoim środowisku i nazywają notify_hoptoad(exception) powinno działać. Upewnij się, że twoje środowisko udostępnia ten sam interfejs API kontrolera Railsowego lub Hoptoad może narzekać.

3

Zapoznaj się źródło Opóźnione :: Hioba ... jest urywek jak:

# 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 

nie próbowałem, ale myślę, że można zrobić coś takiego:

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

Spróbuj monkeypatching Opóźnione :: Pracownik # 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 

Ten pracował dla mnie.

(w Rails 3.0.10 aplikacji przy użyciu delayed_job 2.1.4 i 2.4.11) hoptoad_notifier

+0

Dziękujemy za określenie wersji! –

+1

Gdzie definiowane jest 'handle_failed_job_without_airbrake'? Kolejne nowe rzeczy i próbujące zrozumieć tę poprawkę. Mamy już ten kod, ale zmieniłem go, ponieważ aktualizujemy z hoptoad_notifier-2.4.11 do airbrake_notifier-3.0.9 – Bradley

+2

Jest on tworzony przez metaprogramming w alias_method_chain. Kiedy mówisz "alias_method_chain: handle_failed_job,: airbrake", alias_method_chain zasadniczo zmienia nazwę "handle_failed_job" na "handle_failed_job_without_airbrake" i zmienia nazwę "handle_failed_job_with_airbrake" na handle_failed_job. Umożliwia to zawinięcie oryginalnej implementacji i wykonanie czynności przed lub po. Jeśli jesteś ciekawy, zajrzyj do kodu: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/aliasing.rb – bonkydog

Powiązane problemy