diff --git a/plugins/other/thin_threads b/plugins/other/thin_threads new file mode 100755 index 00000000..216ebd5d --- /dev/null +++ b/plugins/other/thin_threads @@ -0,0 +1,109 @@ +#!/usr/bin/env ruby +# thin_threads - +# A munin plugin for Linux to monitor how many threads per thin process +# +# For Linux ONLY ! +# DOES NOT WORK on OSX, Solaris or BSD. +# only linux, because this script relies on proc filesystem +# +# 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 ThinThreads + + def run + pids = get_pids() + port_list = Hash.new + pids.sort.each do |pid, port| + res = (get_threads(pid).to_i) + puts "thin_#{port}.value #{res}" + end + end + + # only get threads count for each pid + # Using Proc filesystem + # ONLY LINUX! because relies on proc filesystem + # TODO: make this work on OSX and Solaris, + # so the whole unix gang is happy ;) + def get_threads(pid) + res = `grep "Threads" /proc/#{pid}/status`.split[1] + if res.match("cannot access") + return nil + else + return res + end + end + + + # Get pis using lsof (list open files) + # look for listening tcp applications + # that match the name thin + def get_pids + pids_ports = [] + pids = `pgrep thin`.split + pids.each do |t| + 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::ThinThreads.new + +case ARGV[0] +when "config" + puts "graph_title Thin Threads" + puts "graph_vlabel Threads" + puts "graph_category Thin" + puts "graph_args -l 0" + puts "graph_scale yes" + puts "graph_info Tracks how many threads per thin processes" + mpm.get_pids.sort.each do |pid,port| + puts "thin_#{port}.label thin_#{port}" + puts "thin_#{port}.info Threads per Thin process" + 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