Rails exception notifier in rake tasks
Asked Answered
U

4

16

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.

Ulm answered 23/8, 2011 at 12:58 Comment(0)
U
5

Airbrake gem patches Rake to allow rescuing, so it already does what I'm asking...

Ulm answered 15/5, 2012 at 17:46 Comment(1)
To enable logging of Rake errors, you'll need to add the line config.rescue_rake_exceptions = true to conifg/initializers/airbrake.rb.Odds
A
15

Create a task.rb file in config/initializers, which monkey patches Rake::Task#execute to include the functionality of 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

Tested with Rails 3.0.12, Rake 0.9.2.2.

Advocation answered 29/5, 2012 at 21:19 Comment(1)
Please note that you need to require "rake/task", or Rails' console will no longer run due to a NameError.Unroof
W
7

there is new easier solution: gem https://github.com/nikhaldi/exception_notification-rake

Washing answered 23/2, 2013 at 21:31 Comment(0)
U
5

Airbrake gem patches Rake to allow rescuing, so it already does what I'm asking...

Ulm answered 15/5, 2012 at 17:46 Comment(1)
To enable logging of Rake errors, you'll need to add the line config.rescue_rake_exceptions = true to conifg/initializers/airbrake.rb.Odds
D
1

Thanks for this suggestion; it works great for me since I only have one cron task at the moment.

To DRY it up, you could turn the configuration into constants, perhaps via APP_CONFIG: https://github.com/cjbottaro/app_config

In addition, you could extend whatever class takes care of task :... do to wrap everything in exception_notify { }.

Disesteem answered 8/10, 2011 at 11:18 Comment(2)
I'm interested in you last hint, could you expand a little bit?Ulm
You'de have to dig into how rake tasks work, deeper into the Rails framework. I don't know the details either. But you could extend those classed to do whatever you like.Disesteem

© 2022 - 2024 — McMap. All rights reserved.