'

Outils pour utilisateurs

Outils du site


doc:rrdtool

Comprendre rrdtool

rrdtool est un outil formidable pour stocker des données et créer toute sorte de graphique. Je n'essayerai pas de rentrer dans les détails de l'utilisation de l'outil mais tenterai d'expliquer quelques points qui peuvent paraître obscurs et qui m'ont fait gigoter le neurone.

Création

Pour commencer, créons un fichier qui servira ensuite dans les exemples.

Fichier d'exemple

rrdtool create gauge.rrd \
     --start $(date -d'1 march 2010 00:00:00' +%s) \
     --step 300 \
     DS:donnee:GAUGE:600:U:U \
     RRA:MIN:0.5:1:40 \
     RRA:MAX:0.5:1:40 \
     RRA:AVERAGE:0.5:1:40 \
     RRA:MIN:0.5:2:40 \
     RRA:MAX:0.5:2:40 \
     RRA:AVERAGE:0.5:2:40

Le fichier s'appelle gauge.rrd, la première donnée est attendue le 1er mars à 00:00:00 (cette date sera convertie en seconde depuis le 1er janvier 1970 par la commande date). On attend une donnée toutes les 300 secondes soient 5 minutes.

Dans le fichier, nous ne définissons qu'une seule source de données (DS = Data Source) que l'on appelle de manière originale : donnee. Il pourrait y avoir plusieurs DS dans le fichier. GAUGE définit une donnée qui est une valeur à l'instant t (une température, un nombre de personnes dans une salle). Les autres types de données seront expliqués ci-après.

Ensuite, viennent les RRA (Round Robin Archive) que je détaillerai plus loin.

Les types de données

rrdtool connait plusieurs type de données :

  • GAUGE : une température, un nombre de personnes dans un pièce, un taux d'utilisation CPU
  • COUNTER : un compteur comme un nombre de kilomètres parcourus, un nombre d'octets transférés par une interface réseau. Un compteur augmente toujours dans le temps sauf quand il « déborde » (un compteur sur 32 bits passe à 0 après la valeur 4294967295). Si après s'être approché d'un nombre de 32 bits ou 64 bits, le compteur repart de 0 rrdtool le détecte et sait le gérer. La valeur du COUNTER est stockée dans la base comme une valeur par seconde c'est à dire la valeur n - valeur n-1 / le temps entre les 2 valeurs. Exemple : à 14h00, le compteur de la voiture affiche 1200km ; à 14h05, il affiche 1203km ; à 14h05, rrdtool stockera la valeur 1205-1200/300 soient 0.01 (km/s soit 1m/s mais l'unité n'est pas stockée). La vérification de débordement est notamment utile pour les compteurs d'interfaces réseau codés sur 32bits ou 64bits.
  • DERIVE : comme le compteur sans la vérification de débordement.
  • ABSOLUTE : je n'en ai jamais eu l'utilité.
  • COMPUTE : je n'en ai jamais eu l'utilité.

Pour chaque donnée, il est possible de définir un minimum et un maximum. Dans notre exemple, U:U signifie que les minimum et le maximum sont inconnus (Unkown). Si une valeur n'est pas comprise entre minimum et maximum, elle sera considérée comme erronée et « Unknown » sera stocké dans la base.

min, max, average

Lors de la création de la base de données tournante, on définit des RRA (Round Robin Archive). Reprenons l'exemple précédent :

     RRA:MIN:0.5:1:40
     RRA:MAX:0.5:1:40
     RRA:AVERAGE:0.5:1:40
     RRA:MIN:0.5:4:40
     RRA:MAX:0.5:4:40
     RRA:AVERAGE:0.5:4:40

La première base (RRA) contiendra la valeur minimale (MIN), le nombre de valeurs absentes après lequel la donnée devient inconnue, le nombre de points à prendre pour calculer la valeur et le nombre de valeurs.

Avec cette explication, nous voilà bien avancés …

La plupart des informations ci-dessous n'ont de sens que lorsque que rrdtool va dégrader la finesse des données. Dans les 3 premières RRA, on stocke une donnée toutes les 1*300 secondes et on garde 40 données. Ces valeurs couvrent donc 200 minutes.

Dans les 3 RRA suivantes, les choses changent légèrement. Ici, on prend 2 valeurs collectées pour faire un point et on garde 40 points soient 2*300 secondes * 40 c'est-à-dire 400 minutes. rrdtool va donc prendre 2 valeurs pour en faire une seule et c'est là que MIN, MAX et AVERAGE prennent tout leur sens.

Avec MIN, rrdtool stockera le MINimum des 2 valeurs, avec MAX, il stockera le MAXimum des 2 valeurs et avec AVERAGE, il fera la moyenne de ces 2 valeurs. Il est également possible d'utiliser LAST pour ne garder que la dernière valeur de la série (utilité ?).

Exemple avec notre fichier mis à jour avec les valeurs :

$ rrdtool update gauge.rrd \
        $(date -d'1 march 2010 00:05' +%s):100 \
        $(date -d'1 march 2010 00:10' +%s):0 \
        $(date -d'1 march 2010 00:15' +%s):100 \
        $(date -d'1 march 2010 00:20' +%s):0 \
        [...]

Pour automatiser la mise jour, peut utiliser une boucle en BASH avec la commande seq pour incrémenter les valeurs.

i=0
modulo=200
add=100
for temps in $(seq $(date -d'1 march 2010 00:05:00' +%s) 300 $(date -d'1 march 2010 23:59:00' +%s))
do
    rrdtool update gauge.rrd $temps:$(($i%$modulo))
    i=$(($i+$add))
done

Pour la série définie par RRA:MIN:0.5:2:10, rrdtool stockera :

$ rrdtool dump gauge.rrd
[...]
<!-- 2010-03-01 17:20:00 CET / 1267460400 --> <row><v>0.0000000000e+00</v></row>
<!-- 2010-03-01 17:30:00 CET / 1267461000 --> <row><v>0.0000000000e+00</v></row>
<!-- 2010-03-01 17:40:00 CET / 1267461600 --> <row><v>0.0000000000e+00</v></row>
[...]

Pour chaque duo de données, rrdtool a gardé la plus petite.

Pour la série RRA:MAX:0.5:2:10 :

$ rrdtool dump gauge.rrd
[...]
<!-- 2010-03-01 17:20:00 CET / 1267460400 --> <row><v>1.0000000000e+02</v></row>
<!-- 2010-03-01 17:30:00 CET / 1267461000 --> <row><v>1.0000000000e+02</v></row>
<!-- 2010-03-01 17:40:00 CET / 1267461600 --> <row><v>1.0000000000e+02</v></row>
<!-- 2010-03-01 17:50:00 CET / 1267462200 --> <row><v>1.0000000000e+02</v></row>
[...]

Pour la série RRA:AVERAGE:0.5:2:10 :

$ rrdtool dump gauge.rrd
[...]
<!-- 2010-03-01 17:20:00 CET / 1267460400 --> <row><v>5.0000000000e+01</v></row>
<!-- 2010-03-01 17:30:00 CET / 1267461000 --> <row><v>5.0000000000e+01</v></row>
<!-- 2010-03-01 17:40:00 CET / 1267461600 --> <row><v>5.0000000000e+01</v></row>
<!-- 2010-03-01 17:50:00 CET / 1267462200 --> <row><v>5.0000000000e+01</v></row>
[...]

La définition des RRA est fondamentale car c'est de là que découle toutes les données stockées dans les fichiers rrd. Quand on a bien compris cela, on évite de perdre du temps à interpréter de mauvaises données ;-).

Je n'ai pas présenté le cas mais si 0.5 donnée avait été absente (donc 1 sur 2 dans l'exemple), le résultat de MIN, MAX ou AVERAGE auraient été des valeurs inconnues (UNKNOWN).

Mise à jour de la base

Là encore, il peut y avoir un piège ;-). Dans le fichier d'exemple ci-dessus, rrdttool attend une valeur toutes les 5 minutes à la seconde près : 00:00:00, 00:05:00, 00:10:00, …, 03:00:00, etc. Que se passe-t-il si une valeur est entrée à 00:11:15 ? rrdtool prendra cette valeur mais va l'interpoler et le résultat risque de ne pas être ce que vous attendez …

En effet, si à 00:11:15, vous donnez la valeur 10 à rrdtool, il conservera la valeur 9,xx.

Rien de mieux qu'un exemple en créant le même fichier que précédemment mis à jour avec les mêmes valeurs mais décalées d'une minute (alternativement 10 et 2) :

rrdtool update gauge.rrd \
        $(date -d'1 march 2010 00:06' +%s):10 \
        $(date -d'1 march 2010 00:11' +%s):2 \
        $(date -d'1 march 2010 00:16' +%s):10 \
        $(date -d'1 march 2010 00:21' +%s):2 \

ce qui nous donne avec une boucle :

i=0
modulo=2
add=1
for temps in $(seq $(date -d'1 march 2010 00:06:00' +%s) 300 $(date -d'1 march 2010 03:25:00' +%s))
do
    if [ $(($i%$modulo)) == 0 ]
    then
        nb=2
    else
        nb=10
    fi
    echo rrdtool update gauge.rrd $temps:$nb
    rrdtool update gauge.rrd $temps:$nb
    i=$(($i+$add))
done

Si on extrait les données, on obtient d'autres valeurs qui sont le résultat du traitement de rrdtool :

$ rrdtool dump gauge.rrd
[...]
<!-- 2010-03-01 00:05:00 CET / 1267398300 --> <row><v>2.0000000000e+00</v></row>
<!-- 2010-03-01 00:10:00 CET / 1267398600 --> <row><v>8.4000000000e+00</v></row>
<!-- 2010-03-01 00:15:00 CET / 1267398900 --> <row><v>3.6000000000e+00</v></row>
<!-- 2010-03-01 00:20:00 CET / 1267399200 --> <row><v>8.4000000000e+00</v></row>
<!-- 2010-03-01 00:25:00 CET / 1267399500 --> <row><v>3.6000000000e+00</v></row>
<!-- 2010-03-01 00:30:00 CET / 1267399800 --> <row><v>8.4000000000e+00</v></row>
[...]

Pour rrdtool, s'il y avait 10 personnes dans la pièce à 00:11:00 et 2 à 00:16:00, il y en avait 8,4 à 00:10:00 et 3,6 à 00:15:00. Quand on compte des personnes, un chiffre à virgule est toujours gênant, la personne est dans la pièce, ou pas. C'est l'interprétation mathématique de rrdtool.

Pour éviter les virgules, il faut donc bien faire attention à la date de la première valeur et aux dates de mises à jour prévues. Dans la plupart des cas d'utilisation de rrdtool ce comportement n'est pas gênant … quand on le connaît !

rrdtool, dessine-moi un graphique

Avec les valeurs de début et de fin choisies, rrdtool peut utiliser les valeurs sur 5 minutes :

    rrdtool graph rrd_05min.png \
        --start $(date -d'1 march 2010 20:35' +%s) \
        --end $(date -d'1 march 2010 23:55' +%s) \
        --width 800 \
        --height 200 \
        DEF:ds0min=gauge.rrd:donnee:MIN \
        DEF:ds0max=gauge.rrd:donnee:MAX \
        DEF:ds0avg=gauge.rrd:donnee:AVERAGE \
        LINE2:ds0max#FF0000:"max 5 min " \
        GPRINT:ds0max:MIN:"Min\: %6.2lf " \
        GPRINT:ds0max:AVERAGE:"Avg\: %6.2lf " \
        GPRINT:ds0max:MAX:"Max\: %6.2lf " \
        GPRINT:ds0max:LAST:"Last\: %6.2lf \l" \
        LINE2:ds0avg#00FF00:"moy 5 min " \
        GPRINT:ds0avg:MIN:"Min\: %6.2lf " \
        GPRINT:ds0avg:AVERAGE:"Avg\: %6.2lf " \
        GPRINT:ds0avg:MAX:"Max\: %6.2lf " \
        GPRINT:ds0avg:LAST:"Last\: %6.2lf \l" \
        LINE2:ds0min#0000FF:"min 5 min " \
        GPRINT:ds0min:MIN:"Min\: %6.2lf " \
        GPRINT:ds0min:AVERAGE:"Avg\: %6.2lf " \
        GPRINT:ds0min:MAX:"Max\: %6.2lf " \
        GPRINT:ds0min:LAST:"Last\: %6.2lf \l"

