Initial commit.

This commit is contained in:
Leander Hutton 2014-06-10 14:35:54 -04:00
commit 99da7b05f7
5 changed files with 229 additions and 0 deletions

19
README Normal file
View File

@ -0,0 +1,19 @@
RRD Scripts
v0.1
leander@one-button.org
www.one-button.org
Graphs load average, disk usage, and network throughput.
Something simple I put together for some basic graphs, not a Cacti replacement. Requires RRD and presumably some web server to display the graphs.
Make sure you adjust the settings in the rrd_config file before you install.
Run the rrd_init_databases.sh to intialize the databases, then run ./update_rrds.sh &. You may want to put that in rc.local or some equivalent so it runs on boot.
To have the graphs generated automatically add something like
*/5 * * * * /path/to/rrd_scripts/update_graphs.sh > /dev/null 2>&1
to your crontab.

6
rrd_config Executable file
View File

@ -0,0 +1,6 @@
INTERFACES=( eth0 eth1 )
DISKS=( sda sdb md0 )
RRDDIR="/usr/local/rrd/"
GRAPHDIR="/usr/local/graphs/"
RRDTOOL="/usr/bin/rrdtool"
IOSTAT="/usr/bin/iostat"

64
rrd_init_databases.sh Executable file
View File

@ -0,0 +1,64 @@
#!/bin/bash
# Simple RRD setup
# Netowrk traffic in bytes/sec
# Disk reads/writes in bytes/sec
# Load average as reported by /proc/loadavg
# Needs: sysstat iostat
CONFIGDIR=$(pwd)
sed "3i . ${CONFIGDIR}/rrd_config" update_graphs.sh > update_graphs.sh
. ${CONFIGDIR}/rrd_config
if [ ! -d "$RRDDIR" ]; then
mkdir -p $RRDDIR
fi
cd $RRDDIR
# Create RRDs for network interfaces
for i in "${INTERFACES[@]}"
do
if [ ! -f ${i}_day.rrd ]; then
$RRDTOOL create ${i}_day.rrd \
--step 15 \
DS:RXBytes:DERIVE:240:0:1000000000000000 \
DS:TXBytes:DERIVE:240:0:1000000000000000 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
fi
done
# Create RRDs for disks
for i in "${DISKS[@]}"
do
if [ ! -f {i}.rrd ]; then
$RRDTOOL create ${i}.rrd \
--step 15 \
DS:reads:DERIVE:30:0:1000000000000000 \
DS:writes:DERIVE:30:0:1000000000000000 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
fi
done
# Create load average RRD
if [ ! -f loadavg.rrd ]; then
$RRDTOOL create loadavg.rrd \
--step 15 \
DS:one:GAUGE:30:0:100 \
DS:five:GAUGE:30:0:100 \
DS:fifteen:GAUGE:30:0:100 \
RRA:AVERAGE:0.5:1:576 \
RRA:AVERAGE:0.5:6:672 \
RRA:AVERAGE:0.5:24:732 \
RRA:AVERAGE:0.5:144:1460
fi

95
update_graphs.sh Executable file
View File

