#!/bin/sh
#
# Munin plugin for named. This is a bit experimental, we will have to see
# which statistics prove to have any meaning to get a feel with what happens
# on the nameserver.
#
# Nicolai Langfeldt (janl@linpro.no) 27.8.2003
#
# Enviroment variables:
#
# logfile - set which log file to use
#
# $Log$
# Revision 1.4.2.1 2005/01/24 20:42:44 jimmyo
# generic/named probes for more log files before giving up.
#
# Revision 1.4 2004/12/10 10:47:47 jimmyo
# Change name from ${scale} to ${graph_period}, to be more consistent.
#
# Revision 1.3 2004/12/09 22:12:55 jimmyo
# Added "graph_period" option, to make "graph_sums" usable.
#
# Revision 1.2 2004/12/09 20:23:00 jimmyo
# generic/named a bit more portable (by Will Froning).
#
# Revision 1.1 2004/01/02 18:50:00 jimmyo
# Renamed occurrances of lrrd -> munin
#
# Revision 1.1.1.1 2004/01/02 15:18:07 jimmyo
# Import of LRRD CVS tree after renaming to Munin
#
# Revision 1.3 2003/11/26 15:57:21 jimmyo
# Milliqueries not of interest...
#
# Revision 1.2 2003/11/26 14:47:31 jimmyo
# No peaks...
#
# Revision 1.1 2003/11/26 09:26:04 jimmyo
# Plugin contribution by Nicolai Langfeldt
#
#
#%# family=contrib
# REQUIREMENTS: in your named.conf you must have statistics-interval set:
# options {
# ...
# statistics-interval 1;
# ...
# };
# The number is in minutes. At each interval just 3 lines is dumped.
# It can be desturbing if you usually read the logs yourself, but
# a 1 minute interval ensures very updated information to munin.
# 5 minutes is the maximum I'd say.
# The name of the file where syslog puts daemon output - ie the named
# statistics output. On solaris this is /var/adm/messages, on most
# linuxes it is /var/log/messages. But on Debian it is
# /var/log/daemon which is read restricted so we have to run as a user
# with read rights, or remove the restrictions.
if [ -n "$logfile" ]; then
SYSLOGFILE=$logfile
else
if [ -f /var/adm/messages ]; then
SYSLOGFILE=/var/adm/messages
else
SYSLOGFILE=/var/log/daemon.log
fi
fi
# ----------------------------------------------------------------------
pick_stat () {
ret=`echo "$2" | sed "s/.* *$1=\([0-9]*\).*/\1/"`
if [ ! "$ret" ]; then
echo 0;
else
echo $ret
fi
}
do_stats () {
if [ ! -f $SYSLOGFILE ] ; then
echo $SYSLOGFILE is unavailable to me >&2
exit 1
fi
# Get out the last XSTATS and NSTATS lines
XSTATS=`grep 'named.*XSTATS' "$SYSLOGFILE" | tail -1`
# NSTATS=`grep 'named.*NSTATS' "$SYSLOGFILE" | tail -1`
# We concentrate on what clients communicate with us about
# and counters that we suspect can indicate abuse or error conditions
# Received Queries: Total volume of queries received.
# This should be nice and smooth.
echo "queries.value `pick_stat RQ "$XSTATS"`"
# Sent Answers: This should be the same as RQ except when there are
# errors. May not be very interesting.
echo "answers.value `pick_stat SAns "$XSTATS"`"
# Sent and Forwarded queries, in a proxy setting this should be
# the same as Received Queries (?)
echo "forwarded.value `pick_stat SFwdQ "$XSTATS"`"
# Received Zone Transfer queries - should be low. High value could
# indicate some odd error or some kind of abuse
echo "axfr.value `pick_stat RAXFR "$XSTATS"`" # Received AXFR Qs
# Received TCP connections: These are used for zone transfers or
# oversized (>512 byte) answers. A high value here could indicate
# that you need to trim down the size of your answers somehow (Do you
# have a ton of MXes or NSes that gets reported back?), or this could
# be due to an error. Or it could be due to abuse.
echo "tcp.value `pick_stat RTCP "$XSTATS"`"
# Get a total of errors
errexpr="
`pick_stat RNXD "$XSTATS"` +
`pick_stat RFail "$XSTATS"` +
`pick_stat RErr "$XSTATS"` +
`pick_stat SErr "$XSTATS"` +
`pick_stat RIQ "$XSTATS"` +
`pick_stat RFErr "$XSTATS"` ";
echo "errors.value `expr $errexpr`"
}
case $1 in
config)
cat <<'EOF'
graph_title BIND DNS Query statistics
graph_vlabel Queries / ${graph_period}
graph_scale no
queries.label Queries
queries.type DERIVE
queries.min 0
answers.label Answers
answers.type DERIVE
answers.min 0
forwarded.label Forwarded
forwarded.type DERIVE
forwarded.min 0
axfr.label AXFRs
axfr.type DERIVE
axfr.min 0
tcp.label Qs by TCP
tcp.type DERIVE
tcp.min 0
errors.label Errors
errors.type DERIVE
errors.min 0
EOF
exit 0
;;
esac
do_stats
syntax highlighted by Code2HTML, v. 0.9.1