From 48d91acaf92bfe35c7fbd0a11754933b4ada734a Mon Sep 17 00:00:00 2001 From: Shinji Furuya Date: Wed, 6 Oct 2010 12:43:53 +0200 Subject: [PATCH] Initial version --- plugins/other/unicorn_status | 79 ++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 plugins/other/unicorn_status diff --git a/plugins/other/unicorn_status b/plugins/other/unicorn_status new file mode 100755 index 00000000..5c99e0a5 --- /dev/null +++ b/plugins/other/unicorn_status @@ -0,0 +1,79 @@ +#!/usr/bin/env ruby +# +# unicorn_status - A munin plugin for Linux to monitor unicorn processes +# +# Copyright (C) 2010 Shinji Furuya - shinji.furuya@gmail.com +# Licensed under the MIT license: +# http://www.opensource.org/licenses/mit-license.php +# + +# set path to your rails app +RAILS_ROOT = "/path/to/rails/app" + +module Munin + class UnicornStatus + attr_reader :pid_file + + def initialize(rails_root) + @pid_file = "#{rails_root}/tmp/pids/unicorn.pid" + end + + def master_pid + File.read(pid_file).to_i + end + + def worker_pids + result = [] + ps_output = `ps w --ppid #{master_pid}` + ps_output.split("\n").each do |line| + chunks = line.strip.split(/\s+/, 5) + pid, pcmd = chunks[0], chunks[4] + next if pid !~ /\A\d+\z/ or pcmd !~ /worker/ + result << pid.to_i + end + result + end + + def worker_count + worker_pids.size + end + + def idle_worker_count + result = 0 + before_cpu = {} + worker_pids.each do |pid| + before_cpu[pid] = cpu_time(pid) + end + sleep 1 + after_cpu = {} + worker_pids.each do |pid| + after_cpu[pid] = cpu_time(pid) + end + worker_pids.each do |pid| + result += 1 if after_cpu[pid] - before_cpu[pid] == 0 + end + result + end + + def cpu_time(pid) + usr, sys = `cat /proc/#{pid}/stat | awk '{print $14,$15 }'`.strip.split(/\s+/).collect { |i| i.to_i } + usr + sys + end + end +end + +case ARGV[0] +when "autoconf" + puts "yes" +when "config" + puts "graph_title Unicorn - Status" + puts "graph_args -l 0" + puts "graph_vlabel number of workers" + puts "graph_category Unicorn" + puts "total_worker.label total_workers" + puts "idle_worker.label idle_workers" +else + m = Munin::UnicornStatus.new(RAILS_ROOT) + puts "total_worker.value #{m.worker_count}" + puts "idle_worker.value #{m.idle_worker_count}" +end