RRDTool et le «flaming», ou comment grapher «Beau»
Flaming ??
Le flaming, c'est une technique de tuning, utilisé principalement dans
le milieu automobile. Cela consiste a dessiner des flammes sur la
carrosserie d'une voiture... Mais alors, quel rapport avec rrdtool
??
Tout bêtement, je trouvais les graphiques sortis par rrdtool, certes
mieux que ceux de mrtg, mais quand même vilains. En naviguant un peu
sur le net, j'ai aperçu un graphe, fait avec rrdtool fabuleux: une
"flamme" de transfert réseau! J'ai alors décidé de faire la même
chose, et d'expliquer comment faire pour avoir une joli flamme très
simplement sur n'importe lequel de vos graphiques rrdtool.
Le résultat avant tout :-)
Voici quelques graphes, que j'ai choisi de présenter en statique, au
cas ou mes statistiques ne soient plus accessibles, un jour...
Utilisation de ma connexion Internet ADSL (512/128):
Load Average de mon pc Linux:
La technique, qui n'est pas si technique
Pour commencer, il vous faudra une base, avec des DS valide, et des
données dedans, cela va de soit. Si vous ne savez pas ce qu'est un DS,
ou qu'une base rrd, allez voir mon introduction à rrdtool.
Amorçons les choses sérieuses, imaginons que nous ayons une base
rrdtool représentant le load average sur 5 minutes d'un PC sous
linux. Voici le modèle que je propose:
$ rrdtool create load.rrd \ DS:1min:ABSOLUTE:600:U:U \ DS:5min:ABSOLUTE:600:U:U \ DS:10min:ABSOLUTE:600:U:U \ RRA:AVERAGE:0.5:1:600 \ RRA:AVERAGE:0.5:6:700 \ RRA:AVERAGE:0.5:24:775 \ RRA:AVERAGE:0.5:288:797 \ RRA:MAX:0.5:1:600 \ RRA:MAX:0.5:6:700 \ RRA:MAX:0.5:24:775 \ RRA:MAX:0.5:288:797
Maintenant, il faut remplir la base... Rien de plus simple, je propose un script "local", faute d'un article sur snmp pour expliquer un peu comment faire avec ce protocole fabuleux. Je promet d'ailleurs d'en dire quelques mots sur le site!
#!/bin/sh load=`cat /proc/loadavg` a=$(( `echo \`echo $load | cut -f1 -d' '\` \* 100 | bc | cut -f1 -d.` * 3 )) b=$(( `echo \`echo $load | cut -f2 -d' '\` \* 100 | bc | cut -f1 -d.` * 3 )) c=$(( `echo \`echo $load | cut -f3 -d' '\` \* 100 | bc | cut -f1 -d.` * 3 )) /usr/bin/rrdtool update /var/www/load.rrd N:$a:$b:$c
Bien entendu, il faudra remplacer le path vers rrdtool pour l'adapter
à vôtre distribution (avec which rrdtool pour savoir le path
exact). Il faudra aussi changer le path vers la base .rrd...
Lancez ce script toute les 5 minutes, grâce a une simple règle cron,
avec un utilisateur ayant droit de modifier la base .rdd. Ouvrez le
fichier cron de l'utilisateur de vôtre choix, à l'aide de la commande
suivante:
$ crontab -u votreutilisateur -e
Il ne vous reste plu qu'a rajouter une entrée au fichier de crontab:
*/5 * * * * /path/vers/votre/script.sh >/dev/null 2>&1
La encore, vous ne pourrez pas bêtement faire un copier coller, il
faudra mettre un peu les mains dans le cambouis, et changer le path
vers le script d'update de la base .rrd. Le «/dev/null 2>&1» est la
pour empêcher le script de retourner une erreur, et donc vous infliger
un mail de cron (parce-que par exemple, si vous êtes en vacances, et
que le script se met a retourner une erreur, pendent 1 mois, a raison
de 1 mail toute les 5 minutes, cela fait tout de même 8640 mails
identiques d'erreurs...)
Aller, on y est presque, c'est la dernière ligne droite vers la
sortie... du graphique enflammé!
Je vous propose alors mon script permettant de sortir le
graphique:
#!/bin/sh # script créer par ed <ed@debian-fr.org> édité sous licence GPL. # http://old.ed.zehome.com/ ################################################ # Configuration RRDARCHIVE="/var/www/rrd/load.rrd" # .png IS ADDED AFTER. # ${GRAPH}-day -week -month -year will be created GRAPH="/var/www/rrd/load.equinoxe" GRAPHTITLE="Load Average Linux" # ################################################ ################################################ # Graph Load Linux for i in -86400 -604800 -2592000 -31536000 do if [ $i == -86400 ] then GRAPH2="${GRAPH}-day.png" fi if [ $i == -604800 ] then GRAPH2="${GRAPH}-week.png" fi if [ $i == -2592000 ] then GRAPH2="${GRAPH}-month.png" fi if [ $i == -31536000 ] then GRAPH2="${GRAPH}-year.png" fi /usr/bin/rrdtool graph "${GRAPH2}" \ --start ${i} \ --vertical-label "Load Average" \ --title "${GRAPHTITLE}" -w 800 -h 180 -u "load" \ --units-exponent 0 --imgformat PNG \ --color CANVAS#000000 \ --color BACK#101010 \ --color FONT#ffffdf \ --color MGRID#337fbf \ --color GRID#615900 \ --color FRAME#808080 \ --color ARROW#FF0099 \ --color SHADEA#000000 \ --color SHADEB#000000 \ DEF:5min=${RRDARCHIVE}:5min:AVERAGE \ CDEF:flaming1=5min,40,*,100,/ \ CDEF:flaming2=5min,5,*,100,/ \ COMMENT:"\n" \ COMMENT:"Utilisation CPU: " \ COMMENT:"Maximum Minimum Moyenne Dernier\n" \ AREA:flaming1#ffff5f:"Utilisation CPU " \ STACK:flaming2#fffc51 \ STACK:flaming2#fffc51 \ STACK:flaming2#fff046 \ STACK:flaming2#ffe95f \ STACK:flaming2#ffd237 \ STACK:flaming2#ffc832 \ STACK:flaming2#ffbe2d \ STACK:flaming2#ffaa23 \ STACK:flaming2#ff9619 \ STACK:flaming2#ff841e \ STACK:flaming2#ff841e \ STACK:flaming2#ff6600 \ GPRINT:5min:MAX:"%6.2lf %s " \ GPRINT:5min:MIN:"%6.2lf %s " \ GPRINT:5min:AVERAGE:"%6.2lf %s " \ GPRINT:5min:LAST:"%6.2lf %s " done # Fin du script Load Linux. ################################################ # End of script.
Mais non ne partez pas tous, c'est pas si compliqué que ça!!
Je ne reviendrais par contre pas sur tout ce qui est graphique pur,
que j'ai expliqué dans mon introduction aux outils
rrdtool.
Que fais le script ?
Tout simplement, j'ai créer une boucle de 4 valeurs négatives,
représentant: 1 jour, 7 jours, 30 jours, et 365 jours. En ayant lu mon
intro aux rrdtools, vous comprendrez pourquoi ces valeurs sont
négatives. J'ai utilisé quelques conditions pour nommer correctement
les graphes, en fonction de l'échelle représentée. Soit Day, Week,
Month et Year.
Passons à la partie flaming pure.
Quelle méthode mathématique pour enflammer le graphe?
Si je puis parler de «méthode» mathématique, il s'agit tout simplement
d'un bête pourcentage!
En effet, le CDEF «flaming1» correspond a 40% du graphe. On va donc
dessiner d'une couleur choisie (ici jaune, donc) 40% de la valeur
recherchée avec une «AREA».
Jusque ici rien de bien sorcier. Le CDEF «flaming2» correspond quand à
lui a 5% de la valeur recherchée. Il faudra donc superposer 60% du
graphique manquant, par dessus les 40% dessinés en jaune par l'AREA
flaming1.
60% c'est a dire 12 fois 5%, donc 12 stack. Apres, il suffit de faire un
dégradé de couleur (ce qui n'est pas du-tout évident... J'ai
personnellement utilisé «The Gimp» pour m'aider un peu ;-)
Les GPRINT et COMMENT servent juste à afficher quelques statistiques
supplémentaires, sous forme de texte.
Et bien voilà, vous savez désormais comment faire de magnifiques
graphiques rrdtool un peu "tunés" :-))
Si vous faites des choses jolies, grâce à mon "tutoriel", faites moi
un peu plaisir, et envoyez moi un mail avec les graphiques sortis, je
ferais sûrement une galerie de graphes :o)
Amusez vous bien!!
Questce qu'on peut faire avec ce joli tuto ?
Voici une liste de site qui ont utilisé mon tuto flaming pour rrdtool:XHTML 1.1 strict. Design & code par Laurent Coustet (générée en 0.000128s )