I have a simple rails application with a few controller and some rake tasks. A couple of tasks are executed by cron configured with whenever gem.
One of my task is executed daily and sometime it raises an exception and by default I receive this warning by cron
rake aborted!
undefined method `parameterize' for nil:NilClass
Tasks: TOP => mailboxes:clean_processed
(See full trace by running task with --trace)
I want to debug what's happening and for this reason I've just installed this exception notification gem with this line in my Gemfile
gem "exception_notification", "~> 2.4.1", :require => 'exception_notifier'
and configured it in my application.rb
file with
# enable exception notification
config.middleware.use ExceptionNotifier,
:email_prefix => "[MyAppName] ",
:sender_address => %{"notifier" <[email protected]>},
:exception_recipients => %w{[email protected]}
Since this gem is a rack middleware it only works for web requests and not for rake tasks. I'd like to enable it also for rake tasks and I found this gist which do the job.
It works, however it's not DRY, I need to repeat gem configuration in that method and I also need to change all my rake tasks to enclose their statements in a block as in
exception_notify { actual_task_code }
Is there any better way to solve this?
P.S. If I need to change the notification gem would not be a problem because I added only a few lines of code to my project.
P.P.S. I know that I can also change the rake line in the crontab to add a --trace
option, but I don't like that solution, cause exception notifier imho is a better solution which helps also in web code.
Update I just found out this related question: exception_notification for delayed_job but both the answers use a similar trick.
I'm going to try with an online service like Airbrake (formerly known as hoptoad) or Exceptional, but both of them are paid services...
Update 2: I tried the Airbrake App, very nice application, but it suffer for the same problem, I still need to hack the Rakefile to notify exceptions from rake tasks. However the hack is less dry because you just need this code:
# notify exceptions
def exception_notify
yield
rescue Exception => exception
HoptoadNotifier.notify exception
raise exception
end
There is no need to repeat any configuration parameter. I think I can't do better than this to get notified of exceptions in rake tasks.
config.rescue_rake_exceptions = true
toconifg/initializers/airbrake.rb
. – Odds