Outils pour utilisateurs

Outils du site


app:rrdtool:ping-graph

Graph du ping

Synopsis

Exemple de construction d'un graphique a partir du jeu de résultats retourné par la commande ping avec RRDtool.

A propos du graphique

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.

Le répertoire de travail

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.

Etape 1/3 Initialisation de la base RRD

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

Détail des directives rrdtool

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 pour Data Set, déclaration de la première variable que l'on nomme pl de type GAUGE c'est à dire valeur brute directement insérée dans la base sans traitement/calcul supplémentaire.
  • 120 délai max de validité pour l'insertion (watchdog ou heartbeat timeout). Si la données n'est pas collectée dans un délai max 120 secondes toutes les heures, une valeur par nulle est insérée pour cet enregistrement de type DS dans la base. Ce timout est important il permet de relever que le système est en incapacité de fournir la donnée pour une quelconque raison (traitements prioritaires, reboot etc). Les données manquantes seront présentées sur notre graphique en zone blanches (discontinuité sur la courbe).
  • 0 valeur minimale acceptée pour l'enregistrement. Comme la variable correspond à des pertes de paquets exprimées en pourcentage la valeur minimale est 0
  • 100 valeur max acceptée pour l’enregistrement. Comme la variable correspond à des pertes de paquets exprimées en pourcentage la valeur maximale est 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 \
  • RRA pour Round Robin Archive elle décrit la structure de la base: combien de valeurs seront archivées et sur combien de temps.
  • MAX normalement consolide en conservant la valeur max dans notre cas un seul relevé est fait par variable, sa valeur ne sera pas modifiée ou moyennée.
  • 0.5 valeur interne de résolution et ne devrait pas être changée.
  • 1 définit combien de relevés doivent être moyennés avant stockage en base. On souhaite ici que la valeur soit stockée telle qu'elle.
  • 1500 le nombre d'enregistrement de la base. Comme nous avons un enregistrement toutes les minutes (–step=60) ca nous donne une période d'enregistrement de 1500*60 = 90000 secondes ce qui équivaut a 90000/3600 = 25 heures. C'est une bonne granularité qui permettra d'avoir une vision correcte de l’évolution de ces paramètres.

Etape 2/3 Collecte périodique des données

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 ':'.

Avant d'utiliser le script, vérifier le chemin des utilitaires et du répertoire de travail. Le script utilise des chemins absolus car cron peut avoir un path plus restreint que l'utilisateur.

Création du job cron

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

Étape 3/3 Construction du graphique

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é:

mk_graph_daily.sh
#!/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/

Détail des directives

/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.

  • MINUTE:10 définit la distance en unités entre les repères verticaux gris
  • HOUR:1 définit la distance en unités entre les repères verticaux rouges
  • MINUTE:120 les labels sont visibles toutes les 120 unités.
  • 0:%R espacement par défaut
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.

  • DEF directive de définition
  • roundtrip=roundtrip=pingdb.rrd:rtt assignation des valeurs de rrt dans la base pingdb.rrd à la variable rountrip
  • MAX type de la variable tel qu'il a été déclaré dans la base.
LINE1:roundtrip#0000FF:"latency(ms)" \

Création d'une ligne et de la légende associée

  • LINE1 tracer une ligne le suffixe 1 permet de spécifier l'épaisseur. Si la ligne générée semble discontinue a cause du lissage augmenter la valeur du suffixe.
  • roundtrip#0000FF utilise la valeur de la variable roundtrip avec la couleur bleue (valeur RVB #RRVVBB)
  • “latency(ms) label associé à la ligne.

Références

app/rrdtool/ping-graph.txt · Dernière modification : 2021/02/01 21:51 de 127.0.0.1