www.suinot.org

Dans le doute, reboot. Si ça rate, reformate ! [ devise Windows ]

Accueil > Linux > Graphes rrdtool partie 1

Graphes rrdtool partie 1

vendredi 1er février 2019, par Rémi

Comme vous avez pu remarquer, il y a une page de graphique de surveillance sur le serveur. Je les obtient avec plusieurs récupérations des données (1-wire, snmp, ...) et je graphe le tout avec rrdtool. J’ai pas mal galéré pour y arriver, entre autre parce que sur le orange-pi, la base de données rrd ne voulait pas se remplir.
Je place ici les scripts de création et de mise à jour des données.
On commence par un truc simple : les sondes 1-wire :

  1. Création
#!/bin/bash

cd /var/www/graphs/
rrdtool create temperature-1wire.rrd \
        --start N \
        --step 600 \
        DS:temperature-ventil:GAUGE:900:-30:50 \
        DS:temperature-ext:GAUGE:900:-30:50 \
        RRA:MIN:0.5:12:1440 \
        RRA:MAX:0.5:12:1440 \
        RRA:AVERAGE:0.5:1:1440 \

Je crée la base dès maintenant "—start N" et la récupération devra se faire toutes les 600 secondes.
Le DS, c’est le nom de la valeur à grapher, je l’ai appelé "temperature-ventil", GAUGE, c’est le type de la valeur (cf. man rrdtool), 900 c’est le temps maximal avant de mettre la valeur suivante à "Nan" (nul) donc ici, je peux récupérer au maximum dans un interval de 600 à 900 secondes.
Ensuite, j’ai une deuxième sonde, donc même principe. Seul le nom change.
Et pour finir, les RRA. La c’est plus complexe, c’est la façon de garder les données. Mais je vous propose de vous reporter au man de rrdtool.
A présent, la base rrd est la, il faut l’alimenter.

  1. Update
#!/bin/bash

sonde_ventilation="/media/1wire/28.006E8E040000/temperature"
sonde_externe="/media/1wire/28.02CFA5020000/temperature"

cd /var/www/graphs/

BASE="/var/www/graphs/temperature-1wire.rrd"

temperature1=$(cat $sonde_ventilation)
temperature1=${temperature1:0:4}

temperature2=$(cat $sonde_externe)
temperature2=${temperature2:0:4}
/usr/bin/rrdtool update $BASE N:$temperature1:$temperature2

Mon script (améliorable mais il fait son boulot), interroge les sondes via un montage par fusefs. J’ai une tache cron qui l’appel régulièrement :

*/10 * * * * /usr/local/bin/lecture-1wire.sh >/dev/null 2>&1

La fréquence d’appel pour alimenter la base rrd est importante !!! Sinon, vous risquez de ne pas comprendre pourquoi votre base ne s’alimente pas... (non non ce n’est pas du vécu).
Le plus important, c’est la ligne
rrdtool update
$BASE => nom de la base rrd
N :$temperature1 :$temperature2 => N pour indiquer que l’on a une valeur maintenant (now) puis les valeurs des sondes dans l’ordre ou elles ont été créé dans la base.

C’est tout ? Bah, oui ! On peut changer des paramètres, mais pour moi, ça suffit. Ah, oui, le graphique !

  1. Graphique
#!/bin/bash

cd /var/www//graphs/
BASE="/var/www/graphs/temperature-1wire.rrd"

# Noms des DS utilisé dans la base rrd
Temp_V="temperature-ventil"
Temp_E="temperature-ext"

#pour 1 jour
rrdtool graph graph_temperature-1j.png \
        -a PNG \
       --start -86400 --end Now \
        --vertical-label "°C" \
       --width 800 \
       --height 180 \
        --title="Temperatures sur un jour" \
       --color CANVAS#c1c1c1 \
        --color BACK#333333 \
       --color FONT#C0C0C0 \
       --color MGRID#EFECCA \
       --color GRID#A7A37E \
       --color FRAME#808080 \
       --color ARROW#FFFFFF \
       --color SHADEA#404040 \
       --color SHADEB#404040 \
        DEF:probe1=$BASE:$Temp_V:AVERAGE \
        DEF:probe2=$BASE:$Temp_E:AVERAGE \
        LINE1:probe1#FF0000:"Ventilation" \
        LINE1:probe2#0400FF:"Maison" \
        GPRINT:probe1:LAST:"Temperature ventilation \: %2.1lf C" \
        GPRINT:probe2:LAST:"Temperature maison \: %2.1lf C \r"  

#pour 1 semaine
rrdtool graph graph_temperature-1s.png \
        -a PNG \
       --start -604800 --end Now \
        --vertical-label "°C" \
       --width 800 \
       --height 180 \
        --title="Temperatures sur une semaine" \
       --color CANVAS#c1c1c1 \
        --color BACK#333333 \
       --color FONT#C0C0C0 \
       --color MGRID#EFECCA \
       --color GRID#A7A37E \
       --color FRAME#808080 \
       --color ARROW#FFFFFF \
       --color SHADEA#404040 \
       --color SHADEB#404040 \
        DEF:probe1=$BASE:$Temp_V:AVERAGE \
        DEF:probe2=$BASE:$Temp_E:AVERAGE \
        LINE1:probe1#FF0000:"Ventilation" \
        LINE1:probe2#0400FF:"Maison" \
        GPRINT:probe1:LAST:"Temperature ventilation \: %2.1lf C" \
        GPRINT:probe2:LAST:"Temperature maison \: %2.1lf C \r"  

La création des graphique est en deux parties : un graphique pour les remontées sur un jour, et un pour 1 semaine.
La différence entre les deux ce situe au niveau du "—start ". L’un commence à 1 semaine , l’autre à 24h (les mesures sont en secondes). Pour le reste, c’est assez clair (je trouve). Les couleurs sont de type ’couleur web’. Reste la fin (les 6 dernières lignes) :
DEF : Cela défini notre line à afficher. le nom suivant sert au ligne suivante, c’est comme un alias, j’ai mis probe1 comme beaucoup d’exemples, $BASE= la base de données, $Temp_V, le nom de notre DS, et AVERAGE, le type de données pour faire les points.
Ligne suivante idem, mais l’autre sonde.
On continu : LINE1= LINE parce-que c’est une ligne et 1 pour l’épaisseur (on peut mettre 0.5 ou 1,8....), probe1 notre alias, #FF0000 la couleur de la courbe, et pour terminer, le nom de la courbe. Ligne suivante, pour la seconde courge, même principe, la couleur n’est pas la même, et l’alias non plus.
Et pour finir, le GPRINT correspond aux informations que l’on place en bas du graphique. Donc, pour le premier GPINT, nous faisons référence à notre premier alias, ce sera la dernière valeur indiquée avec comme texte "Température ventilation :" et le %2.1lf est la façon dont on affiche la valeur (pour les habitué du C, c’est le même format que la fonction print). Donc ici, la valeur numérique LAST (la dernière) est affiché avec un chiffre après la virgule.

Voila ! J’espère que vous aurez appris quelque chose !
Dans un prochain article, je n’indiquerai que les script avec beaucoup moins d’explications.