==== Compact, simple example ====
=== Data Source ===
free -m
total used free shared buffers cached
Mem: 499 214 284 0 2 169
- Total
free -m | grep Mem | awk '{print $2}'
499
- Used
free -m | grep Mem | awk '{print $3}'
65
=== Create a database ===
rrdtool create /root/mem.rrd --step 60 DS:mem:GAUGE:120:0:499 RRA:MAX:0.5:1:31622400
=== Update the database and print out the latest graph ===
- !/bin/bash
- update data
mem_used=`free -m | grep Mem | awk '{print $3}'`
/usr/bin/rrdtool update /root/mem.rrd --template mem N:$mem_used
- create graph
/usr/bin/rrdtool graph /var/www/html/mem.png \\
-w 500 -h 150 -a PNG \\
--slope-mode \\
--start -3600 --end now \\
--font DEFAULT:7: \\
--title "Memory used (last hour)" \\
--watermark "`date`" \\
--x-grid MINUTE:5:MINUTE:10:MINUTE:10:0:%R \\
--alt-y-grid \\
--rigid \\
--lower-limit=0 \\
--color BACK#363636 \\
--color CANVAS#000000 \\
--color GRID#999999 \\
--color MGRID#B5B5B5 \\
--color FONT#CCCCCC \\
DEF:memory=/root/mem.rrd:mem:MAX \\
AREA:memory#FFD700 \\
LINE1:memory#FFD700:Memory used (MB) \\
GPRINT:memory:LAST:Last\\: %5.2lf \\
GPRINT:memory:AVERAGE:Avg\\: %5.2lf \\
GPRINT:memory:MAX:Max\\: %5.2lf \\
GPRINT:memory:MIN:Min\\: %5.2lf
=== Schedule this shell to run on a regular basis ===
crontab -l
* /5 * * * * /root/update_and_create_graph.sh
==== A more involved example ====
- !/usr/bin/ksh
- ==============================================================================
- Name : dbamon_grapher.ksh
- Description : Creates and updates rrdtool databases
-
- Parameters : none
-
- Notes : Only as 'up-to-date' as the latest files sent over
-
- Modification History
- ====================
- When Who What
- ========= ================= ==================================================
- 06-DEC-13 Stuart Barkley Created
- ==============================================================================
CWD=`dirname $0`
- name of the file to process
COLLECTOR_DIR="/var/www/dbdc.be.ibm.com/dba"
COLLECTOR_FILES=${COLLECTOR_DIR}/"2dbamon_spool_stats*"
RRDTOOL="/usr/bin/rrdtool"
RRDDIR="/var/www/dbdc.be.ibm.com/dba"
PNGDIR="/var/www/dbdc.be.ibm.com/html/images"
- =======================================
- thats it, nothing to change below here!
- =======================================
function cre_export_duration {
rrd_dir=$1
rrdname=$2
$RRDTOOL create ${rrd_dir}/${rrdname} \\
--start 1384000000 \\
-s 86400 \\
DS:started:GAUGE:100000:1300000000:2000000000 \\
DS:stopped:GAUGE:100000:1300000000:2000000000 \\
RRA:AVERAGE:0.5:1:720
if [[ $? -ne 0 ]]; then
echo "cre_export_duration: failed to create ${rrd_dir}/${rrdname}"
return 1
fi
- echo "cre_export_duration: created ${rrd_dir}/${rrdname}"
return 0
}
rm -f $RRDDIR/*rrd
- create the rrd databases
- ------------------------
for statfile in `ls -t ${COLLECTOR_FILES}`
do
IFS="|"
exec 0<$statfile
while read host db type started stopped
do
[[ "$stopped" == "" ]] && continue
rrdfile="export_duration_${host}_${db}.rrd"
ls ${RRDDIR}/${rrdfile} >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
cre_export_duration "$RRDDIR" "$rrdfile"
fi
done
done
- ---------------------------------------------
- update the rrd databases with the latest data
- ---------------------------------------------
for statfile in `ls -t ${COLLECTOR_FILES}`
do
- echo "statfile: $statfile"
cat $statfile | sort -nk4 | while IFS=\\| read host db type started stopped
do
[[ "$stopped" == "" ]] && continue
rrdfile="export_duration_${host}_${db}.rrd"
$RRDTOOL update ${RRDDIR}/${rrdfile} ${started}:${started}:${stopped}
[[ $? -ne 0 ]] && echo "nok: $?"
done
done
- rrdtool fetch /var/www/dbdc.be.ibm.com/dba/export_duration_uaccdba22_ENDQ1.rrd AVERAGE --start "-1week"
- --color BACK#996 \\ # the bit where the title is written
- --color CANVAS#996 \\ # the background to the graph area
- --color GRID#0000FF \\ # the grid lines (graph paper)
- --color MGRID#fffffc \\
- --color FONT#CCCCCC \\
for statfile in `ls -t ${COLLECTOR_FILES}`
do
awk -F'|' '{print $1"|"$2}' $statfile | sort | uniq | while IFS=\\| read host db
do
echo "host:$host;db:$db"
[[ "$db" == "" ]] && continue
$RRDTOOL graph ${PNGDIR}/export_duration_${host}_${db}.png \\
-a PNG \\
-s "-14days" \\
--slope-mode \\
--title="Export duration for ${db} on ${host}" \\
--vertical-label Minutes \\
--alt-y-grid \\
--rigid \\
--color BACK#ffffd0 \\
--color CANVAS#ffffd0 \\
--color GRID#0000FF \\
--color MGRID#996 \\
--color FONT#000 \\
"DEF:started=${RRDDIR}/export_duration_${host}_${db}.rrd:started:AVERAGE" \\
"DEF:stopped=${RRDDIR}/export_duration_${host}_${db}.rrd:stopped:AVERAGE" \\
"CDEF:duration=stopped,started,-,60,/" \\
'AREA:duration#996:Duration'
done
done
==== Display information about the database ====
rrdtool info
eg:
rrdtool info export_duration_wdcrhbp05_ARISPPMP.rrd
==== Print out the data in the database ====
rrdtool fetch --start
eg:
rrdtool fetch export_duration_wdcrhbp05_ARISPPMP.rrd AVERAGE --start now-100000
==== Export a part of the data in the RRA in JSON or XML format ====
Most of these parameters are the same as those used to graph the data
rrdtool xport --json -s now-1month DEF:rmantime=dbamon_rman-duration_SOL_solax025_BI4REFP.rrd:rmantime:MAX CDEF:mins=rmantime,60,/ XPORT:mins
or
rrdtool xport -s now-1month DEF:rmantime=dbamon_rman-duration_SOL_solax025_BI4REFP.rrd:rmantime:MAX CDEF:mins=rmantime,60,/ XPORT:mins > xport.xml
and trim the results to bare data
cat xport.xml | grep '' | grep -v NaN | sed -e 's/ //g' -e 's///' -e 's/<\\/t>/ /' -e 's/<\\/v><\\/row>//'
==== Delete entry in rrd database ====
This function is not (yet) available and so the best work-around is:
* Use RRDTool Dump to export RRD file to XML
* Open the XML file, find and edit the bad data
* Restore the RRD file using RRDTool Restore
rrdtool dump filename.rrd [[filename.xml]] [[--header|-h {none,xsd,dtd}]] [[--no-header]] [[--daemon address]] > filename.xml
eg:
rrdtool dump export_duration_wdcrhbp05_ARISPPMP.rrd dumped.xml
and
rrdtool restore filename.xml filename.rrd [[--range-check|-r]] [[--force|-f]]
eg:
rrdtool restore dumped.xml export_duration_wdcrhbp05_ARISPPMP.rrd -f
==== References ====
* [[http://oss.oetiker.ch/rrdtool/|http://oss.oetiker.ch/rrdtool/]]
* [[http://khmel.org/?p=236|Original page]]
* [[http://cuddletech.com/articles/rrd/ar01s02.html|Creating an initial RRD]]
* [[http://apfelboymchen.net/gnu/rrd/create/|Better explanations of RRA]]