Commit b55129ef authored by Vincent Le gallic's avatar Vincent Le gallic

[munin/*] Plein de plugins munin qui n'étaient pas trackés

parent fcc2fef9
#!/bin/sh
# Petit plugin histoire de mesurer la dérive temporelle (spécialement des domU)
output_config() {
echo "graph_title Suivi du temps"
echo "graph_category time"
echo "local_date.label Date courante"
echo "local_date.type DERIVE"
}
output_values() {
printf "local_date.value %d\n" $(cur_timestamp)
}
cur_timestamp() {
date +%s
}
output_usage() {
printf >&2 "%s - munin plugin to graph an example value\n" ${0##*/}
printf >&2 "Usage: %s [config]\n" ${0##*/}
}
case $# in
0)
output_values
;;
1)
case $1 in
config)
output_config
;;
*)
output_usage
exit 1
;;
esac
;;
*)
output_usage
exit 1
;;
esac
#!/bin/bash
#
# Munin plugin for ejabberd2.
# This script supports versions 2.0 and 2.1 of ejabberd.
#
# Written by Lasse Karstensen <lkarsten@hyse.org> 2007-05-27.
# Based on ejabberd-plugin by Christian Dröge <Christian@draugr.de>
#
# Status, memory, threads, ejabberd2 and other code optimalisation
# by Peter Viskup <skupko.sk@gmail.com>
#
# As connected users, registered users and server-connections have somewhat
# different scales, this plugin uses munins suggest feature to create three
# different graphs.
#
# ejabberd_connections
# ejabberd_users
# ejabberd_registrations
# ejabberd_statuses
# ejabberd_memory
# ejabberd_threads
# ejabberd_usersindays
# ejabberd_uptime
#
# use ln -s ejabberd ejabberd_(connections|users|registrations|statuses|memory|threads|usersindays|uptime)
# to activate.
#
# If the autodetect-feature for vhosts breaks, you can set
# """
# [ejabberd*]
# env.vhosts foo.com bar.com
# env.statuses available away chat xa # monitoring of statuses
# env.days 1 7 30 # monitoring for usersindays
# user ejabberd # user ejabberd should have enough priviledges
# # depends on your setup
# """
# in plugin-conf.d/munin-node to override it.
#
#%# family=auto
#%# capabilities=autoconf suggest
EJCTL=$(which ejabberdctl)
EJVER=$($EJCTL status | awk '/^ejabberd / {print $2}')
if [ "$1" == "autoconf" ]; then
if [ -x $EJCTL > /dev/null ]; then
echo yes
exit 0
fi
echo "no (ejabberdctl not found)"
exit 1
fi
if [ "$1" == "suggest" ]; then
echo "connections"
echo "users"
echo "registrations"
echo "statuses"
echo "memory"
echo "threads"
echo "usersindays"
echo "uptime"
exit 0
fi
# Add munin argument to ejabberdctl to prevent a lot of ejabberdctl
# records in memory see discussion:
# http://lists.jabber.ru/pipermail/ejabberd/2009-September/005337.html
# Add these lines to ejabberdctl script to get it work
#@@ -56,6 +56,15 @@
# $KERNEL_OPTS \
# "$@"
# ;;
#+ munin)
#+ shift
#+ exec $ERL $SNAME ejabberdctlmunin \
#+ -pa $EBIN_DIR \
#+ -s ejabberd_ctl \
#+ -noinput \
#+ $KERNEL_OPTS \
#+ -extra $ERLANG_NODE "$@"
#+ ;;
# *)
# exec $ERL $SNAME ejabberdctl$SUFFIX \
# -pa $EBIN_DIR \
#
# Or just comment out following line
EJCTL="$EJCTL munin"
# trying to autodetect running vhosts.
if [ -z "$vhosts" ]; then
for CFGPATH in /etc/ejabberd /usr/local/ejabberd/etc; do
if [ -f "$CFGPATH/ejabberd.cfg" ]; then
EJCFG=$CFGPATH/ejabberd.cfg
fi
done
if [ -z "$EJCFG" ]; then
echo "Unable to find ejabberd.cfg. Exiting." > /dev/stderr
exit -1
fi
# you have to have all of vhosts defined on one line in $EJCFG or in plugins-conf.d/munin-node config file
vhosts=$(awk '/^\s*{hosts/ {gsub( /\{\s?hosts\s?,|[\",\[\]]|\}\s?.|localhost/ ,""); print;}' $EJCFG)
fi
# get ejabberd PID
if [[ ${EJVER%\.[0-9]} == 2.1 ]]; then
EJPID=$(cat /var/run/ejabberd/ejabberd.pid)
else
EJPID=$(ps -ef | awk '/\/bin\/beam.smp/ && !/awk/ {print $2}')
fi
if [ -z "$vhosts" ]; then
echo "No vhosts to sample." > /dev/stderr
echo "Please set env.vhosts in plugins-conf.d/munin-node." > /dev/stderr
exit -1
fi
MODE=$(basename $0 | sed 's/^ejabberd_//g')
if ! [ "$MODE" == "connections" -o "$MODE" == "users" \
-o "$MODE" == "registrations" -o "$MODE" == "statuses" \
-o "$MODE" == "memory" -o "$MODE" == "threads" \
-o "$MODE" == "usersindays" -o "$MODE" == "uptime" ]; then
echo "ERROR: Unknown mode \"$MODE\". Exiting." > /dev/stderr
exit -1
fi
if [ "$1" = "config" ]; then
echo 'graph_category ejabberd'
echo 'graph_info This graph shows statistics of ejabberd server'
if [ "$MODE" == "memory" ]; then
echo 'graph_args --base 1024 -l 0'
echo 'graph_scale yes'
echo 'graph_title Memory usage'
echo 'graph_vlabel Bytes'
echo "ejabberd_memory_size.label actual memory"
echo "ejabberd_memory_size.info Memory used by ejabberd process in Bytes"
echo "ejabberd_memory_peak.label memory peak"
echo "ejabberd_memory_peak.info Memory peak of ejabberd process in Bytes"
else
echo 'graph_args --base 1000 -l 0'
echo 'graph_scale no'
if [ "$MODE" == "connections" ]; then
echo 'graph_title Server-to-server conections'
echo 'graph_vlabel connections'
echo 's2s_connections_out.label outgoing s2s connections'
echo 's2s_connections_out.info Number of outgoing server to server connections'
echo 's2s_connections_in.label incoming s2s connections'
echo 's2s_connections_in.info Number of incoming server to server connections'
elif [ "$MODE" == "users" ]; then
echo 'graph_title Connected users'
echo 'graph_vlabel users'
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
echo "connected_users_$formathost.label $host connected users"
echo "connected_unique_users_$formathost.label $host unique connected users"
done
elif [ "$MODE" == "registrations" ]; then
echo 'graph_title User registrations'
echo 'graph_vlabel users'
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
echo "registered_$formathost.label $host registered users"
echo "registered_$formathost.info Registered users for vhost $host"
done
elif [ "$MODE" == "statuses" ]; then
echo 'graph_title User statuses'
echo 'graph_vlabel users'
for host in $vhosts; do
for status in $statuses; do
formathost=$(echo $host | tr '.' '_')
echo "status_${formathost}_${status}.label $status on $host"
echo "status_${formathost}_${status}.info Users with status $status on $host [xa=not available, dnd=(do not disturb) or (busy), chat=free for chat]"
done
done
elif [ "$MODE" == "threads" ]; then
echo 'graph_title Threads'
echo 'graph_vlabel threads'
echo "ejabberd_threads.label number of threads"
echo "ejabberd_threads.info Number of threads of ejabberd process"
elif [ "$MODE" == "usersindays" ]; then
echo 'graph_title Active users'
echo 'graph_vlabel users'
for host in $vhosts; do
for num in $days; do
formathost=$(echo $host | tr '.' '_')
echo "usersindays_${formathost}_${num}.label $host active users [$num days]"
echo "usersindays_${formathost}_${num}.info Number of $host users active in last $num days"
done
done
elif [ "$MODE" == "uptime" ]; then
echo 'graph_title Uptime'
echo 'graph_vlabel days'
echo "uptime.label uptime"
echo 'uptime.draw AREA'
fi
fi
exit 0
fi
if [[ ${EJVER%\.[0-9]} == 2.1 ]]; then
if [ "$MODE" == "users" ]; then
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
echo "connected_users_$formathost.value $($EJCTL stats_host onlineusers $host)"
echo "connected_unique_users_$formathost.value $($EJCTL connected_users_vhost $host | awk -v var=$host -F/ '{users[$1]} END {for (user in users) {if (index(user,var)) {count++}} print count}')"
done
elif [ "$MODE" == "registrations" ]; then
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
num=$($EJCTL stats_host registeredusers $host)
if [ "$?" != 0 ]; then
num="U"
fi
echo "registered_$formathost.value $num"
done
elif [ "$MODE" == "statuses" ]; then
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
for status in $statuses; do
num=$($EJCTL status_num_host $host $status)
if [ "$?" != 0 ]; then
num="U"
fi
echo "status_${formathost}_${status}.value $num"
done
done
elif [ "$MODE" == "usersindays" ]; then
for host in $vhosts; do
for num in $days; do
formathost=$(echo $host | tr '.' '_')
echo "usersindays_${formathost}_${num}.value $($EJCTL num_active_users $host $num)"
done
done
elif [ "$MODE" == "uptime" ]; then
echo "uptime.value $($EJCTL stats uptimeseconds | awk '{printf "%.2f", $1/86400}')"
elif [ "$MODE" == "connections" ]; then
echo "s2s_connections_out.value $($EJCTL outgoing_s2s_number)"
echo "s2s_connections_in.value $($EJCTL incoming_s2s_number)"
fi
elif [[ ${EJVER%\.[0-9]} == 2.0 ]]; then
if [ "$MODE" == "users" ]; then
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
echo "connected_users_$formathost.value $($EJCTL vhost $host stats onlineusers)"
echo "connected_unique_users_$formathost.value $($EJCTL connected-users | awk -v var=$host -F/ '{users[$1]} END {for (user in users) {if (index(user,var)) {count++}} print count}')"
done
elif [ "$MODE" == "registrations" ]; then
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
num=$($EJCTL vhost $host stats registeredusers)
if [ "$?" != 0 ]; then
num="U"
fi
echo "registered_$formathost.value $num"
done
elif [ "$MODE" == "statuses" ]; then
for host in $vhosts; do
formathost=$(echo $host | tr '.' '_')
for status in $statuses; do
num=$($EJCTL vhost $host status-num $status)
if [ "$?" != 0 ]; then
num="U"
fi
echo "status_${formathost}_${status}.value $num"
done
done
elif [ "$MODE" == "usersindays" ]; then
for host in $vhosts; do
for num in $days; do
formathost=$(echo $host | tr '.' '_')
echo "usersindays_${formathost}_${num}.value $($EJCTL vhost $host num-active-users $num)"
done
done
elif [ "$MODE" == "uptime" ]; then
echo "uptime.value $($EJCTL stats uptime-seconds | awk '{printf "%.2f", $1/86400}')"
elif [ "$MODE" == "connections" ]; then
echo "s2s_connections_out.value $($EJCTL outgoing-s2s-number)"
echo "s2s_connections_in.value $($EJCTL incoming-s2s-number)"
fi
fi
if [ "$MODE" == "memory" ]; then
echo "ejabberd_memory_size.value $(awk '/VmSize/ {print $2*1024}' /proc/${EJPID}/status)"
echo "ejabberd_memory_peak.value $(awk '/VmPeak/ {print $2*1024}' /proc/${EJPID}/status)"
elif [ "$MODE" == "threads" ]; then
echo "ejabberd_threads.value $(awk '/Threads/ {print $2}' /proc/${EJPID}/status)"
fi
exit 0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
import serial
import sys
re_fmt = "^%s[^:]*: (.+)$"
h_re = re.compile(re_fmt % "Humidity")
t_re = re.compile(re_fmt % "Temperature")
exprs = {"H": h_re, "T": t_re}
conv = {"T": lambda x: x / 10.}
lines_to_read = 2
def read_data(ser):
data = {}
while data == {}:
ser.write("\n")
for i in xrange(lines_to_read):
line = ser.readline()
for k, expr in exprs.items():
m = expr.match(line)
if m is not None:
data[k] = float(m.group(1))
if k in conv:
data[k] = conv[k](data[k])
return data
def main_tty():
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.1)
while True:
data = read_data(ser)
print data
if raw_input("q to quit: ") == "q":
break
ser.close()
def main_munin():
mode = None
if len(sys.argv) > 1:
mode = sys.argv[1]
arg = sys.argv[0].rsplit("_", 1)[-1]
if arg not in ["hygro", "temp"]:
return 1
if mode == "config":
print "host_name mdr.crans.org"
print "graph_category Environnement"
if arg == "hygro":
print "graph_title Hygrométrie 4J"
print "graph_vlabel Humidité (%)"
print "graph_args --lower-limit 0 --upper-limit 100 --rigid"
print "hygro.label Humidité 4J"
elif arg == "temp":
print "graph_title Température 4J"
print "graph_vlabel Température (°C)"
print "temp.label Température 4J"
else:
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.1)
data = read_data(ser)
ser.close()
if arg == "hygro":
print "hygro.value %d" % data["H"]
elif arg == "temp":
print "temp.value %.1f" % data["T"]
return 0
if __name__ == '__main__':
if sys.argv[0].endswith(".py"):
try:
main_tty()
except KeyboardInterrupt:
print
else:
sts = main_munin()
sys.exit(sts)
#!/bin/sh
#
# Copyright (C) 2004 Jimmy Olsen
#
# 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.
#
#
# Plugin to monitor ping times
#
# Parameters:
#
# ping_args - Arguments to ping (default "-c 2")
# ping_args2 - Arguments after the host name (required for Solaris)
# ping - Ping program to use
# host - Host to ping
#
# Arguments for Solaris:
# ping_args -s
# ping_args2 56 2
#
#%# family=manual
hostname=`hostname --fqdn`
file_host=`basename $0 | sed 's/^ping_//g' | sed 's/_/-/g'`
host=${host:-${file_host:-www.google.com}}
if [ "$1" = "config" ]; then
echo host_name `basename $host | sed 's/-//g'`
echo graph_title Ping times from $hostname
echo 'graph_args --base 1000 -l 0'
echo 'graph_vlabel seconds'
echo 'graph_category network'
echo 'graph_info This graph shows ping RTT statistics.'
echo "ping.label $host"
echo "ping.info Ping RTT statistics for $host."
echo 'ping.draw LINE2'
echo 'packetloss.label packet loss'
# echo 'packetloss.graph no'
exit 0
fi
${ping:-ping} ${ping_args:-'-c 2'} ${host} ${ping_args2} | perl -n -e 'print "ping.value ", $1 / 1000, "\n" if m@min/avg/max.*\s\d+(?:\.\d+)?/(\d+(?:\.\d+)?)/\d+(?:\.\d+)?@; print "packetloss.value $1\n" if /(\d+)% packet loss/;'
#!/usr/bin/perl -w
# Copyright Bjorn Ruberg <bjorn@ruberg.no>
# Licenced under GPL v2
#
# TODO:
# - Check for OpenLDAP version
# We use one script for all monitoring.
# This script may be symlinked with several names, all
# performing different functions:
# slapd_statistics_bytes
# slapd_statistics_pdu
# slapd_statistics_other
# slapd_connections
# slapd_waiters
# slapd_operations
# slapd_operations_diff
# Magic markers
#%# family=auto
#%# capabilities=autoconf suggest
# use strict;
use Net::LDAP;
use Data::Dumper;
use vars qw ( $config $param $act $scope $descr $cn $vlabel
$info $title );
# Change these to reflect your LDAP ACL. The given DN must have
# read access to the Monitor branch.
my $basedn = "cn=Monitor";
my $server = "localhost";
my $userdn = ($ENV{'binddn'} || '');
my $userpw = ($ENV{'bindpw'} || '');
# Remember: bytes, pdu needs scope=base
# The possible measurements
my %ops =
('statistics_bytes'
=> {
'search' => "cn=Bytes,cn=Statistics",
'desc' => "The number of bytes sent by the LDAP server.",
'vlabel' => "Bytes",
'title' => "Number of bytes sent",
'info' => "The graph shows the number of bytes sent",
'scope' => "base"
},
'statistics_pdu'
=> {
'search' => "cn=PDU,cn=Statistics",
'desc' => "The number of PDUs sent by the LDAP server.",
'vlabel' => "PDUs",
'title' => "Number of PDUs sent",
'info' => "The graph shows the number of PDUs sent",
'scope' => "base"
},
# Referrals
'statistics_referrals'
=> {
'search' => "cn=Referrals,cn=Statistics",
'attrs' => "Referrals",
'desc' => "The number of Referrals sent by the LDAP server.",
'vlabel' => "Referrals",
'title' => "Number of LDAP Referrals",
'info' => "The graph shows the number of referrals sent",
'scope' => "base"
},
# Entries
'statistics_entries'
=> {
'search' => "cn=Entries,cn=Statistics",
'attrs' => "Entries",
'desc' => "The number of Entries sent by the LDAP server.",
'vlabel' => "Entries",
'title' => "Number of LDAP Entries",
'info' => "The graph shows the number of entries sent",
'scope' => "base"
},
# Only read Current and Total
'connections'
=> {
'search' => 'cn=Connections',
'filter' => '(|(cn=Current)(cn=Total))',
'desc' => 'The number of Connections',
'label' => {'current' => 'Current',
'total' => 'Total'},
'vlabel' => 'Connections',
'title' => 'Number of Connections',
'info' => 'Number of connections to the LDAP server'
},
# dn: cn=Write,cn=Waiters,cn=Monitor
# dn: cn=Read,cn=Waiters,cn=Monitor
'waiters'
=> {
'search' => 'cn=Waiters',
'filter' => '(|(cn=Write)(cn=Read))',
'desc' => "The number of Waiters|",
'label' => {'write' => 'Write',
'read' => 'Read'},
'vlabel' => "Waiters",
'title' => "Number of Waiters",
'info' => "The graph shows the number of Waiters"
},
'operations'
=> {
'search' => "cn=Operations",
'desc' => "Operations",
'vlabel' => "Operations",
'title' => "Operations",
'info' => "Number of completed LDAP operations"
},
'operations_diff'
=> {
'search' => "cn=Operations",
'desc' => "Operations deviance",
'vlabel' => "Deviance",
'title' => "Operations deviance",
'info' => "Deviance between Initiated and Completed ops"
}
);
# Config subroutine
sub config {
my $action = shift;
print <<EOF;
graph_args --base 1000 -l 0 --vertical-label $ops{$action}->{'vlabel'}
graph_title $ops{$action}->{'title'}
graph_category OpenLDAP
graph_info $ops{$action}->{'info'}
EOF
if ($ops{$action}->{'label'}) {
while (my ($key, $val) = each (%{$ops{$action}->{'label'}})) {
my $name = $action . "_" . $key;
print "$name.label $val\n";
print "$name.type DERIVE\n";
print "$name.min 0\n";
}
} elsif ($action =~ /^operations(?:_diff)?$/) {
my $ldap = Net::LDAP->new ($server) or die "$@";
$ldap->bind ($userdn, password => $userpw) or die "$@";
my $searchdn = $ops{$action}->{'search'} . "," . $basedn;
my $mesg =
$ldap->search (
base => $searchdn,
scope => 'one',
filter => '(objectclass=*)',
attrs => ['monitorOpInitiated',
'monitorOpCompleted',
'cn'],
);
$mesg->code && die $mesg->error;
my $max = $mesg->count;
for (my $i = 0 ; $i < $max ; $i++) {
my $entry = $mesg->entry ($i);
my $cn = $entry->get_value ('cn');
$name = $action . "_" . lc ($cn);
print "$name.label $cn\n";
print "$name.type DERIVE\n";
print "$name.min 0\n";
if ($action eq "operations") {
print "$name.info The number of $cn operations\n";
} else {
print "$name.info The difference between Initiated ";
print "and Completed operations (should be 0)\n";
print "$name.warning 1\n";
}