15

Mam prostą aplikację railsową z kilkoma kontrolerami i niektórymi zadaniami rake. Kilka zadań jest wykonywanych przez cron skonfigurowany z whenever gem.Powiadomienia o wyjątkach Railsowych w zadaniach rake

Jednym z moich zadań jest wykonywana codziennie, a czasami podnosi wyjątek i domyślnie otrzymam to ostrzeżenie poprzez cron

rake aborted! 
undefined method `parameterize' for nil:NilClass 

Tasks: TOP => mailboxes:clean_processed 
(See full trace by running task with --trace) 

Chcę debugowania, co się dzieje, i z tego powodu Właśnie zainstalowałem exception notification klejnot z tej linii w moim Gemfile

gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier' 

i skonfigurowaniu go w moim pliku application.rb z

# enable exception notification 
config.middleware.use ExceptionNotifier, 
         :email_prefix => "[MyAppName] ", 
         :sender_address => %{"notifier" <[email protected]>}, 
         :exception_recipients => %w{[email protected]} 

Ponieważ ten klejnot jest oprogramowaniem pośredniczącym do stojaków, działa tylko w przypadku żądań internetowych, a nie w przypadku zadań rake. Chciałbym włączyć to także dla zadań rake i znalazłem this gist, które wykonują zadanie.

To działa, jednak to nie DRY, muszę powtórzyć konfigurację klejnot w tej metodzie, a ja też trzeba zmienić wszystkie swoje zadania Rake to ująć swoje oświadczenia w bloku jak w

exception_notify { actual_task_code } 

Czy istnieje lepszy sposób na rozwiązanie tego problemu?

P.S. Jeśli muszę zmienić klejnot powiadomienia, nie byłoby problemu, ponieważ dodałem tylko kilka linii kodu do mojego projektu.

P.P.S. Wiem, że mogę również zmienić linię rake w crontabu, aby dodać opcję --trace, ale nie podoba mi się to rozwiązanie, ponieważ zgłaszający wyjątek imho jest lepszym rozwiązaniem, które pomaga również w kodzie internetowym.

Aktualizacja Właśnie znalazłem to powiązane pytanie: exception_notification for delayed_job, ale obie odpowiedzi używają podobnej sztuczki.

zamierzam spróbować z usług online, takich jak airbrake (dawniej znany jako hoptoad) lub nadzwyczajne, ale obaj są płatne usługi ...

Aktualizacja 2: Próbowałem Airbrake App, bardzo fajna aplikacja, ale cierpi na ten sam problem, nadal potrzebuję zhakować plik Rake, aby powiadomić o wyjątkach od zadań rake. Jednak hack jest mniej suchy, ponieważ potrzebujesz tylko tego kodu:

# notify exceptions 
def exception_notify 
    yield 
rescue Exception => exception 
    HoptoadNotifier.notify exception 
    raise exception 
end 

Nie trzeba powtarzać żadnego parametru konfiguracyjnego. Myślę, że nie mogę zrobić nic lepszego, niż powiadomić o wyjątkach w zadaniach rake.

Odpowiedz

5

Airbrake gem patches Rake celu umożliwienia ratowania, więc to już robi co pytam ...

+0

Aby włączyć rejestrowanie błędów rake, musisz dodać wiersz '' 'config.rescue_rake_exceptions = true''''' 'conifg/initializers/airbrake.rb'''. – KurtPreston

1

Dzięki za tę sugestię; działa to dla mnie świetnie, ponieważ mam tylko jedno zadanie cron w tej chwili.

wysuszyć go, można włączyć konfigurację na stałe, być może poprzez APP_CONFIG: https://github.com/cjbottaro/app_config

Ponadto można przedłużyć niezależnie od klasy zajmuje task :... do zawinąć wszystko w exception_notify { }.

+1

Jestem zainteresowany ostatnio nutą, można rozszerzyć trochę? – Fabio

+0

Musisz się zastanowić, jak działają zadania rake, głębiej w ramach Rails. Nie znam też szczegółów. Ale możesz rozszerzyć tych, którzy są klasyfikowani, aby robić, co chcesz. –

13

Utwórz plik task.rb w config/inicjalizatorów, które łatki małpa Rake :: Task # wykonać aby zaliczyć funkcjonalność exception_notify:

module Rake 
    class Task 
    alias :orig_execute :execute 
    def execute(args=nil) 
     orig_execute(args) 
    rescue Exception => exception 
     # Exception notification stuff 
    end 
    end 
end 

Testowane przy użyciu Rails 3.0.12, Rake 0.9.2.2.

+1

Pamiętaj, że musisz wymagać "rake/task", albo konsola Railsów nie będzie już działać z powodu NameError. –

Powiązane problemy