Exemple de construction d'un graphique a partir du jeu de résultats retourné par la commande ping avec RRDtool.
Le graphique montre l'évolution des valeurs des variables round trip time (rtt) et packet loss (pl) dans le temps. rtt est dessinée en bleue et pl correspond à la couleur d’arrière plan. Si aucun paquet n'est perdu le fond reste blanc si des pertes apparaissent la couleur évolue de jaune à rouge proportionnellement. Le graphique permet de visualiser un relevé par minute sur 24h il est en présenté en abscisse au bas du graphique. L'axe Y est automatiquement mis à l’échelle en fonction des valeurs collectées de latence exprimée en milliseconde. La légende de l'axe Y est affichée à gauche et à droite. Titre en haut définit en noir, en bas l'horodatage de création du graphique en gris clair.
L'ensemble des fichiers seront placés dans un répertoire de travail. Les 3 scripts, la base de données et les graphiques générés seront dans ce répertoire. Une fois le graphique généré il est copié dans un répertoire web pour être facilement visible via votre serveur web.
Créer un fichier script avec le contenu ci-dessous. Il permet de créer un fichier de base de données nommé pingdb.rrd.
#!/bin/bash # Creation du fichier de base de données # creer la base pingdb.rrd dans le repertoire courant rrdtool create pingdb.rrd \ --step 60 \ DS:pl:GAUGE:120:0:100 \ DS:rtt:GAUGE:120:0:1000000 \ RRA:MAX:0.5:1:1500 \ # --step=temps en secondes attendu entre chaque mise a jour des données # DS=Data Set : pl nom de la variable : GAUGE donnée a inserer directement en base sans calcul/manipulation : 120 est le timeout en secondes, passé ce délai, une valeur par défaut est insérée dans l'enregistrement DS: min : max # RRA=Round Robin Archive directive permet de définir combien de valeurs la base de données archivve et pour combien de temps. : MAX= si plusieurs valeurs sont dispnible c'est la plus grande qui est insérée. Dans ce cas une seule donnée : 0.5 variable a décrire : 1 définit combien de steps sont necessaires pour valider/consolider la donnée. Ici un step pour une donnée dans la base. : 1500 step stockés dans la base.
Rendre le fichier executable
chmod 755 ./create_db.sh
A propos des directives rrdtool présentes dans le script:
rrdtool create pingdb.rrd \
Appel de la commade rrdtool, en premier argument option de création d'un fichier de base de données en deuxième argument le nom du fichier base ici pingdb.rrd. Le fichier est créer dans le répertoire courant.
--step 60 \
Le temps en secondes attendu entre deux mises à jour des données dans la base. le script de collecte se chargera de mettre à jour les infos dans la base via une tâche cron toute les 60 secondes.
DS:pl:GAUGE:120:0:100 \
DS:rtt:GAUGE:120:0:1000000 \
La seconde variable est définie de la même façon, elle est nommée rtt avec un nimimum de 0 car cette variable représente un temps de latence qui peut être au minimum nul et un maximum de 1000000 équivalent a 100 secondes puisqu'elle est retournée en ms par la commande ping.
RRA:MAX:0.5:1:1500 \
Maintenant que la base est créée, il reste à la remplir. On peut écrire tout type de script à cet effet. Ici on propose un simple script bash qui ping un hôte collecte/filtre les données retournée par la commande et les insère dans la base.
#!/bin/bash # Définition des chemins command="/bin/ping -q -n -c 3" gawk="/usr/bin/gawk" rrdtool="/usr/bin/rrdtool" ping_target="192.9.200.9" ### Data collector routine get_data() { local output=$( $command $1 2>&1) local method=$( echo "$output" | $gawk ' BEGIN {pl=100; rtt=0.1} /packets transmitted/ { match($0, /([0-9]+)% packet loss/, datapl) pl=datapl[1] } /min\/avg\/max/ { match($4, /(.*)\/(.*)\/(.*)\/(.*)/, datartt) rtt=datartt[2] } END {print pl ":" rtt} ') RETURN_DATA=$method } ### script directory cd /home/yoann/developpement/tutos-rrdtool/ping/ ### Collect the data get_data $ping_target #echo $RETURN_DATA ### update the database $rrdtool update pingdb.rrd --template pl:rtt N:$RETURN_DATA
Le script change le répertoire courant pour entrer dans le répertoire de travail. La fonction get_data exécute le ping et gwak est utilisé pour extraire les données à l'aide d'expressions rationnelles. La dernière ligne met à jour la base avec les valeurs des variable pl et rtt séparées par le caractère ':'.
La meilleure façon de collecter les données est d’exécuter un job cron toutes les minutes
crontab -e
* * * * * /home/yoann/developpement/tutos-rrdtool/ping/update_rdd_database.sh
Après quelques minutes les premières insertions ont eu lieu, on peut tracer le graphique. Pour voir rapidement l’état de la base:
rrdtool info ./pingdb.rrd
Dans les valeurs retournées on notera notamment, le timestamp de la dernière mise à jour que l'on peut convertir en une chaîne date lisible via date, les dernières valeurs enregistrées pour nos variables:
filename = "./pingdb.rrd"
rrd_version = "0003"
step = 60
last_update = 1475582403
...
ds[pl].last_ds = "0"
...
ds[rtt].last_ds = "0.234"
Pour tracer le graphique, le script ci-dessous est utilisé:
#!/bin/bash # ## change directory to the rrdtool script dir #cd /home/pi/tutos-rrdtool/ping/ ## Graph for last 24 hours /usr/bin/rrdtool graph latency_graph.png \ -w 785 -h 120 -a PNG \ --slope-mode \ --start -86400 --end now \ --font DEFAULT:7: \ --title "ping default gateway" \ --watermark "`date`" \ --vertical-label "latency(ms)" \ --right-axis-label "latency(ms)" \ --lower-limit 0 \ --right-axis 1:0 \ --x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \ --alt-y-grid --rigid \ DEF:roundtrip=pingdb.rrd:rtt:MAX \ DEF:packetloss=pingdb.rrd:pl:MAX \ CDEF:PLNone=packetloss,0,0,LIMIT,UN,UNKN,INF,IF \ CDEF:PL10=packetloss,1,10,LIMIT,UN,UNKN,INF,IF \ CDEF:PL25=packetloss,10,25,LIMIT,UN,UNKN,INF,IF \ CDEF:PL50=packetloss,25,50,LIMIT,UN,UNKN,INF,IF \ CDEF:PL100=packetloss,50,100,LIMIT,UN,UNKN,INF,IF \ LINE1:roundtrip#0000FF:"latency(ms)" \ GPRINT:roundtrip:LAST:"Cur\: %5.2lf" \ GPRINT:roundtrip:AVERAGE:"Avg\: %5.2lf" \ GPRINT:roundtrip:MAX:"Max\: %5.2lf" \ GPRINT:roundtrip:MIN:"Min\: %5.2lf\t\t\t" \ COMMENT:"pkt loss\:" \ AREA:PLNone#FFFFFF:"0%":STACK \ AREA:PL10#FFFF00:"1-10%":STACK \ AREA:PL25#FFCC00:"10-25%":STACK \ AREA:PL50#FF8000:"25-50%":STACK \ AREA:PL100#FF0000:"50-100%":STACK ## copy to the web directory #cp latency_graph.png /var/www/htdocs/
/usr/bin/rrdtool graph latency_graph.png \
Invoque rrdtool est demande la création d'un graphique nommé latency_graph.png dans le répertoire courant.
-w 785 -h 120 -a PNG \
Graphique de 785 pixels de large pour 120 de haut. Image au format PNG. Les dimensions (hauteur et largeur) concernent le graphique ce ne sont pas celles de l'image entière.
--slope-mode \
Lissage des courbes du graphique: antialiasing et courbure des lignes.
--start -3600 --end now \
Définit l'intervalle de temps à tracer: de 3600 secondes antérieures à maintenant.
--font DEFAULT:7: \
Fonte par défaut pour tous les textes du graphique.
--title "ping Sophos" \
--lower-limit 0 \
Définit les valeurs sur l'axe Y pour augmenter la lisibilité. La directive –lower-limit force 0 les étiquettes de l'axe car les valeurs de nos variables ne peuvent pas être négatives.
--right-axis 1:0 \
Rapport entre l'axe parent (à gauche) et l'axe enfant à droite. Même échelle dans notre cas, donc le rapport est définit à 1. Le dernier 0 permet de spécifier une valeur sur cet
--x-grid MINUTE:10:HOUR:1:MINUTE:120:0:%R \
Redéfinit l'échelle de l'axe X et place les labels sous le graphique.
DEF:roundtrip=pingdb.rrd:rtt:MAX \ DEF:packetloss=pingdb.rrd:pl:MAX \
DEF(define), permet de définir une variable provenant de la base de données afin qu'elle puisse être tracée sur le graphique. Ici on définit 2 variables roundtrip et packetloss. Les variables peuvent être récupérées dans différentes bases et subir des traitements.
LINE1:roundtrip#0000FF:"latency(ms)" \
Création d'une ligne et de la légende associée