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):
ppp in
ppp out
Load Average de mon pc Linux:
load 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 )