@ -0,0 +1,95 @@
#!/bin/bash
. /root/rrd_scripts/rrd_config
if [ ! -d $GRAPHDIR ]; then
mkdir -p $GRAPHDIR
fi
cd $RRDDIR
for i in ${INTERFACES[@]}
do
$RRDTOOL graph $GRAPHDIR${i}_day.png \
-h 120 -w 550 -a PNG \
--start end-8h --end now \
--font DEFAULT:7: \
--title "$i Network Throughput" \
--watermark "`date`" \
--vertical-label "bytes/sec" \
--logarithmic \
--units=si \
--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \
--alt-y-grid --rigid \
DEF:RXBytes=${i}_day.rrd:RXBytes:AVERAGE \
DEF:TXBytes=${i}_day.rrd:TXBytes:AVERAGE \
LINE2:RXBytes#3ADF00:RX \
GPRINT:RXBytes:LAST:"Cur\: %5.2lf %s" \
GPRINT:RXBytes:AVERAGE:"Avg\: %5.2lf %S" \
GPRINT:RXBytes:MAX:"Max\: %5.2lf %S" \
GPRINT:RXBytes:MIN:"Min\: %5.2lf %SBps\n" \
LINE2:TXBytes#045FB4:TX \
GPRINT:TXBytes:LAST:"Cur\: %5.1lf %s" \
GPRINT:TXBytes:AVERAGE:"Avg\: %5.1lf %S" \
GPRINT:TXBytes:MAX:"Max\: %5.1lf %S" \
GPRINT:TXBytes:MIN:"Min\: %5.1lf %SBps\n" \
HRULE:0#000000
done
for i in ${DISKS[@]}
do
$RRDTOOL graph $GRAPHDIR${i}.png \
-h 120 -w 550 -a PNG \
--start end-8h --end now \
--font DEFAULT:7: \
--title "${i} Data Read/Written" \
--watermark "`date`" \
--vertical-label "bytes/sec" \
--logarithmic \
--units=si \
--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \
--alt-y-grid --rigid \
DEF:reads=${i}.rrd:reads:AVERAGE \
DEF:writes=${i}.rrd:writes:AVERAGE \
LINE2:reads#3ADF00:Read \
GPRINT:reads:LAST:"Cur\: %5.2lf %s" \
GPRINT:reads:AVERAGE:"Avg\: %5.2lf %S" \
GPRINT:reads:MAX:"Max\: %5.2lf %S" \
GPRINT:reads:MIN:"Min\: %5.2lf %SBps\n" \
LINE2:writes#045FB4:Written \
GPRINT:writes:LAST:"Cur\: %5.1lf %s" \
GPRINT:writes:AVERAGE:"Avg\: %5.1lf %S" \
GPRINT:writes:MAX:"Max\: %5.1lf %S" \
GPRINT:writes:MIN:"Min\: %5.1lf %SBps\n" \
HRULE:0#000000
done
$RRDTOOL graph $GRAPHDIR/loadavg.png \
-h 120 -w 550 -a PNG \
--start end-8h --end now \
--font DEFAULT:7: \
--title "Load Average" \
--watermark "`uptime`" \
--vertical-label "Load Average" \
--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \
--upper-limit 2.00 \
--lower-limit 0.00 \
DEF:one=loadavg.rrd:one:AVERAGE \
DEF:five=loadavg.rrd:five:AVERAGE \
DEF:fifteen=loadavg.rrd:fifteen:AVERAGE \
LINE:fifteen#FF0000:"1 Min\:" \
GPRINT:fifteen:LAST:"Cur\: %5.2lf" \
GPRINT:fifteen:AVERAGE:"Avg\: %5.2lf" \
GPRINT:fifteen:MIN:"Min\: %5.2lf" \
GPRINT:fifteen:MAX:"Max\: %5.2lf\n" \
LINE:five#0000FF:"5 Min\:" \
GPRINT:five:LAST:"Cur\: %5.2lf" \
GPRINT:five:AVERAGE:"Avg\: %5.2lf" \
GPRINT:five:MIN:"Min\: %5.2lf" \
GPRINT:five:MAX:"Max\: %5.2lf\n" \
AREA:one#00FF0080:"15 Min\:" \
GPRINT:one:LAST:"Cur\: %5.2lf" \
GPRINT:one:AVERAGE:"Avg\: %5.2lf" \
GPRINT:one:MIN:"Min\: %5.2lf" \
GPRINT:one:MAX:"Max\: %5.2lf\n" \

45
update_rrds.sh Executable file
View File

@ -0,0 +1,45 @@
#!/bin/bash
CONFIGPATH=$(pwd)
while [ true ]
do
. ${CONFIGPATH}/rrd_config
cd $RRDDIR
for i in "${INTERFACES[@]}"
do
# By default I use ifconfig, if you prefer
# iproute2 simply comment out the next two lines
# and uncomment the other ones.
RX=$(/sbin/ifconfig $i | grep bytes | cut -f2 -d":" | cut -f1 -d " ")
TX=$(/sbin/ifconfig $i | grep bytes | cut -f3 -d":" | cut -f1 -d " ")
#RX=$(/sbin/ip -o -s link show eth0 | cut -f40 -d" ")
#TX=$(/sbin/ip -o -s link show eth0 | cut -f84 -d" ")
$RRDTOOL update ${i}_day.rrd --template RXBytes:TXBytes N:${RX}:${TX}
done
for i in "${DISKS[@]}"
do
READS=$(${IOSTAT} -d $i | grep $i | awk {'print $5'})
WRITES=$(${IOSTAT} -d $i | grep $i | awk {'print $6'})
READSB=$((${READS}*1000))
WRITESB=$((${WRITES}*1000))
$RRDTOOL update ${i}.rrd --template reads:writes N:${READSB}:${WRITESB}
done
ONEMIN=$(cat /proc/loadavg | awk {'print $1'})
FIVEMIN=$(cat /proc/loadavg | awk {'print $2'})
FIFTEENMIN=$(cat /proc/loadavg | awk {'print $3'})
$RRDTOOL update loadavg.rrd --template one:five:fifteen N:${ONEMIN}:${FIVEMIN}:${FIFTEENMIN}
sleep 7
done