Keeping a graph of I/O percentage utilisation is useful as often times of high utilisation may be at non-sociable hours. For example during overnight data-warehouse extracts and backups. The code below has been run on an Ubuntu 20.04 machine. But columns and column sequence may vary between CPU architecture, OS version etc. Generally percentage I/O utilisation will be the last column of output.
The code below is placed in a "iostat.sh" script in "usr/lib/xymon/client/ext" directory for a standard package installation of the client. Remember to set the code to executable before scheduling it: "chmod 755 /usr/lib/xymon/client/ext/iostat.sh" Note this script is written in a way that simply running it at the command line will display the xymon data to the terminal screen.
Note this is a bit of a hack that alters the default graph.cfg file that is installed / upgraded by the xymon package.
###########################################################################
#
# iostat monitor
#
###########################################################################
basedir=/home/xymon/client/ext
COLUMN="iostat"
export column
if [ -z "$XYMSRV" ] ; then
SERVER=""
XYMON="echo"
else
SERVER="$XYMSRV"
fi
if [ -z "$MACHINE" ] ; then
MACHINE=`/bin/uname -n`
fi
COLOR="green"
warnlim=80
critlim=98
interval=300
# sedstr=`ls -l /dev/mapper/ | awk '
sedstr=`ls -l /dev/mapper/ | awk '/dm-/ { if (NF==11) print $9 " " $11}' | sort -rk 2 | awk '
/dm-/ {
split ($NF, mapper, "/")
piece = split ($(NF-1), filesys, "-")
while (length(filesys[piece])<length(mapper[2])) filesys[piece] = sprintf ("%s_", filesys[piece])
repeat = length(filesys[piece]) - length(mapper[2])
if (repeat<0) repeat = 0
printf (" -es/%s", mapper[2])
for (n=0; n<repeat; n++) printf (".")
printf ("/%s/g", filesys[piece])
}
END { printf "\n" } '`
output=`iostat -x $interval 2 | awk '
/^Linux/ { print $0 }
/^avg-cpu:/ { chk++ }
{ if (chk>1) print $0 } ' | sed $sedstr | awk -v warnlim="$warnlim" -v critlim="$critlim" '
{
if (state > 0 && NF > 5) {
if ($NF >= critlim) printf ("&red %s\n", $0)
else if ($NF >= warnlim) printf ("&yellow %s\n", $0)
else printf ("&green %s\n", $0)
}
else printf (" %s\n", $0)
}
/Device:/ { state++ }
' `
state=`echo "$output" | egrep -c "^&red|^&yellow"`
if [ $state -gt 0 ] ; then
COLOR="blue"
fi
chk=`dpkg -l | grep -c sysstat`
if [ $chk -lt 1 ] ; then
output="&blue sysstat package is not installed on this server."
COLOR=blue
fi
$XYMON $XYMSRV "status $MACHINE.$COLUMN $COLOR `date` - iostat -x $interval 2
$output
Measured interval = $interval seconds
Warning: Percent Util > $warnlim
Critical: Percent Util > $critlim
"
#
# Send through IO stat details
#
if [ $chk -gt 0 ] ; then
payload=`echo "$output" | awk '
/^\&/ {
printf ("[iostat.%s.rrd]\n", $2)
printf ("DS:r_req:GAUGE:600:0:U %s\n", $5)
printf ("DS:w_req:GAUGE:600:0:U %s\n", $6)
printf ("DS:util:GAUGE:600:0:U %s\n", $NF)
} '`
$XYMON $XYMSRV "data $MACHINE.trends
$payload
"
fi
Add these lines in the client machine's xymon schedule: /var/run/xymon/clientlaunch-include.cfg
The client process log files should be available in /var/log/xymon/iostat.log
[iostat]
ENVFILE $XYMONCLIENTHOME/etc/xymonclient.cfg
CMD $XYMONCLIENTHOME/ext/iostat.sh
LOGFILE $XYMONCLIENTLOGS/iostat.log
INTERVAL 5m
In order to get the iostat data to be included in a graph, some server side changes need to be made. Since there is already a graph definition in /etc/xymon/graphs.cfg we just need to tweak this to match the graph definition created above. Edit /etc/xymon/graphs.cfg, find the "[iostat]" section and make it look like this:
[iostat]
TITLE I/O Utilization
YAXIS Pct Util
FNPATTERN ^iostat.(.+).rrd
DEF:p@RRDIDX@B=@RRDFN@:util:AVERAGE
DEF:p@RRDIDX@R=@RRDFN@:r_req:AVERAGE
DEF:p@RRDIDX@W=@RRDFN@:w_req:AVERAGE
LINE1:p@RRDIDX@B#@COLOR@:@RRDPARAM@
COMMENT:\n
GPRINT:p@RRDIDX@B:LAST: pct util\: %6.1lf (cur)
GPRINT:p@RRDIDX@B:MAX: \: %6.1lf (max)
GPRINT:p@RRDIDX@B:MIN: \: %6.1lf (min)
GPRINT:p@RRDIDX@B:AVERAGE: \: %6.1lf (avg)\n
GPRINT:p@RRDIDX@R:LAST: read req/s\: %6.1lf (cur)
GPRINT:p@RRDIDX@R:MAX: \: %6.1lf (max)
GPRINT:p@RRDIDX@R:MIN: \: %6.1lf (min)
GPRINT:p@RRDIDX@R:AVERAGE: \: %6.1lf (avg)\n
GPRINT:p@RRDIDX@W:LAST:write req/s\: %6.1lf (cur)
GPRINT:p@RRDIDX@W:MAX: \: %6.1lf (max)
GPRINT:p@RRDIDX@W:MIN: \: %6.1lf (min)
GPRINT:p@RRDIDX@W:AVERAGE: \: %6.1lf (avg)\n
COMMENT:\n
| Thank you for visiting camelthorn.cloud | Home |