Death, Doom and Daemons!
2008-02-25
We’re actually starting to run the new FiveRuns service daemons internally and found that they were dying due to various issues so I integrated a little bit of ActionMailer code to email the dev team when a daemon dies with the relevant details. Below is what I did – do you have any tips for monitoring Ruby daemon processes?
First we need to create an ActionMailer which will send email:
class DemiseMailer < ActionMailer::Base
def condolences(name, err)
require 'socket'
recipients Array('Development <nosuchemail@example.com>')
from 'DemiseMailer <nosuchemail@example.com>'
subject "#{name} died on #{Socket.gethostname}"
body({ :name => name, :error => err })
end
end
and call the mailer when the daemon dies:
begin
loader = Loader::Engine.new
loader.load(true)
rescue => e
DemiseMailer.deliver_condolences('loader', e) if RAILS_ENV == 'production'
raise e
end
Now we put the email template in demise_mailer/condolences.erb:
I regret to inform you that your daemon, <%= @name %>, passed away at <%= Time.now %>
while running on <%= Socket.gethostname %>.
Its last words were:
<%= @error.to_s %>
<%= @error.backtrace.join("nt") %>
My condolences on your loss.
Sincerely,
DemiseMailer
and finally configure ActionMailer to send SMTP email:
ActionMailer::Base.template_root = File.expand_path(File.dirname(__FILE__))
ActionMailer::Base.smtp_settings = {
:address => 'email.example.com',
:domain => 'example.com',
:port => 587
}
ActionMailer::Base.raise_delivery_errors = true
Seems to work pretty well so far. Drop me a comment if you use it or have suggestions to improve it!