====== rrd ====== Lien: *http://tobi.oetiker.ch/ *http://oss.oetiker.ch/rrdtool/tut/rrdtutorial.en.html *http://reseau.univ-aix.fr/doctech/rrdtool.pdf ===== rrdtool ===== ==== Install ==== # aptitude install rrdtool ===== Exemple ===== ==== creer ==== Quelque part... $ rrdtool create test.rrd --start 920804400 DS:speed:COUNTER:600:U:U RRA:AVERAGE:0.5:1:24 RRA:AVERAGE:0.5:6:10 | **''test.rrd''** | We created the round robin database called test (test.rrd) | | **''--start 920804400''** | 7th of March, 1999 (this date translates to 920'804'400) => time(NULL) ! | | **''DS:speed:COUNTER:600:U:U''** | Our database holds one data source (DS) named "speed" that represents a counter. This counter is read every five minutes (this is the default therefore you don't have to put --step=300) | | **''RRA:AVERAGE:0.5:1:24''** | In the same database two round robin archives (RRAs) are kept, one averages the data every time it is read (e.g., there's nothing to average) and keeps 24 samples (24 times 5 minutes is 2 hours) | | **''RRA:AVERAGE:0.5:6:10''** | The other averages 6 values (half hour) and contains 10 such averages (e.g. 5 hours) | $ ls -lart -rw-r--r-- 1 thierry thierry 1008 aoû 16 14:51 test.rrd La data "--start" est facultative ! A defaut, c'est la date actuelle. === DS === Syntaxe: **''DS:Nom:Type:Heartbeat:Min:Max''** | DS | Data Source | | Nom | libre choix | | Type | COUNTER ou GAUGE ou DERIVE ou ABSOLUTE | | Heartbeat | intervalle de temps au bout duquel une donnée est considérée comme "unknown" | | Min | valeur minimum. En dessous, la valeur est stockée "unknown". **''U''** => pas de minimum | | Max | valeur maximum. (garde-fou) **''U''** => pas de maximum | **''COUNTER''** c'est pour des valeurs qui s'incremente dans le temps, comme par exemple: - une distance (compteur de kilometres...) - une quantité (compteur d'octets transmis/recus...) **''GAUGE''** c'est pour des valeurs occilantes dans le temps, comme par exemple: - une temperature - une quantité (nombre de process, mémoire occupé, place disque) Les autres "type" sont plus rares. === RRA === Pour chaque DS, on créé un certain nombre d'archives **''RRA''**. Syntaxe: **''RRA:CF:XFF:STEPS:ROWS''** | CF | facteur de consolidation entre plusieurs mesures: AVERAGE, MAX, MIN, LAST (la moyenne, le max, le min ou la dernière mesure) | | XFF | pourcentage de points acceptables. sinon unknown. "0.5" est souvent l'usage | | STEPS | ou "pdp_per_rows" (pourcentage de point par rangée). combien de mesure pour faire une donnée | | ROWS | Nombre de valeurs a garder | ==== remplir ==== Il parait qu'on rentre des "Kilometres", mais en fait, "rrd" s'en moque un peu... Remplissons la base de donnée comme suit: $ rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363 $ rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373 $ rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399 $ rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415 $ rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423 Retrouvons les données: $ rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200 speed 920804700: nan 920805000: 4.0000000000e-02 920805300: 2.0000000000e-02 920805600: 0.0000000000e+00 920805900: 0.0000000000e+00 920806200: 3.3333333333e-02 920806500: 3.3333333333e-02 920806800: 3.3333333333e-02 920807100: 2.0000000000e-02 920807400: 2.0000000000e-02 920807700: 2.0000000000e-02 920808000: 1.3333333333e-02 920808300: 1.6666666667e-02 920808600: 6.6666666667e-03 920808900: 3.3333333333e-03 920809200: nan 920809500: nan Cela est correct: 12357-12345 = 12 12:10 - 12:05 = 5 Attention: - "rrd" ne connait pas les "KM" - l'unité de temps est la seconde ! Donc: 5*60 = 300 secondes Soit: (12357-12345) / ( 5*60 ) => 12/300 => 0.040 C'est bien ça: 920805000: 4.0000000000e-02 ==== graphique ==== === graph "40 m" === Creation de graphique: $ rrdtool graph speed.png --start 920804400 --end 920808000 DEF:myspeed=test.rrd:speed:AVERAGE LINE2:myspeed#FF0000 {{:speed.png|}}\\ Fameux... Expliquons vite: | ''--start / --end'' | periode de temps a considerer | | **''DEF:myspeed=test.rrd:speed:AVERAGE''** | definition d'une "variable" "myspeed" en utilisant le "RRA" speed | | **''LINE2:myspeed#FF0000''** | Tracé avec une epaisseur de "2" (points?) , et en rouge | On peut donc changé la couleur... huhuhu | :!: | 40 m signifie "40 milli" | 0.040 => 40/1000 => 40 m === Autre forme === $ rrdtool graph speed.png --start 920804400 --end 920808000 --vertical-label m/s DEF:myspeed=test.rrd:speed:AVERAGE CDEF:realspeed=myspeed,1000,\* LINE2:realspeed#FF0000 {{:speed2.png|}} On a ajouté un "label" vertical, et appliqué un petit calcul dans une nouvelle variable, afin de la tracer. En ajoutant un label, et multipliant par "1000", on ne modifie que la présentation, notamment et faisant disparaitre le "m". "CDEF" semble signifier une definition par un calcul. | **''CDEF:realspeed=myspeed,1000,\*''** | The calculations are specified in the CDEF part above and are in Reverse Polish Notation ("RPN"). What we requested RRDtool to do is: "take the data source myspeed and the number 1000; multiply those" | Cela aurait été different si on avait entré comme données des "metres" au lieu de "kilomètres"... mais c'est pour illuster. === Encore == $ rrdtool graph speed.png --start 920804400 --end 920808000 --vertical-label km/s DEF:myspeed=test.rrd:speed:AVERAGE "CDEF:kmh=myspeed,3600,*" CDEF:fast=kmh,100,GT,kmh,0,IF CDEF:good=kmh,100,GT,0,kmh,IF HRULE:100#0000FF:"Maximum allowed" AREA:good#00FF00:"Good speed" AREA:fast#FF0000:"Too fast" {{:speed3.png|}}\\ Waouh! Explications: == CDEF:fast=kmh,100,GT,kmh,0,IF == C'est du polonais ;-) \\ (((kmh,100)GT),kmh,0)IF GT => Greater than *( kmh, 100 ) GT => kmh > 100 ? Soit: "kmh est-il plus grand que 100 ?" ( GT= greater than) *( x, y, z ) IF => si "x" alors retourne "y" sinon "z" Donc: (((kmh,100)GT),kmh,0)IF Si "kmh" est plus grand que "100", alors retourner "kmh" Sinon, si "kmh" est plus petit ou egale a "100", alors retourner "0" == CDEF:good=kmh,100,GT,0,kmh,IF == C'est l'inverse de la précédente. Si "kmh" est plus grand que "100", alors retourner "0", sinon "kmh" . C'est simple le polonais ^_^ === Encore et encore === $ rrdtool graph speed4.png \ --start 920804400 --end 920808000 \ --vertical-label km/h \ DEF:myspeed=test.rrd:speed:AVERAGE \ "CDEF:kmh=myspeed,3600,*" \ CDEF:fast=kmh,100,GT,100,0,IF \ CDEF:over=kmh,100,GT,kmh,100,-,0,IF \ CDEF:good=kmh,100,GT,0,kmh,IF \ HRULE:100#0000FF:"Maximum allowed" \ AREA:good#00FF00:"Good speed" \ AREA:fast#550000:"Too fast" \ STACK:over#FF0000:"Over speed" {{:speed4.png|}}\\ Mouai ... ===== du concret ===== Je voudrais stocker des températures sur +2 ans... On va prendre un "heartbeat" de 5 minutes... donc, on garantie d'avoir une nouvelle valeur au moins toutes les 5 minutes ! 5 * 60 => 300 secondes Ce qui donne comme paramètre: DS:temp:GAUGE:300:-80:+80 Je pose des limites minimum/maximum. (Parce que le capteur n'est pas a l'abri d'un bug!) ==== Quelques heures ==== On veut garder les valeurs sur 2 jours au moins... Donc: 2 jours => 172800 secondes En "heartbeat" ca donne: 172800 / 300 => 576 Soyons un peu plus généreux, et on arrondi a: 600 ( => (600*300)/(24*60*60) ) => 2 jours et 2 heures ) Ce qui nous donne un premier paramètre "RRA" comme cela: RRA:AVERAGE:0.5:1:600 - Donc, on créé une "table" pour recevoir **''600 valeurs''**.\\ - On prétend pour fournir au moins 1 information toutes les 5 minutes.\\ - S'il y en a plusieurs, une moyenne est faite entre elle.\\ - S'il n'y en a aucune sur les 5 minutes, la "valeur" est marqué "unknown". En conséquence: 600 * 300 => 2 jours et 2 heures. ==== Quelques jours ==== On veut garder les valeurs sur 14 jours au moins, mais avec un peu moins de precisions.\\ Donc: 14 jours => 1209600 secondes En "heartbeat" ca devient: 1209600 / 300 => 4032 Mais c'est beaucoup trop de valeurs a stocker... On va essayer de s'approcher des "600" valeurs stockable.\\ 1209600 / 600 => 2016 secondes Donc, 1 information devrait être la moyenne (average) d'une periode de "2016 secondes".\\ Convertit en "heartbeat", cela devient: 2016 / 300 => 6.72 On arrondit a **''6''** Finalement, on a besoin de **''6''** informations pour constituer une valeur stockable.\\ 6 * 300 => 30 minutes On fera donc la moyenne sur 6 informations, c'est a dire une période de temps de 30 minutes. C'est acceptable pour garder 14 jours de valeurs.... Enfin, un peu plus maintenant:\\ Pour 14 jours, on a besoin de : 1209600 / ( 6 * 300 ) => 672 valeurs On va encore arrondir a **''700''** , soit: 300 * 6 * 700 => 1260000 => 14.5 jours Bien. Cela devient comme parametre: RRA:AVERAGE:0.5:6:700 -On a 700 valeurs -Chaque valeur couvre 6*300 secondes, soit 30 minutes -la "table" couvre 14.5 jours ( 300 * 6 * 700 ) ==== Quelques semaines ==== C'est bien, mais on veut garder au moins 2 mois, soit 8 semaines. Donc: 8 semaines => 60 jours Ce qui donne: 5184000 secondes Convertissons de suite en "600 valeurs": 5184000 / 600 => 8640 secondes Donc, chaque valeur stocké couvrira une période de **''8640 secondes''** soit **''2 heure et 24 minutes''**. Ca serait plus fun d'arrondir la période à **''2 heures''** ;-) \\ On y va: 2 * 60 => 7200 secondes Finalement, on a besoin que de "720" valeurs pour couvrir la période... effectivement: 3974400 / 7200 => 720 En "heartbeat" cela devient: 7200 / 300 => 24 On a donc besoin de **''24''** echantillons. 300 * 24 * 720 => 5184000 secondes => 60 jours Pile ! Allez, j'ajoute 2 jours: 744 valeurs Bien. Cela devient comme parametre: RRA:AVERAGE:0.5:24:744 -On a 744 valeurs -Chaque valeur couvre 24*300 secondes, soit 2 heures -la "table" couvre 62 jours ( 300 * 24 * 744 secondes ) ==== Plusieurs mois ==== === 6 mois === Pour 6 mois => soit environ 183 jours 183 jours => 15811200 secondes On va jouer avec des périodes de 6 heures.\\ Donc: 6 heures => 21600 secondes En "heartbeat" cela devient: 21600 / 300 => 72 Pour couvrir 183 jours, il faudra donc: 15811200 / ( 300 * 72 ) => 732 Bien. Cela devient comme parametre: RRA:AVERAGE:0.5:72:732 === 24 mois === Là, on va taper dans 1 valeur par jour ! parce 24 mois, ca fait 730 jours (environ). Donc, c'est trés simple: En "heartbeat" ca donne: 24 heures => 86400 secondes 86400 / 300 => 288 RRA:AVERAGE:0.5:288:730 C'est émouvant. ==== En action ==== $ rrdtool create poubelle.rrd DS:temp:GAUGE:300:-80:+80 RRA:AVERAGE:0.5:1:600 RRA:AVERAGE:0.5:6:700 RRA:AVERAGE:0.5:24:744 RRA:AVERAGE:0.5:72:732 RRA:AVERAGE:0.5:288:730 $ ls -la -rw-r--r-- 1 thierry thierry 29360 2008-08-17 23:59 poubelle.rrd