Skip to content

Instantly share code, notes, and snippets.

@rbranson
Created October 29, 2010 02:43
Show Gist options
  • Save rbranson/652783 to your computer and use it in GitHub Desktop.
Save rbranson/652783 to your computer and use it in GitHub Desktop.
A hack of a delayed_job monitoring script for Munin
#!/usr/bin/env ruby
if ARGV[0] == "autoconf"
puts "yes"
exit
end
if ARGV[0] == "config"
puts <<EOT
graph_title delayed_jobs
graph_vlabel jobs
graph_category delayed_job
graph_info jobs completed
graph_args --base 1000 -l 0
EOT
end
require "time"
$dj_logs = {
:rails_app_name => "/path/to/app/log/delayed_job.log"
}
$now = Time.now
$dj_logs.each do |log_name, log_path|
File.open(log_path) do |f|
jobs = {}
while line = f.gets do
if m = line.match(/^(\S+): \[.*?\] (\S+) (completed|failed) (.*?)$/)
ts, job_name, status, rest = m.captures
jobs[job_name] ||= {}
jobs[job_name]["completed"] ||= 0
jobs[job_name]["failed"] ||= 0
jobs[job_name][:duration] ||= 0
if ($now - Time.parse(ts)) < 300
jobs[job_name][status] += 1
if status == "completed"
jobs[job_name][:duration] += rest.scan(/after (\S+)/).first.first.to_f
end
end
end
end
jobs.each do |job_name, job_data|
lnjn = "#{log_name.to_s}_#{job_name}"
if ARGV[0] == "config"
puts "#{lnjn}_completed.label #{log_name.to_s}:#{job_name} completed"
puts "#{lnjn}_completed.type GAUGE"
puts "#{lnjn}_completed.draw LINE1"
puts "#{lnjn}_completed.min 0"
puts "#{lnjn}_failed.label #{log_name.to_s}:#{job_name} failed"
puts "#{lnjn}_failed.type GAUGE"
puts "#{lnjn}_failed.draw LINE1"
puts "#{lnjn}_failed.min 0"
else
puts "#{lnjn}_completed.value #{job_data['completed']}"
puts "#{lnjn}_failed.value #{job_data['failed']}"
if job_data[:duration] > 0 and job_data["completed"] > 0
puts "#{lnjn}_duration.value #{job_data['completed'].to_f / job_data[:duration]}"
else
puts "#{lnjn}_duration.value 0"
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment