diff --git a/plugins/other/thin_memory b/plugins/other/thin_memory new file mode 100755 index 00000000..725ef4c5 --- /dev/null +++ b/plugins/other/thin_memory @@ -0,0 +1,101 @@ +#!/usr/bin/env ruby +# thin_memory - A munin plugin for Linux to monitor memory size of +# each individual thin process +# I havent tested on OSX or Solaris. Works great on Linux (gentoo) +# Author: +# Frederico de Souza Araujo - fred.the.master@gmail.com +# http://www.frederico-araujo.com +# +# Based on: +# thin_process_memory - +# A munin plugin to monitor memory size of +# each individual thin process +# by Ben VandenBos and Avvo, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# +#%# family=auto +#%# capabilities=autoconf + +module Munin + class ThinProcessMemory + + # run main method + def run + pids = get_pids() + port_list = Hash.new + pids.sort.each do |pid, port| + rss = (pid_rss(pid).to_i)/1024 + puts "thin_#{port}.value #{rss}" + end + end + + # only get the memory for each pid + def pid_rss(pid) + res = `grep "VmRSS" /proc/#{pid}/status`.split[1] + if res.match("cannot access") + return nil + else + return res + end + end + + # fetch all pids that match thin + def get_pids + pids_ports = [] + pids = `pgrep thin`.split + pids.each do |t| + # only works for linux i'm affraid + # using lsof (list open files) + port = `lsof -p #{t} | grep LISTEN`.split[8] + port = port.split(":")[1] + pids_ports << [t,port] + end + pids_ports + end + + def autoconf + get_pids().length > 0 + end + + end +end + +mpm = Munin::ThinProcessMemory.new + +case ARGV[0] +when "config" + puts "graph_title Thin Memory" + puts "graph_vlabel RSS" + puts "graph_category Thin" + puts "graph_args --base 1024 -l 0" + puts "graph_scale yes" + puts "graph_info Tracks the size of individual thin processes" + mpm.get_pids.sort.each do |pid,port| + puts "thin_#{port}.label thin_#{port}" + puts "thin_#{port}.info Process memory" + puts "thin_#{port}.type GAUGE" + puts "thin_#{port}.min 0" + end +when "autoconf" + if mpm.autoconf + puts "yes" + exit 0 + end + puts "no" + exit 1 +else + mpm.run +end