#!/usr/bin/perl -w # # Copyright (C) 2007 Guillaume Blairon # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; version 2 dated June, # 1991. # # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # # # Script to monitor MogileFS tracker activity. # Mostly an adaptation of Jimmy Olsen's squid_cache script. # # Usage: # ln -s /usr/share/munin/plugins/mogilefsd_activity \ # /etc/munin/plugins/ # # Configuration variables: # # host (default: '127.0.0.1') # port (default: '6001') # # Parameters: # # config (required) # autoconf (optional - only used by munin-config) # #%# family=auto #%# capabilities=autoconf my $ret = undef; my $DEBUG = 0; my @known_states=qw(pending_queries processing_queries bored_queryworkers); if (! eval "require IO::Socket;") { $ret = "IO::Socket not found"; } $mogilefsd_host = $ENV{host} || "127.0.0.1"; $mogilefsd_port = $ENV{port} || 6001; if($ARGV[0] and $ARGV[0] eq "autoconf") { &autoconf($mogilefsd_host, $mogilefsd_port); } sub autoconf { my ($host, $port) = @_; if ($ret) { print "no ($ret)\n"; exit 0; } my $conn = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Timeout => 5) or die($!); if (!$conn) { print "no (could not connect: $!)\n"; exit 0; } my $request = "!stats\n"; $conn->syswrite($request, length($request)); my @lines = qw(); while (my $line = $conn->getline) { if ($line =~ /^\./) { last; } push(@lines, $line); } close($conn); print "yes\n"; exit 0; } sub query_mogilefsd { my ($host, $port) = @_; my $conn = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp') or die($!); my $request = "!stats\n"; $conn->syswrite("$request", length("$request")); my @lines = qw(); while (my $line = $conn->getline) { if ($line =~ /^\./) { last; } push(@lines, $line); } close($conn); for(my $i = 0; $i <= $#lines; $i++) { if($lines[$i] =~ /^([^\s]*)\s(\d+)/) { $states{"$1"} = "$2"; } } keys %states; } if($ARGV[0] and $ARGV[0] eq "config") { print "graph_title MogileFS tracker activity\n"; print "graph_vlabel processes\n"; print "graph_args -l 0\n"; print "graph_category fs\n"; print "bored_queryworkers.label bored_queryworkers\n"; print "bored_queryworkers.draw AREA\n"; print "processing_queries.label processing_queries\n"; print "processing_queries.draw STACK\n"; print "pending_queries.label pending_queries\n"; print "pending_queries.draw STACK\n"; exit 0; } print %states; &query_mogilefsd($mogilefsd_host, $mogilefsd_port); foreach $key (@known_states) { print "$key.value "; if (exists $states{$key}) { print $states{$key}, "\n"; } else { print "0\n"; } }