Created
May 22, 2011 02:21
-
-
Save LeZuse/985113 to your computer and use it in GitHub Desktop.
Munin plugin script for ejabberd2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# Munin plugin for ejabberd2. | |
# This script supports versions 2.0 and 2.1 of ejabberd. | |
# | |
# Written by Lasse Karstensen <[email protected]> 2007-05-27. | |
# Based on ejabberd-plugin by Christian Dröge <[email protected]> | |
# | |
# Status, memory, threads, ejabberd2 and other code optimalisation | |
# by Peter Viskup <[email protected]> | |
# | |
# 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. | |
# | |
# Hint: ejabberd plugin mod_admin_extra is required for some information for this script | |
# | |
# 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment