Accueil > Outillage > Supervision d’applications : installation de Graphite

Supervision d’applications : installation de Graphite

Exemple Graphite

Recueillir des données sur ses applications et ses serveurs en temps réel est essentiel pour superviser le bon fonctionnement de son environnement de production.

Toutefois faut-il pouvoir les utiliser correctement pour, par exemple, détecter rapidement un problème, trouver les potentielles causes, ou encore vérifier que telle ou telle fonctionnalité est utilisée.

La série de billets « Supervision d’applications » propose donc de monter un environnement de supervision complet.

Ce premier billet offre un aperçu des différents composants de Graphite et montre comment les installer.

Le deuxième billet présentera CollectD et StatsD, composants utilisés pour récupérer des métriques d’application.

Enfin, nous aborderons Tattle qui permet de présenter les données et de déclencher des alertes.

Le but étant de superviser des webservices REST ainsi que certains aspects serveur : espace disque, mémoire, Apache, etc.

Architecture de Graphite

Graphite possède 3 composants principaux : Carbon, Whisper et Graphite-Web :

 

Carbon

(http://graphite.readthedocs.org/en/latest/carbon-daemons.html)

Un ou plusieurs démons Carbon ont la charge d’écouter sur un port défini, de récupérer les données envoyées par les applications et les serveurs, et enfin d’enregistrer ces données. Le temps entre deux enregistrements est paramétrable. Un exemple sera donné pour illustrer cet aspect.

Carbon ne gère pas la manière dont sont enregistrées les données.

C’est le rôle de Whisper.

 

Whisper

(http://graphite.readthedocs.org/en/1.0/whisper.html)

Whisper permet de stocker des données temporelles avec plusieurs résolutions possibles. Par exemple, pour superviser les appels ok à un webservice, nous pouvons stocker un point par seconde et conserver ces données pendant 10 minutes. Cela peut être très utile pour la supervision en temps réel.

Pour les mêmes appels ok au webservice, nous pouvons stocker un point toutes les minutes et garder ces informations pendant 6 mois. Cela permet d’avoir une supervision à long terme sur ce service.

Ces “fenêtres” de résolution seront utilisées par Graphite pour afficher des graphes.

 

Graphite-Web

L’application web de Graphite permet quant à elle de dessiner des graphes à partir des données enregistrées dans Whisper, et des instructions qu’on lui fournit.

Nous pouvons par exemple demander l’affichage d’un graphe pour superviser le nombre de ok/ko d’un webservice entre le 1er janvier 2015 er le 31 janvier 2015. Nous pouvons spécifier que la ligne “ok” sera en vert, et la ligne “ko” en rouge.

Nous avons aussi la possibilité de sauvegarder les instructions de génération d’un graphe dans un compte utilisateur.

Enfin l’API Render de Graphite rend accessible les graphes depuis une simple url. Exemple d’url :  http://localhost/render?target=test.viseo.v1.ok.count&from=-1hours&width=586&height=308

Graphite Render

Graphite Render

 

Installation de l’environnement de supervision

Pour installer l’environnement de supervision j’ai utilisé une seule machine virtuelle Ubuntu 14.04 totalement vierge. Évidemment en production les serveurs doivent être redondés et les composants séparés les uns des autres.

 

Installation de Graphite et Carbon

Dans un premier temps nous allons installer Graphite et Carbon après avoir mis à jour les dépôts :

sudo apt-get update
sudo apt-get install graphite-web graphite-carbon

Lors de l’installation il est demandé si nous voulons purger le dossier /var/lib/graphite/whisper. Il faut répondre « non ». Nous pouvons supprimer les fichiers de données à la main si nous souhaitons purger les métriques.

L’application web Graphite est basée sur le framework Django qui nécessite une base de données pour stocker quelques informations. Le framework Django possède un puissant ORM (object-relationnal mapping) qui permet de travailler avec des objets et de gérer facilement la compatibilité avec le SGDR utilisé (système de gestion de base de données relationnelle) : https://docs.djangoproject.com/en/dev/ref/databases/

Par défaut la base de données utilisée est SQLite. Pour notre architecture nous allons plutôt nous orienter vers une base plus robuste en environnement de production : PostgreSQL :

sudo apt-get install postgresql libpq-dev python-psycopg2


Nous créons ensuite l’utilisateur « graphite » avec le mot de passe « password » depuis la console Postgres, ainsi que la base de données « graphite » :

sudo -u postgres psql

CREATE USER graphite WITH PASSWORD 'password';
CREATE DATABASE graphite WITH OWNER graphite;
\q

Nous devons modifier la configuration de Graphite pour, entre autres, utiliser cette base de données :

sudo nano /etc/graphite/local_settings.py

#Clé de salage pour hasher les tokens d'authentification, les infos des cookies...
#En environnement de production, la clé doit être longue et aléatoire pour plus de sécurité
SECRET_KEY = 'secret_key_viseo'

#Réglage de la timezone des graphes pour correspondre à la timezone des serveurs supervisés
TIME_ZONE = 'Europe/Paris'

#Autoriser l'authentification :
USE_REMOTE_USER_AUTHENTICATION = True

#Configuration de la base de données Postgres
DATABASES = {
   'default': {
      'NAME': 'graphite',
      'ENGINE': 'django.db.backends.postgresql_psycopg2',
      'USER': 'graphite',
      'PASSWORD': 'password',
      'HOST': '127.0.0.1',
      'PORT': ''
   }
}

Enfin nous créons la structure de la base avec un premier utilisateur admin/admin ayant le rôle superuser. Nous pourrons nous connecter à l’interface avec cet utilisateur pour enregistrer des graphes, modifier l’interface, etc.

sudo graphite-manage syncdb

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use 'root'): admin
Email address: emmanuel.pierre@viseo.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

La base données permet  de stocker des utilisateurs. Un utilisateur connecté peut enregistrer en base les données nécessaires à la génération d’un graphe. Ce qui permet de le re-générer facilement. Il peut aussi se créer un « dashboard » contenant plusieurs graphes.


Configuration de Carbon

Il faut maintenant configurer Carbon. Cela se fait à partir de plusieurs fichiers.

graphite-carbon

Dans un premier temps nous paramètrons que carbon doit se lancer au démarrage du serveur :

sudo nano /etc/default/graphite-carbon

CARBON_CACHE_ENABLED=true
carbon.conf

Le fichier suivant permet entre autres d’activer la rotation des logs :

sudo nano /etc/carbon/carbon.conf

ENABLE_LOGROTATION = True
storage-schemas.conf

Puis le fichier storage-schemas.conf permet de spécifier la durée de stockage des métriques et le niveau de détail :

sudo nano /etc/carbon/storage-schemas.conf

Par défaut ce fichier contient 2 blocs :

[carbon]
pattern = ^carbon\.
retentions = 60:90d

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d

Le premier bloc nommé [carbon] filtre toutes les métriques dont le nom commence par « carbon. ». Nous enregistrons un point de données toutes les 60 secondes. Nous gardons ces métriques pendant 90 jours.

Le 2ème bloc filtre toutes les autres métriques. Nous enregistrons un point de données toutes les 60 secondes. Nous gardons ces métriques pendant 1 jour.

2 choses essentielles :

  • Il faut configurer les filtres du plus précis au moins précis
  • Pour un même filtre, nous pouvons configurer plusieurs niveaux de détails en séparant par des virgules. Ex : retentions = 10s:10m,1m:1h,10m:1d

Entre les 2 filtres nous ajoutons celui-ci :

[test_viseo]
pattern = ^test\.viseo\.
retentions = 10s:10m,1m:1h,10m:1d

Qui se traduit ainsi : pour toutes les métriques commençant par « test.viseo. », nous enregistrons :

  • Un point de données toutes les 10 secondes. Nous gardons ce niveau de détail pendant 10 minutes.
  • Un point de données toutes les minutes. Nous gardons ce niveau de détail pendant une heure.
  • Un point de données toutes les 10 minutes. Nous gardons ce niveau de détail pendant un jour.
storage-aggregation.conf

Lorsque Carbon doit stocker des métriques sur plusieurs niveaux de détail, il récupère les points de données du niveau le plus détaillé, il les agrège et les stocke dans le niveau moins détaillé.

Le fichier storage-aggregation.conf permet de configurer la manière d’agréger les données. Un exemple est déjà disponible et doit être copié :

sudo cp /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example /etc/carbon/storage-aggregation.conf
sudo nano /etc/carbon/storage-aggregation.conf

Le paramétrage suivant permet de faire la somme des valeurs de toutes les métriques finissant par « .count » et de créer un seul point de données ayant pour valeur cette somme :

[sum]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum

Contrairement à celui-ci qui va uniquement récupérer la plus petite valeur parmi plusieurs métriques :

[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min

xFilesFactor, compris entre 0 et 1, est un ratio du nombre de points nécessaires pour créer un nouveau point agrégé.

Enfin nous démarrons le service Carbon (Logs : /var/log/carbon) :

sudo service carbon-cache start

 * Starting Graphite backend daemon carbon-cache
Starting carbon-cache (instance a) [ OK ]

Installation d’Apache

Afin d’avoir accès à l’application Graphite-web il reste à installer et configurer Apache.

Les commandes suivantes permettent de :

  • Installer Apache avec le module d’hébergement d’applications en Python (mod-wsgi)
  • Désactiver le fichier virtual host par défaut
  • Ajouter le fichier virtual host pour Graphite
  • Recharger la conf Apache
sudo apt-get install apache2 libapache2-mod-wsgi
sudo a2dissite 000-default
sudo cp /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available
sudo a2ensite apache2-graphite
sudo service apache2 reload

Le fichier de conf apache2-graphite.conf contient <VirtualHost *:80> : nous pouvons donc accéder à l’interface avec les hostnames localhost, 127.0.0.1, … En configurant correctement la machine virtuelle on pourrait y accéder depuis la machine hôte avec l’adresse IP de la machine virtuelle.

Premiers tests de Graphite

Accès à l’interface Graphite

Dans un navigateur, taper l’url : http://localhost/

Interface Graphite

Interface Graphite

 

Premier envoi de métriques

Dans le prochain billet nous verrons plus précisément comment envoyer des métriques à Graphite. Mais nous allons tout de même tester notre installation en envoyant plusieurs fois la métrique « test.viseo.v1.ok.count » avec la valeur 5 et la date du système.

Dans une console, nous lançons plusieurs fois la commande suivante, en espaçant de 10 secondes :

echo "test.viseo.v1.ok.count 5 `date +%s`" | nc -q0 127.0.0.1 2003

Dans les logs de Carbon nous avons :

ubuntu@ubuntu-VirtualBox:/var/log/carbon$ tail -500f creates.log
05/08/2015 15:38:32 :: new metric test.viseo.v1.ok.count matched schema test_viseo
05/08/2015 15:38:32 :: new metric test.viseo.v1.ok.count matched aggregation schema sum
05/08/2015 15:38:32 :: creating database file /var/lib/graphite/whisper/test/viseo/v1/ok/count.wsp (archive=[(10, 60), (60, 60), (600, 144)] xff=0.0 agg=sum)

Cela nous permet de vérifier que la métrique est bien traitée comme nous le souhaitons.

Pour aller plus loin nous pouvons « lire » la base de données Whisper avec la commande suivante :

/usr/bin/whisper-fetch /var/lib/graphite/whisper/test/viseo/v1/ok/count.wsp

Ce qui donne par exemple :

1449046800 20.000000
1449047400 10.000000

L’option –pretty permet d’afficher le timestamp dans un format plus lisible.

Les points importants sur cette base de données :

  • Pour chaque « clé » Whisper crée une arborescence de dossiers/fichiers : « test.viseo.v1.ok.count » devient /test/viseo/v1/ok/count.wsp
  • La suppression du fichier permet la suppression des données déjà enregistrées
  • Le format des données enregistrées est le suivant : timestamp, valeur
  • Les données sont déjà calculées et ne peuvent pas être modifiées

 

En allant dans l’interface de Graphite, nous pouvons voir dans l’arborescence à gauche que notre métrique a été créée :

Arborescence de Graphite

Arborescence de Graphite

En cliquant sur « count » le graphe se ré-actualise. Nous le réglons pour afficher les 10 dernières minutes (icone_graphite).

Graphite sur 10 minutes

Graphite sur 10 minutes

Nous voyons que plusieurs valeurs 5 ont été enregistrées pendant cette période de 10 minutes.

Pour rappel nous avons configuré le niveau de détail « 10s:10m » : nous enregistrons un seul point toutes les 10 secondes. Nous gardons ces informations pendant 10 minutes.

 

Toujours dans l’interface, nous affichons maintenant les données de la dernière heure. Graphite ne va donc pas prendre les données du niveau de détail « 10s:10m » mais plutôt « 1m:1h » :

Graphite sur 1h

Graphite sur 1h

Nous constatons que les métriques ont été agrégées conformément à ce qui est paramétré dans le fichier storage-aggregation.conf : les valeurs « 5 » ont été additionnées par tranche de 1 minute.

Grâce à l’API Render nous obtenons le même graphe avec une simple url :  http://localhost/render?target=test.viseo.v1.ok.count&from=-1hours&width=586&height=308

 

Conclusion

Dans ce premier billet nous avons installé Graphite afin de pourvoir enregistrer des métriques et les restituer sous forme de graphes.

Nous avons testé l’envoi manuel de données pour vérifier différents points de configuration et comprendre le comportement d’affichage des graphes.

Cela nous a aussi permis de comprendre le fonctionnement de la base de données Whisper qui est idéale pour stocker des données numériques au fil du temps avec son format clé/timestamp/valeur.

La prochaine étape consistera à collecter automatiquement des métriques systèmes ou des métriques issues d’applications avec CollectD et StatsD.

Enfin nous aborderons les tableaux de bord et les alertes avec Tattle pour suivre au mieux un environnement de production.

  1. Pas encore de commentaire
  1. Pas encore de trackbacks


deux + = 10