Comme promis lors de l’enregistrement du 2.2 et tant réclamé depuis, voici mes notes concernant les deux outils RRDTool & GnuPlot :
- RRDTool http://oss.oetiker.ch/rrdtool/
Dans ce premier exemple je vais me baser sur le résultat de la commande vmstat qui sort des statistiques chiffrées sur l’utilisation mémoire virtuelle et cpu. Tout est intégré dans un script qui permet :
- de générer la base de données RRD (
rrdtool create) - de collecter des données avec vmstat et des les insérer dans cette base (
vmstat) - de générer les graphiques grâce aux données collectées (
rrdtool graph)
Référence : Article d’un blog IBM avec ce même script créé à l’origine en ksh pour AIX, modifié pour Linux en bash (RRDtool identique mais pas vmstat qui est natif OS!)
Il vous suffit de copier-coller ce script dans un rrdtest.ksh et de l’éxécuter avec un nombre de seconde correspondant à l’échantillon désiré : ./rrdtest.ksh 200
#!/bin/bash
if [[ $# -eq 1 ]] && [[ $1 -le 86400 ]]
then
echo This script captures for $1 seconds
echo Remove the previouss vmstat.rrd database in this directory
rm vmstat.rrd
echo Create vmstat.rrd for max 86400 seconds = max 24 hours at 1 second captures
rrdtool create vmstat.rrd --step 1 \
DS:r:GAUGE:5:U:U \
DS:b:GAUGE:5:U:U \
DS:swpd:GAUGE:5:U:U \
DS:fre:GAUGE:5:U:U \
DS:buff:GAUGE:5:U:U \
DS:cache:GAUGE:5:U:U \
DS:si:GAUGE:5:U:U \
DS:so:GAUGE:5:U:U \
DS:bi:GAUGE:5:U:U \
DS:bo:GAUGE:5:U:U \
DS:in:GAUGE:5:U:U \
DS:cs:GAUGE:5:U:U \
DS:us:GAUGE:5:U:U \
DS:sy:GAUGE:5:U:U \
DS:id:GAUGE:5:U:U \
DS:wa:GAUGE:5:U:U \
RRA:AVERAGE:0.5:1:86400
TIME=`date +%s`
echo startseconds $TIME
echo Capturing for $1 seconds
vmstat 1 $1 | awk -v time=$TIME '/^.[0-9]/{ n++; print "rrdtool update vmstat.rrd "time+n":" $1 ":" $2 ":" $3 ":" $4 ":" $5 ":" $6 ":" $7 ":" $8 ":" $9 ":" $10 ":" $11 ":" $12 ":" $13 ":" $14 ":" $15 ":" $16 }' >vmstat.output
ENDTIME=`date +%s`
echo endseconds $ENDTIME
echo Load the vmstat data into the vmstat.rrd database
echo The file has `wc -l vmstat.output` lines
bash <./vmstat.output
echo Graph the data
rrdtool graph plot/cpu_utilisation.png \
--rigid --lower-limit 0 --upper-limit 100 \
--title "CPU Utilisation" \
--vertical-label "Percent Stacked" \
--start $TIME \
--end $ENDTIME \
--height 600 \
--width 1000 \
DEF:us=vmstat.rrd:us:AVERAGE AREA:us#00FF00:"User" \
DEF:sy=vmstat.rrd:sy:AVERAGE STACK:sy#0000FF:"System" \
DEF:wa=vmstat.rrd:wa:AVERAGE STACK:wa#FF0000:"Wait" \
DEF:id=vmstat.rrd:id:AVERAGE STACK:id#FFFFFF:"Idle"
rrdtool graph plot/run_queue.png \
--title "Process Run Queue" \
--vertical-label "Processes" \
--height 600 \
--width 1000 \
--start $TIME \
--end $ENDTIME \
DEF:r=vmstat.rrd:r:AVERAGE LINE2:r#00FF00:"Run Queue"
rrdtool graph plot/block_io.png \
--title "IO blocks" \
--vertical-label "Nb Blocks" \
--height 600 \
--width 1000 \
--start $TIME \
--end $ENDTIME \
DEF:bi=vmstat.rrd:bi:AVERAGE LINE1:bi#00FF00:"IN" \
DEF:bo=vmstat.rrd:bo:AVERAGE LINE2:bo#0000FF:"OUT"
rrdtool graph plot/system.png \
--title "System" \
--vertical-label "Nb/sec" \
--height 600 \
--width 1000 \
--start $TIME \
--end $ENDTIME \
DEF:in=vmstat.rrd:in:AVERAGE LINE1:in#00FF00:"Interrupt" \
DEF:cs=vmstat.rrd:cs:AVERAGE LINE2:cs#0000FF:"Context Switch"
exit 0
else
echo "Invalid number of arguments or out of range..."
echo "USAGE : $0 [nb_seconds]"
echo "Use max 86400 seconds (24h) ; 3600 = 1h"
fi
Et voila : nos données vmstat sont dans une base rrdtool et les 4 commandes rrdtool graph m’ont sorti les 4 graphiques suivants qu’il ne vous reste plus qu’à injecter dans vos pages web ou envoyer par mail…
Dans l’ordre ci-dessous : CPU%, proc.run.queue, block IO & system interrupt, pour une collecte de 200 secondes. Pour savoir ce que ces données représentent, man vmstat !




Installation : sudo apt-get install rrdtool
Et comme vous le savez, “la taille du paquet” est importante pour moi : ces deux soft tiennent sur une disquette. Taille du package rrdtool installé : moins d’un MegaByte !
- GNUPlot http://www.gnuplot.info/
Trouver une série de chiffre pertinent pour une représentation graphique. Un fichier plat fait l’affaire mais une base de donnée peut également être attaquée par requête SQL. C’est ce que j’ai utilisé dans l’exemple ci-dessous :

Tapper gnuplot en ligne de commande pour vous retrouver dans le logiciel et encoder les lignes d’exemple suivantes, ou plus simplement pré-encoder un fichier .gnu contenant les lignes ci-dessous, et entrer ce fichier en argument : gnuplut bubulle.gnu
#GNUPLOT SCRIPT by bubulle @2012
# Setting terminal and variables
set terminal png
set output "/home/bubulle/plot/statest.png"
max=`sqlite3 DB1 'select max(EpisodeNr) from stat'`
# Setting Plot Parameters
set datafile separator "|"
set title "Downloaded Tux Podcast"
set style data linespoints #points lines steps fs dots
set yrange [0:*]
set xtics 259200 rotate by -60
set xdata time
set format x "%d/%m"
set timefmt "%Y-%m-%d"
# Generating Plot
plot for [i=1:max] "<sqlite3 DB1 'select d_date,EpisodeNr,Downloaded from stat where EpisodeNr=".i." order by d_date'" using 1:(stringcolumn(2) == i ? $3 : 1/0) title "EP".i
OK je vous concède que cette dernière commande qui injecte le résultat d’un SQL dans la commande de plotting n’a pas réussi du premier coup… mais après 2 ou 3 (50 en fait) essais, voici à quoi je voulais arriver : superposition de plusieurs séries dans la même échelle de temps :

Installation : sudo apt-get install gnuplot
Taille du package gnuplot installé : 45 kiloByte !
Voila pour ce mois-ci! On se retrouve avec plaisir autour du 20 mars pour le podcast 2.3.



