2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/other/zeo_monitor_
2011-12-18 15:10:25 +01:00

249 lines
5.2 KiB
Perl
Executable File

#!/usr/bin/perl -Tw
# Plugin to monitor ZEO load, connected clients and errors/conflicts
#
# Author: Terry Burton <tez@terryburton.co.uk>
#
# Revisions:
#
# 1.0 2010/07/08 First version
#
#
# Invoke using symlinks to zeo_monitor_ in the form zeo_monitor_{load,clients,errors}_<storage_name>
#
# Can be configured manually or by autoconf, for example:
#
# root@munin:~ munin-node-configure --shell
# ln -s /usr/share/munin/plugins/zeo_monitor_ /etc/munin/plugins/zeo_monitor_clients_1
# ln -s /usr/share/munin/plugins/zeo_monitor_ /etc/munin/plugins/zeo_monitor_clients_temp
# ln -s /usr/share/munin/plugins/zeo_monitor_ /etc/munin/plugins/zeo_monitor_errors_1
# ln -s /usr/share/munin/plugins/zeo_monitor_ /etc/munin/plugins/zeo_monitor_errors_temp
# ln -s /usr/share/munin/plugins/zeo_monitor_ /etc/munin/plugins/zeo_monitor_load_1
# ln -s /usr/share/munin/plugins/zeo_monitor_ /etc/munin/plugins/zeo_monitor_load_temp
#
#
# Configuration variables:
#
# zeomonitorsock - path to the zeo monitor server socket (default /var/run/zeo/zeo-monitor.sock)
#
# Parameters:
#
# config
# autoconf
# suggest
#
# Configuration example:
#
# [zeo_monitor_*]
# user root
# env.zeomonitorsock /var/run/zeo/zeo-monitor.sock
#
# Magic markers (optional - used by munin-config and installation
# scripts):
#
#%# family=auto
#%# capabilities=autoconf suggest
use strict;
use Munin::Plugin;
use File::Basename;
use IO::Socket::UNIX qw(SOCK_STREAM);
my $zeomonitorsock = exists $ENV{'zeomonitorsock'} ? $ENV{'zeomonitorsock'} : '/var/run/zeo/zeo-monitor.sock';
($zeomonitorsock)=$zeomonitorsock=~/(.*)/;
if (basename($0) !~ /^zeo_monitor_/) {
die qq(Please ensure that the name of the script and it's symlinks starts with "zeo_monitor_"\n);
}
############
# autoconf #
############
if (defined $ARGV[0] && $ARGV[0] eq 'autoconf') {
# Capture any croaks on the way
eval { parse_zeo_monitor(); };
if ( !$@ ) {
print "yes\n";
exit 0;
}
chomp $@;
print "no ($@)\n";
exit 0;
}
###########
# suggest #
###########
if (defined $ARGV[0] and $ARGV[0] eq 'suggest') {
my @storage_names;
eval { @storage_names=parse_zeo_monitor(); };
if ( $@ ) {
chomp $@;
print "no ($@)\n";
exit 1;
}
print "clients_$_\nload_$_\nerrors_$_\n" foreach @storage_names;
exit 0;
}
# From now on we require the mode and storage name to be given
(my $mode,my $storage_name)=$0=~/zeo_monitor_(.+)_(.+)$/;
die qq(Symlink to this script by appending a mode and storage name such as "zeo_monitor_load_temp"\n) unless defined $storage_name;
##########
# config #
##########
if ( $ARGV[0] and $ARGV[0] eq "config") {
print <<"EOF";
graph_title ZEO $mode for storage $storage_name
graph_args --base 1000 --lower-limit 0
graph_vlabel events per \${graph_period}
graph_category zeo
graph_info ZEO performance monitoring
EOF
if ($mode eq 'clients') {
print <<EOF;
clients.label Clients
clients.type GAUGE
EOF
}
if ($mode eq 'load') {
print <<EOF;
commits.label Commits (x1000)
commits.type DERIVE
commits.min 0
commits.cdef commits,1000,*
loads.label Loads
loads.type DERIVE
loads.min 0
stores.label Stores (x10)
stores.type DERIVE
stores.min 0
stores.cdef stores,10,*
EOF
}
if ($mode eq 'errors') {
print <<EOF;
aborts.label Aborts (x10)
aborts.type DERIVE
aborts.min 0
aborts.cdef aborts,10,*
conflicts.label Conflicts (x10)
conflicts.type DERIVE
conflicts.min 0
conflicts.cdef conflicts,10,*
conflictsres.label Conflicts Resolved
conflictsres.type DERIVE
conflictsres.min 0
EOF
}
exit 0;
}
########
# main #
########
my %stats=parse_zeo_monitor($storage_name);
if ($mode eq 'clients') {
print <<"EOF";
clients.value $stats{clients}
EOF
}
if ($mode eq 'load') {
print <<"EOF";
commits.value $stats{commits}
loads.value $stats{loads}
stores.value $stats{stores}
EOF
}
if ($mode eq 'errors') {
print <<"EOF";
aborts.value $stats{aborts}
conflicts.value $stats{conflicts}
conflictsres.value $stats{conflictsres}
EOF
}
exit 0;
####
# Read the zeo-monitor socket and parse the result. If a storage name is given
# then return the stats for it. Otherwise return a list of available storage
# names.
sub parse_zeo_monitor {
my $storage_name=shift;
my $socket=IO::Socket::UNIX->new(Type => SOCK_STREAM,Peer => $zeomonitorsock ) or die("Can't connect to socket: $!\n");
my $response=join('',<$socket>);
close $socket;
# If no storage name is given then return list of all storage names
if (!defined $storage_name) {
return map {/: (.*)/} (grep /^Storage: /, split(/\n/,$response));
}
# Otherwise, read the stats for the given storage name
(my $stats)=$response=~/
(
Storage:\ $storage_name\n
.*?
\n
)
\n
/sx;
my %name_var=(
'Clients' => 'clients',
'Commits' => 'commits',
'Aborts' => 'aborts',
'Loads' => 'loads',
'Stores' => 'stores',
'Conflicts' => 'conflicts',
'Conflicts resolved' => 'conflictsres',
);
my %stats=();
foreach (split /\n/, $stats) {
(my $name,my $value)=split ': ',$_,2;
my $var=$name_var{$name};
next unless $var;
$stats{$var}=$value;
}
return %stats;
}