{{tag>app rrdtool dev}}
====== RRDtool ======
===== Généralités =====
Créé en 1999 par Tobias Oetiker, RRDtool comprend une une base de données de type buffer circulaire pour valeurs numériques accompagnée d'outils permettant d'alimenter la base et d'exporter les valeurs sous forme graphique ou textuelle. RRDtool est couramment utilisé pour les tâches d'administration système et de supervision. On le retrouve intégré à des logiciels tels que Cacti, Munin ou Centreon.
===== La base de données =====
**RRD** pour **R**ound **R**obin **D**atabase (base de données tourniquet). Le fichier de la base RRD contient un nombre d'enregistrements fixes, définit à la création. La taille de la base ne croit pas indéfiniment. Lorsque le dernier enregistrement est écrit l’écriture reprend sur le premier. Ce type de stockage est particulièrement adapté aux données à durée de vie limitée.
Les données enregistrées dans une RRD sont fondamentalement liées au temps. L'intervalle de temps entre deux insertions est définit à la création de la base, c'est le **step**. Chaque enregistrement a un **timestamp UNIX**.
Une RRD est caractérisée par sa date de début et son **step**, elle est le conteneur global d'un certain nombre d'éléments **RRA**, **CDP**, **PDP**. Ces éléments sont présentés dans la section terminologie.
La plage de temps servant de base pour la mesure est également bornée (déterminée et fixée). Si plus d'informations sont envoyé à la base, une valeur moyenne sera déterminée sur la tranche de de temps servant d'unité de mesure. Une mesure peut donc arriver avec une fréquence plus élevée sans que cela pose problème.
===== Terminologie =====
* **DS** pour **Data Source**, description d'une source de données numériques brute à destination du stockage. Identifiée par un nom, valeurs brutes utilisées à intervalle régulier (**heartbeat**).
* **DST** pour **Data Source Type**, une **DS** est également caractérisée par son type qui peut être:
* **COUNTER**, valeur augmentant en continu, la valeur stockée est le delta entre la précédente et la nouvelle.
* **DERIVE**, similaire à **COUNTER** mais permet de stocker des valeurs négatives et de décroître. Le delta est stocké.
* **ABSOLUTE**: stocke un delta mais en considérant que la valeur précédente est 0.
* **GAUGE**: stocke une valeur (la mesure), non un delta.
* **RRA** pour **Round Robin Archive**. Une RRD peut contenir plusieurs archives RRA. Les valeurs insérées dans la RRD sont périodiquement agrégées pour former les CDP enregistrés dans les RRA. Elles peuvent être assimilées à la définitions de vues. On peut définir différentes façon d'agréger les données. C'est lors de la création de la RRD qu'est définit l'historique couvert par l'archive via la définition des RRA.
* **PDP** pour **Primary Data Point**. A chaque intervalle de temps égal à **step**, une nouvelle valeur provenant d'une **DS** est une **PDP**. La PDP est qualifiée de primaire car elle n'est pas directement stockée dans la RRA, elle est consolidée avant. La consolidation consiste à agréger plusieurs PDP à l'aide d'une fonction de consolidation afin de conserver une tendance pertinente.
* **CDP** pour **Consolided Data Point**, c'est l'entrée dans la base **RRA**. Il est possible de le déterminer à l'aide d'un seul PDP mais tout l’intérêt consiste à consolider la mesure en utilisant plusieurs PDP et une méthode de consolidation **CF**.
* **CF** pour **Consolidation Function** Lors de la définition d'une RRA, RRDtool utilise un certain nombre de PDP pour déterminer le CDP à enregistrer. La manière de traiter est définie par un fonction de consolidation: **AVERAGE**, **MINIMUM**, **MAXIMUN** ou **LAST**.
==== Data Source ====
La déclaration d'un **DS** utilise la syntaxe suivante:
DS:label:DST:heartbeat:min:max
Le champ **DST** pour **D**ata **S**ource **T**ype peut prendre les valeurs suivantes:
L' **heartbeat** s'exprime en secondes, c'est un timeout ou temps limite au bout duquel la valeur est considérée inconnue.
**min** et **max** permettent de définir un intervalle de validité pour la valeur. Toute valeurs hors de cet intervalle sera considérée inconnue **UNKNOW**.
Ci dessous, un exemple de déclaration utilisé pour stocker des relevés de température:
DS:temp-sonde1:GAUGE:600:55:95 \
Dans l'exemple ci dessus, on définit une variable de type mesure dont le nom est temp-sonde1 avec des valeurs pouvant varier dans l'intervalle [55, 95]. La Fenêtre de validité d'une mesure (heartbeat) est de 600 secondes.
==== RRA ====
**RRA** pour **R**ound **R**obin **A**rchive. Une base RRD peut contenir une ou plusieurs RRA afin de couvrir des plages d'historique avec plus ou moins de précision. Chaque RRA est une vue différente stockant indépendamment les données, chacune avec un nombre prédéfinit d'enregistrements.
La couverture temporelle de la RRA est ajustable via deux paramètres:
* step: nombre de PDP à agréger pour former le CDP
* rows: nombre de CDP conservés dans la RRA
Il est donc possible de concevoir des plages d'historiques avec plus ou moins de **PDP** par **CDP** ou bien plus ou moins de **CDP** par **RRA** en fonction des besoins (vues ou historiques souhaités).
Lors de l'insertion d'une valeur( appelée **PDP** pour **P**rimary **D**ata **P**oint) la valeur enregistrée dans chaque RRA après combinaison avec les valeurs précédentes. Cette opération est effectuée via les fonctions de consolidation ou CF (Consolidation Function)
==== Syntaxe ====
RRA:CF:XFF:nb_PDPs:nb_REC
Le champ **CF** pour **C**onsolidation **f**unction peut prendre l'une des valeurs suivantes:
* AVERAGE
* MIN
* MAX
* LAST
Le champ **XFF** **XF**iles **F**actor, est le pourcentage de **PDP** pouvant être inconnu avant de rendre le **CDP** inconnu.
La valeur **nb_PDPs** correspond au nombre de PDP utilisés pour un enregistrement.
La valeur nb_REC
===== Consulter la RRD =====
La commande rrdinfo permet de retourner des information sur la structure de la RRD
$ rrdinfo /tmp/base.rrd
Pour recuperer la date de derniere mise a jour:
$ rrdtool last /tmp/base.rrd
La valeur retournée est un timestamp Unix, pour la mettre en forme de facon plus lisible:
$ date -d @$(rrdtool last /tmp/base.rrd)
===== Étapes pour la création d'une application =====
* Initialiser la base de données. Création de la base de données et préparer pour accepter les données. Il va falloir préciser la quantité de données à sauvegarder, la fréquence de mise à jour des données (step) et quel type de données est sauvegardé.
* Collecter les données. Un processus devra périodiquement écrire les données dans la base. C'est probablement l’étape qui prendra le plus de temps de développement.
* Création du graphique via [[app:rrdtool:rrdgraph]]. Relire les données de la base pour faire les calculs et créer les graphiques.
===== Exemples =====
* [[app:rrdtool:exemples:trafic-interface| Enregistrer le trafic d'une interface]]
* Enregistrer le temps moyen de réponse d'un ping sur 1h [[app:rrdtool:ping-graph]]
===== Références =====
* https://calomel.org/rrdtool.html
* http://cuddletech.com/articles/rrd/ar01s02.html
* GLM N°143 de Novembre 2011
* https://ds9a.nl/rrd-mini-howto/cvs/rrd-mini-howto/output/rrd-mini-howto-1.html