Difference between revisions of "RRDTool"
From dbawiki
(→Update the database and print out the latest graph) |
(→Print out the data in the database) |
||
| (15 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| − | ===Data Source=== | + | ===Compact, simple example=== |
| + | ====Data Source==== | ||
<pre> | <pre> | ||
free -m | free -m | ||
| Line 13: | Line 14: | ||
65 | 65 | ||
</pre> | </pre> | ||
| − | ===Create a database=== | + | ====Create a database==== |
<pre> | <pre> | ||
rrdtool create /root/mem.rrd --step 60 DS:mem:GAUGE:120:0:499 RRA:MAX:0.5:1:31622400 | rrdtool create /root/mem.rrd --step 60 DS:mem:GAUGE:120:0:499 RRA:MAX:0.5:1:31622400 | ||
</pre> | </pre> | ||
| − | ===Update the database and print out the latest graph=== | + | ====Update the database and print out the latest graph==== |
<pre> | <pre> | ||
#!/bin/bash | #!/bin/bash | ||
| Line 49: | Line 50: | ||
GPRINT:memory:MAX:Max\: %5.2lf \ | GPRINT:memory:MAX:Max\: %5.2lf \ | ||
GPRINT:memory:MIN:Min\: %5.2lf | GPRINT:memory:MIN:Min\: %5.2lf | ||
| + | </pre> | ||
| + | ====Schedule this shell to run on a regular basis==== | ||
| + | <pre> | ||
| + | crontab -l | ||
| + | */5 * * * * /root/update_and_create_graph.sh | ||
| + | </pre> | ||
| + | |||
| + | ===A more involved example=== | ||
| + | <pre> | ||
| + | #!/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 | ||
| + | </pre> | ||
| + | |||
| + | ===Display information about the database=== | ||
| + | <pre> | ||
| + | rrdtool info <database> | ||
| + | eg: | ||
| + | rrdtool info export_duration_wdcrhbp05_ARISPPMP.rrd | ||
| + | </pre> | ||
| + | ===Print out the data in the database=== | ||
| + | <pre> | ||
| + | rrdtool fetch <database> <consolidation function> --start <start time in epoch seconds> | ||
| + | eg: | ||
| + | rrdtool fetch export_duration_wdcrhbp05_ARISPPMP.rrd AVERAGE --start now-100000 | ||
| + | </pre> | ||
| + | |||
| + | ===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 | ||
| + | <pre> | ||
| + | rrdtool xport --json -s now-1month DEF:rmantime=dbamon_rman-duration_SOL_solax025_BI4REFP.rrd:rmantime:MAX CDEF:mins=rmantime,60,/ XPORT:mins | ||
| + | </pre> | ||
| + | or | ||
| + | <pre> | ||
| + | rrdtool xport -s now-1month DEF:rmantime=dbamon_rman-duration_SOL_solax025_BI4REFP.rrd:rmantime:MAX CDEF:mins=rmantime,60,/ XPORT:mins > xport.xml | ||
| + | </pre> | ||
| + | and trim the results to bare data | ||
| + | <pre> | ||
| + | cat xport.xml | grep '<row>' | grep -v NaN | sed -e 's/ //g' -e 's/<row><t>//' -e 's/<\/t><v>/ /' -e 's/<\/v><\/row>//' | ||
| + | </pre> | ||
| + | |||
| + | ===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 | ||
| + | |||
| + | <pre> | ||
| + | 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 | ||
| + | </pre> | ||
| + | and | ||
| + | <pre> | ||
| + | rrdtool restore filename.xml filename.rrd [--range-check|-r] [--force|-f] | ||
| + | eg: | ||
| + | rrdtool restore dumped.xml export_duration_wdcrhbp05_ARISPPMP.rrd -f | ||
</pre> | </pre> | ||
| − | + | ===References=== | |
| − | [http://khmel.org/?p=236 Original page] | + | * [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] | ||
Latest revision as of 09:36, 17 April 2016
Contents
Compact, simple example[edit]
Data Source[edit]
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[edit]
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[edit]
#!/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[edit]
crontab -l */5 * * * * /root/update_and_create_graph.sh
A more involved example[edit]
#!/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[edit]
rrdtool info <database> eg: rrdtool info export_duration_wdcrhbp05_ARISPPMP.rrd
Print out the data in the database[edit]
rrdtool fetch <database> <consolidation function> --start <start time in epoch seconds> 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[edit]
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 '<row>' | grep -v NaN | sed -e 's/ //g' -e 's/<row><t>//' -e 's/<\/t><v>/ /' -e 's/<\/v><\/row>//'
Delete entry in rrd database[edit]
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