Les bases de métrologie comme Graphite doivent stocker des données en quasi-temps réel ( avec une fréquence de l’ordre de la minute ), et ce, sur plusieurs années.
Lorsqu’une donnée change de rétention, Graphite effectue une agrégation ( une moyenne ) afin de réduire le volume tout en conservant l'information essentielle.
Cela a deux avantages :
Stockage optimisé : possibilité de conserver des données de métrologie sur le long terme sans saturer le disque.
Prévisibilité de l'espace disque : la taille occupée par les métriques est connue dès l’insertion de la première donnée, car l’allocation de l’espace disque est anticipée.
Les règles de précision s'appliquent à des chemins de métriques.
Chaque métrique — par exemple cpu_idle correspondant au check CPU de l’hôte serveur-1 — dispose de son propre fichier .wsp, stocké dans le répertoire : /opt/graphite/storage/whisper/.
Il est donc possible de définir des règles de précision à différents niveaux :
Globalement, pour tous les éléments de supervision gérés par Shinken.
Par hôte, pour appliquer des règles spécifiques à un serveur ou équipement.
Par check, pour affiner la rétention en fonction du type de supervision ( CPU, mémoire, ... ).
La configuration des précisions de stockage des données s’effectue dans le fichier /opt/graphite/conf/storage-schemas.conf.
Exemple de fichier de configuration :
# Schema definitions for Whisper files. Entries are scanned in order, # and first match wins. This file is scanned for changes every 60 seconds. # # Definition Syntax: # # [name] # pattern = regex # retentions = timePerPoint:timeToStore, timePerPoint:timeToStore, ... # # name: Arbitrary unique name for the rule # pattern: Regular expression to match against the metric name. For syntax see: # https://docs.python.org/3/library/re.html#regular-expression-syntax # retentions: Retention schema for the metric # # Remember: To support accurate aggregation from higher to lower resolution # archives, the precision of a longer retention archive must be # cleanly divisible by precision of next lower retention archive. # # Valid: 60s:7d,300s:30d (300/60 = 5) # Invalid: 180s:7d,300s:30d (300/180 = 3.333) # # This retention is set at the time the first metric is sent. # Changing this file will not affect already-created .wsp files. # Use whisper-resize.py to change existing data files. # Carbon's internal metrics. This entry should match what is specified in # CARBON_METRIC_PREFIX and CARBON_METRIC_INTERVAL settings [carbon] pattern = ^carbon\. retentions = 60:90d [default] pattern = .* retentions = 60s:1d,5m:30d,1h:3y |
Pour la configuration carbon, Il faut :
|
Chaque règle de précision correspond à une section du fichier, dans laquelle sont définis les paramètres de stockage.
Exemple de section :
[everything_1min] pattern = .* retentions = 60s:7d,300s:30d,1800s:180d,86400s:547d |
Les règles du fichier de configuration :
Ce fichier peut contenir plusieurs sections.
Les sections sont appliquées dans l'ordre, de la première à la dernière.
Les patterns sont des expressions régulières.
Le premier pattern qui correspond au chemin de la métrique est utilisé.
La précision est définie au moment où la première métrique est envoyée.
La modification de ce fichier n'aura aucune incidence sur les fichiers .wsp déjà créés.
Utiliser whisper-resize.py pour les modifier.
Les modifications du fichier /opt/graphite/conf/storage-schemas.conf doivent être effectuées sur la machine du carbon-cache. Dans le cas d'un cluster Graphite, il faut modifier le fichier sur toutes les machines avec un carbon-cache. |
Le fichier de configuration /opt/graphite/conf/storage-schemas.conf est automatiquement analysé par Graphite toutes les minutes. |
La règle de précision à appliquer sur une métrique correspond à une section.
Exemple de section :
[everything_1min] pattern = .* retentions = 60s:7d,300s:30d,1800s:180d,86400s:547d |
Une section correspond à :
Un pattern est une expression régulière utilisée pour faire correspondre le nom des nouvelles métriques. Les caractères spéciaux des expressions régulières sont donc utilisables ( par exemple : ^ pour indiquer le début d’une chaîne, $ pour la fin ... ).
Cas particulier des points dans les noms de métriques :
.) dans les noms de métriques comme des séparateurs hiérarchiques. . correspond à n’importe quel caractère.\).Pour appliquer les mêmes précisions de stockage à l’ensemble des éléments de Shinken, il faut :
Placer la section après la section carbon, qui correspond au schéma de rétention des données des métriques internes à Graphite.
Utilisez le pattern suivant : pattern = .*
Ce comportement correspond à la configuration par défaut fournie avec Shinken.
Exemple de section permettant d’appliquer la même précision à tous les éléments de Shinken :
[everything_1min] pattern = .* retentions = 60s:7d,300s:30d,1800s:180d,86400s:547d |
Pour appliquer les modifications immédiatement :
service carbon-cache restart |
Il est possible de définir une précision de stockage spécifique pour un hôte dans Graphite.
Pour cela, procéder comme suit :
Placer la section avant la section générale qui matche toutes les données ( c’est-à-dire avant la section avec pattern=.* ) et toutes autres sections qui pourraient correspondre à l'hôte.
Utiliser un pattern qui cible l’HOST-UUID de l’hôte au début du chemin, au format :
pattern = ^HOST-UUID.* |
Exemple de section pour appliquer une précision uniforme à toutes les métriques d’un hôte
[specifique] pattern = ^d723f22cb01111f0a8260800276e8d1e.* retentions = 1m:1h,5m:2h,1h:30d,1d:1y,8640m:3y |
Pour appliquer les modifications immédiatement :
service carbon-cache restart |
|
Pour appliquer un nouveau schéma de précisions sur des métriques existantes, il faut :
whisper-resizeSupprimer le dossier de l’hôte contenant les métriques.whisper-resize.pyExemple d'utilisation de la commande ( 1m:1h,5m:2h,1h:30d,1d:1y,8640m:3y correspond à la nouvelle définition des précisions ) :
/usr/bin/whisper-resize.py /opt/graphite/storage/whisper/HOST-UUID/*/*.wsp 1m:1h,5m:2h,1h:30d,1d:1y,8640m:3y |
Une fois les fichiers créés ou modifiés, il est possible vérifier la prise en compte du schéma dans le fichier de logs /opt/graphite/storage/log/carbon-cache/carbon-cache-a/creates.log:
Chercher des entrées indiquant la création des fichiers .wsp avec la précision attendue, par exemple :
29/06/2021 16:41:44 :: new metric b6f742865f074584a605d31116833f3d.92182da3c28c5193c0e36b4a68b5e896.connexion_time matched schema specifique 29/06/2021 16:41:44 :: new metric b6f742865f074584a605d31116833f3d.92182da3c28c5193c0e36b4a68b5e896.connexion_time matched aggregation schema default_average 29/06/2021 16:41:44 :: creating database file /opt/graphite/storage/whisper/b6f742865f074584a605d31116833f3d/92182da3c28c5193c0e36b4a68b5e896/connexion_time.wsp (archive=[(60, 60), (300, 24), (3600, 720), (86400, 365), (518400, 182)] xff=0.01 agg=average) |
ll est possible de définir une précision de stockage spécifique à un check quelque soit l'hôte sur lequel il est accroché.
Pour cela, procéder comme suit :
Placer la section avant la section générale qui matche toutes les données ( c’est-à-dire avant la section avec pattern = .* ) et toutes autres sections qui pourraient matchées le check.
Utiliser un pattern qui cible l’UUID du check, au format :
pattern = .*\.CHECK-UUID\..* |
Exemple de section pour appliquer une précision uniforme à un check, quelque soit l'hôte auquel il est accroché :
[specifique] pattern = .*\.d723f22cb01111f0a8260800276e8d1e\..* retentions = 1m:1h,5m:2h,1h:30d,1d:1y,8640m:3y |
Pour appliquer les modifications immédiatement :
service carbon-cache restart |
|
Pour appliquer un nouveau schéma de précisions sur des métriques existantes, il faut :
whisper-resize.pyExemple d'utilisation de la commande ( 1m:1h,5m:2h,1h:30d,1d:1y,8640m:3y correspond à la nouvelle définition des précisions ) :
/usr/bin/whisper-resize.py /opt/graphite/storage/whisper/*/CHECK-UUID/*.wsp 1m:1h,5m:2h,1h:30d,1d:1y,8640m:3y |
Une fois les fichiers créés ou modifiés, il est possible vérifier la prise en compte du schéma dans le fichier de logs /opt/graphite/storage/log/carbon-cache/carbon-cache-a/creates.log:
Chercher des entrées indiquant la création des fichiers .wsp avec la précision attendue, par exemple :
29/06/2021 16:41:44 :: new metric b6f742865f074584a605d31116833f3d.92182da3c28c5193c0e36b4a68b5e896.connexion_time matched schema specifique 29/06/2021 16:41:44 :: new metric b6f742865f074584a605d31116833f3d.92182da3c28c5193c0e36b4a68b5e896.connexion_time matched aggregation schema default_average 29/06/2021 16:41:44 :: creating database file /opt/graphite/storage/whisper/b6f742865f074584a605d31116833f3d/92182da3c28c5193c0e36b4a68b5e896/connexion_time.wsp (archive=[(60, 60), (300, 24), (3600, 720), (86400, 365), (518400, 182)] xff=0.01 agg=average) |
Shinken ne permet pas de définir une rétention appliquée à une métrique uniquement.
Une ligne de rétentions peut définir plusieurs rétentions. Chaque rétention à le format "précision:période de couverture", séparée par une virgule.
Les unités possibles pour la précision et la période de couverture sont :
Ne pas mettre une précision en dessous d'une minute. |
Exemple de rétentions :
[apache_busyWorkers] pattern = *\..*\.cpu$ retentions = 60s:7d,5m:21d,15m:5y |
Ce schéma stocke une donnée par minute pendant une semaine, puis une donnée toutes les cinq minutes sur 21 jours et enfin une donnée toutes les 15 minutes durant 5 ans.
Lorsque l'on définit une ligne de rétentions, il faut suivre deux règles :
La précision livrée par défaut depuis la 02.06.02 est la suivante :
[everything_1min] pattern = .* retentions = 60s:7d,300s:30d,1800s:180d,86400s:547d |
Va appliquer pour tous les métriques la règle de stockage suivante :
À noter qu'un point occupe 12 octets:
Ici un fichier créé avec cette rétention aura donc la taille :
Soit une taille totale de 328Ko, par métrique présente sur le disque ( le fichier .wsp ).
La précision n'est pas modifiée lors d'une mise à jour de Shinken Enterprise. |
La précision livrée par défaut avant la 02.06.02 était la suivante :
[everything_1min] pattern = .* retentions = 60s:7d,300s:30d,3600s:180d,86400s:650d |
Va appliquer pour tous les métriques la règle de stockage suivante:
À noter qu'un point occupe 12 octets:
Ici un fichier créé avec cette rétention aura donc la taille :
Soit une taille totale de 283Ko par métrique présente sur le disque ( le fichier .wsp ).
La précision n'est pas modifiée lors d'une mise à jour de Shinken Enterprise. |
Lorsque l'on affiche les métriques dans l'Interface de Visualisation, les précisons des données de la métrique apparaitront en haut à droite ( voir la page Onglet Graphiques pour plus d'information sur l'affichage des métriques dans l'Interface de Visualisation ).
|
Pour modifier la précision des métriques sans perdre les anciennes valeurs, utiliser le script whisper-resize.py
Dans un premier temps, modifier les retentions dans le fichier /opt/graphite/conf/storage-schemas.conf
Pour que le paramètre soit pris en compte, il faut redémarrer carbon-cache :
service carbon-cache restart |
Une fois carbon-cache redémarré,
#!/bin/bash
FOLDER="/opt/graphite/storage/whisper"
RETENTION="XXXXXX"
for i in $(find $FOLDER/$1 -iname "*.wsp"); do
if [ -a $i ];
then
/usr/bin/whisper-resize.py $FOLDER/$i $RETENTION;
/usr/bin/chown apache:apache $FOLDER/$i
fi;
done |
Il faut remplacer la variable RETENTION par celle mise dans le fichier storage-schemas.conf avant exécution du script |
Rendre le script exécutable
chmod +x mass_modif_retention_graphite.sh |
Et le lancer en mettant une faible priorité tant au CPU qu'à la consommation disque :
ionice nice ./mass_modif_retention_graphite.sh |
Le script va créer pour chaque fichier converti un fichier .bak qui est une sauvegarde de l'ancien fichier, ce qui signifie que la taille nécessaire à cette conversion va nécessiter beaucoup d'espace disque.
/usr/bin/whisper-resize.py $FOLDER/$i $RETENTION; |
Par cette ligne :
/usr/bin/whisper-resize.py $FOLDER/$i $RETENTION --nobackup; |
Lorsque la configuration du fichier storage-schemas.conf est incorrect, le démon carbon-cache échouera à démarrer et affichera un message d'erreur Python.
Exemple d'erreur provoquée par un fichier de configuration incorrect :
service carbon-cache restart
Stopping carbon-cache... [ OK ]
Starting carbon-cache...Traceback (most recent call last):
File "/opt/graphite/bin/carbon-cache.py", line 32, in <module>
run_twistd_plugin(__file__)
File "/opt/graphite/lib/carbon/util.py", line 140, in run_twistd_plugin
runApp(config)
File "/opt/shinken/shinken_venv_graphite_redhat8/lib64/python3.6/site-packages/twisted/scripts/twistd.py", line 29, in runApp
runner.run()
File "/opt/shinken/shinken_venv_graphite_redhat8/lib64/python3.6/site-packages/twisted/application/app.py", line 370, in run
self.application = self.createOrGetApplication()
File "/opt/shinken/shinken_venv_graphite_redhat8/lib64/python3.6/site-packages/twisted/application/app.py", line 432, in createOrGetApplication
ser = plg.makeService(self.config.subOptions)
File "/opt/graphite/lib/twisted/plugins/carbon_cache_plugin.py", line 21, in makeService
return service.createCacheService(options)
File "/opt/graphite/lib/carbon/service.py", line 114, in createCacheService
setupPipeline(['write'], root_service, settings)
File "/opt/graphite/lib/carbon/service.py", line 89, in setupPipeline
setupWriterProcessor(root_service, settings)
File "/opt/graphite/lib/carbon/service.py", line 198, in setupWriterProcessor
from carbon.writer import WriterService
File "/opt/graphite/lib/carbon/writer.py", line 35, in <module>
SCHEMAS = loadStorageSchemas()
File "/opt/graphite/lib/carbon/storage.py", line 81, in loadStorageSchemas
config.read(STORAGE_SCHEMAS_CONFIG)
File "/opt/graphite/lib/carbon/conf.py", line 157, in read
result = ConfigParser.read(self, path)
File "/usr/lib64/python3.6/configparser.py", line 697, in read
self._read(fp, filename)
File "/usr/lib64/python3.6/configparser.py", line 1092, in _read
fpname, lineno)
configparser.DuplicateOptionError: While reading from '/opt/graphite/conf/storage-schemas.conf' [line 23]: option 'pattern' in section 'specifique' already exists |
service carbon-cache restart Stopping carbon-cache... [FAILED] Starting carbon-cache...'too many values to unpack (expected 2) in section [Everything_1Min] in /opt/graphite/conf/storage-schemas.conf' |