Merb exception email notifier

1. Handle internal_server_error in your exceptions controller. Deliver email before render.

In app/controllers/exceptions.rb:

class Exceptions < Merb::Controller
 
  ...
 
  cattr_accessor :email_addresses
 
  def internal_server_error
    @exception = self.params[:exception]
    @exception_name = @exception.name.split("_").map {|x| x.capitalize}.join(" ")
    notify_emails if Merb.env?(:production)
    render
  end
 
private
 
  def notify_emails
    begin      
      return if self.class.email_addresses.blank?
 
      subject = "[#{@exception.class::STATUS}] #{@exception_name}: #{@exception.message}"
      mail_body = render(:template => "exceptions/error_email.txt")
 
      email = Merb::Mailer.new({ 
        :to => self.class.email_addresses.join(", "), 
        :from => "MyApp", 
        :subject => subject, 
        :text => mail_body })
 
      email.deliver!
 
    rescue Error => e
      Merb.logger.error("Error sending error email: #{e}")
    end
  end
 
 
end

2. Define your email template.

In app/views/exceptions/error_email.txt.rb:

<%= @exception_name %> (<%= @exception.class::STATUS %>): <%= @exception.message %>
 
URL: <%= "#{request.protocol}#{request.env["HTTP_HOST"]}#{request.uri}" %>
Parameters: <%= params[:original_params].inspect %>
 
<% @exception.backtrace.each_with_index do |line, index| %>
  <%= (line.match(/^([^:]+)/)[1] rescue 'unknown').sub(/\/((opt|usr)\/local\/lib\/(ruby\/)?(gems\/)?(1.8\/)?(gems\/)?|.+\/app\/)/, '') %>:<%=line%>
<% end %>

3. Configure the mailer. This example uses sendmail.

In config/init.rb:

dependency "merb-mailer"
 
Merb::BootLoader.after_app_loads do
 
  ...
 
  # Mailer configuration
  Merb::Mailer.config = {:sendmail_path => "/usr/sbin/sendmail"}
  Merb::Mailer.delivery_method = :sendmail
  Exceptions.email_addresses = ["my@email.com"]
end

If you need something more complex, there is a merb_exceptions plugin from newbamboo.

Tags: , , ,

3 Responses to “Merb exception email notifier”

  1. atmos Says:

    Be VERY careful when you’re writing these. If your templates have syntax errors you won’t get your mails(or an exception telling you about it), and it’s a royal pain in the ass to track down.

    I want those few hours back.

  2. Peter Says:

    Hi, very useful this, can we port it to a Merb Slice?

  3. Sherly Says:

    A large percentage of of the things you articulate happens to be astonishingly precise and that makes me ponder the reason why I hadn’t looked at this in this light before. Your piece truly did switch the light on for me as far as this subject matter goes. But at this time there is actually 1 position I am not too comfortable with so whilst I make an effort to reconcile that with the actual main idea of your issue, allow me observe what the rest of the subscribers have to point out.Very well done.