Les opération MIN, MAX, AVERAGE et LAST concernent la série, le RRA. Dans la légende, on affichera donc le MIN de la série de données qui contient les MAX, la moyenne (AVG) des MAX, le MAX du MAX et la dernière valeur du MAX. Comme décrites auparavant, les 3 courbes se superposent car tous les calculs sont faits sur une seule valeur.

Dans cet exemple, rrdtool utilisera les données sur 10 minutes car il n'a pas stocker suffisamment de données sur 5 minutes. Les MIN, MAX et AVG sont donc calculés sur 2 valeurs. Dans la légende, on affiche de nouveau le MIN, MAX, AVG et LAST de chaque série MIN, MAX, AVG.

    rrdtool graph rrd_10min.png \
        --start $(date -d'1 march 2010 17:20' +%s) \
        --end $(date -d'1 march 2010 23:50' +%s) \
        --width 800 \
        --height 200 \
        DEF:ds1min=gauge.rrd:donnee:MIN \
        DEF:ds1max=gauge.rrd:donnee:MAX \
        DEF:ds1avg=gauge.rrd:donnee:AVERAGE \
        LINE2:ds1max#FF0000:"max 10 min" \
        GPRINT:ds1max:MIN:"Min\: %6.2lf " \
        GPRINT:ds1max:AVERAGE:"Moy\: %6.2lf " \
        GPRINT:ds1max:MAX:"Max\: %6.2lf \l" \
        LINE2:ds1avg#00FF00:"moy 10 min" \
        GPRINT:ds1avg:MIN:"Min\: %6.2lf " \
        GPRINT:ds1avg:AVERAGE:"Moy\: %6.2lf " \
        GPRINT:ds1avg:MAX:"Max\: %6.2lf \l" \
        LINE2:ds1min#0000FF:"min 10 min" \
        GPRINT:ds1min:MIN:"Min\: %6.2lf " \
        GPRINT:ds1min:AVERAGE:"Moy\: %6.2lf " \
        GPRINT:ds1min:MAX:"Max\: %6.2lf \l"

Pour terminer, si on souhaite afficher un graphe de 2000 points, le graphique devra faire au moins 2000 pixels… sinon rrdtool ne pourra pas afficher tous les points. Pour afficher un graphe qui contient plus de points que de pixels, rrdtool agrège les données comme il le fait dans le stockage des données.


Le 22/11/2011 – Sylvain Collilieux – Ce texte est sous licence Creative Commons Attribution

Vos remarques, vos questions, vos commentaires

meziani, Le 04/07/2012 à 12:38

bonjour, je voulais s'avoir comment adapter rrdtool avec cyguin pour travailler sous windows 7 s'il vous plais.Emphase forte (gras)

Sylvain Collilieux, Le 15/07/2012 à 23:11

Bonjour, je n'en ai aucune idée mais sur la page de téléchargement de rrdtool, il y a visiblement des pistes.

Pjörg, Le 26/09/2013 à 16:45

Bonjour, concernant ton problème meziani, tu peux télécharger une version de RRDTool pour Windows à l'adresse http://www.cacti.net/downloads/rrdtool/win32/ . Il s'utilise en ligne de commande. J'ai trifouillé quelques tutoriels pour réussir produire des graphiques. Mais j'aimerais savoir s'il est possible d'effectuer des mises à jour de la base de données .rrd à partir du PHP associé à MySQL.

Moi, Le 03/05/2015 à 18:11

Bonjour , je voudrais créer une BD pour un comptage d'eau j'envoie donc de temps en temps (1 impulsion qui équivaut a 100 litres d'eau ), j’étais partie sur COUNTER , est ce la bonne solution et comment bien renseigné les RRA je suis partie sur ça mais j'ai l'impression que ca ne colle pas RRD heartbeat=600 RR Dmin=0 RRD max=12500000 RRA:AVERAGE:0:360:576 RRA:AVERAGE:0:30:576 RRA:AVERAGE:0:7:576 RRA:AVERAGE:0:1:576 RRA:MIN:0:360:576 RRA:MIN:0:30:576 RRA:MIN:0:7:576
RRA:MAX:0:360:576 RRA:MAX:0:30:576 RRA:MAX:0:7:576

doc/rrdtool.txt · Dernière modification: Le 30/05/2017 à 11:21 par sylvain