Gatling, Graphite, Grafana : votre application sous haute surveillance !

Pouvoir être alerter sur les performances de votre application sans avoir le nez toujours coller à un écran de surveillance voilà quelque chose d'intéressant et surtout d'assez simple à mettre en oeuvre en associant ces trois outils Gatling, Graphite, Grafana.

Présentation des outils

Gatling

Gatling est solution open source de stress d'application. Elle met à disposition un outil d'enregistrement de scénarios interceptant les actions (click, remplir des champs de formulaire...) générant un fichier Scala qui peut ensuite être exécuter dans le cadre de campagnes de stress. Ces fichiers peuvent facilement être repris pour ajouter des options de montée en charge, par exemple le nombre d'utilisateurs sur une plage de temps définie. Gatling fourni donc un outil d'exécution des scénarios générant un rapport, sous la forme d'une IHM Web, affichant toutes les métriques issues de l'exécution du scénario.

Graphite

Graphite solution open source et aussi de stockage et de visualisation de données de type série chronologique. Graphite stocke des métriques, par exemple des temps d'exécutions, où chaque valeur est stockée avec un timestamp correspondant au moment où la valeur a été mesurée. Graphite permet de visualiser ces données sous forme de courbes mais également d'appliquer des fonctions de transformation.

Grafana

Grafana, également open source, offre une solution de création de dashboards, via une interface web, par laquelle vous pouvez agencer des widgets (graphiques, tableaux, compteurs...). Grafana accepte plus d'une vingtaine de data source, dont Graphite, et propose notamment une fonctionnalité d'alerting (Voir article : https://blog.netapsys.fr/lalerting-dans-grafana/).

Installation et démarrage

Pour chaque outil je vais détailler le mode d'installation puis, en terme d'utilisation, j'irai directement à ce qui nous intéresse dans le cadre de cet article. Chacun possède une documentation complète pour ceux qui souhaitent approfondir.

Pré-requis à l'installation des outils, avoir un JDK 8 installé sur votre poste.

Gatling

Gatling est très simple d'installation et d'utilisation, il suffit de télécharger l'archive, de la décompresser et ensuite vous avez deux exécutables :

#exécution du recorder
%GATLING_HOME%/bin/recorder.bat

#exécution du runner
%GATLING_HOME%/bin/gatling.bat

Pour information amis Linuxiens il y aussi des .sh 😉

Comme je l'ai expliqué précédemment, je ne vais pas décrire le fonctionnement complet de Gatling, je vous mets en lien les sources Github d'un scénario Gatling qui va nous servir à illustrer notre cas d'utilisation. Si vous lisez le Readme des sources vous pourrez voir qu'il est question de SBT pour exécuter des tâches en Scala. Nous n'en n'aurons pas besoin, mais rien ne vous empêche de le tester ;).  De notre côté, nous utiliserons directement les fichiers Scala via le runner de Gatling.

Pour tester le fichier vous pouvez exécuter cette commande :

%GATLING_HOME%/bin/gatling.bat -s "/ROOT_DES_SOURCES/gatling-sbt-plugin-demo/src/test/scala/computerdatabase/ComputerWorld"

Gatling va lancer le scénario qui effectue 8 requêtes vers le site de démo de Gatling http://computer-database.gatling.io. A la fin de l'exécution Gatling génère le rapport d'exécution dans un sous dossier "recordedsimultation-xxxx" que vous trouverez dans le dossier "results" de votre installation Gatling.

Graphite

Graphite propose un mode d'installation dans son quick start via synthesize que nous allons également utiliser. La seule modification que j'ai eu à faire se situe dans le fichier Vagrantfile dans lequel j'ai modifié les ports définis par Vagrant et j'ai précisé l'ip par défaut ce qui me donne un fichier Vagrantfile comme ceci

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "mayflower/trusty64-puppet3"
  config.vm.network :forwarded_port, guest: 443, host: 443
  config.vm.network :forwarded_port, guest: 8125, host: 8125, protocol: 'tcp'
  config.vm.network :forwarded_port, guest: 8125, host: 8125, protocol: 'udp'
  config.vm.network :forwarded_port, guest: 2003, host: 2003, host_ip: '127.0.0.1'
  config.vm.network :forwarded_port, guest: 2004, host: 2004, host_ip: '127.0.0.1'
  graphite_version = ENV['GRAPHITE_RELEASE'].nil? ? '0.9.15' : ENV['GRAPHITE_RELEASE']
  config.vm.provision "shell", inline: "cd /vagrant; GRAPHITE_RELEASE=#{graphite_version} ./install"
end

Pour que la configuration soit prise en compte il suffit de redémarrer votre image Vagrant via cette commande à exécuter au même niveau que votre fichier Vagrantfile

vagrant reload

Et maintenant vous pouvez tester l'installation de votre Graphite en ouvrant cette url dans un navigateur https://localhost et vous devriez obtenir quelque chose comme cela

Grafana

Sur cette page vous pouvez télécharger la version de Grafana correspondant à votre système d'exploitation ou l'image docker. Moi j'ai pris la solution archive sous Windows. Une fois cette dernière décompresser je n'ai plus qu'à exécuter cette commande dans le dossier racine :

/bin/grafana-server

Pour vérifier que tout est bien démarré ouvrir cette url dans un navigateur http://localhost:3000, par défaut le compte de connexion c'est admin/admin. Ainsi vous devriez accéder à cette page :

Voilà la partie installation est terminée, facile.

Configuration

Nous avons nos trois éléments installés et opérationnels mais il nous reste un peu de configuration pour que toute la chaîne communique.

Gatling

Par défaut Gatling écrit uniquement des rapports au format HTML dans un répertoire et dans la console, mais il est également capable d'enregistrer les résultats des exécutions de scénarios sous forme de métriques dans Graphite. Pour cela il y a une toute petite configuration à ajouter dans le fichier gatling.conf du dossier conf à la racine de votre installation Gatling.

data {
    writers = [graphite, console, file]
    console {
      #light = false               
    }
    file {
      #bufferSize = 8192           
    }
    leak {
      #noActivityTimeout = 30  
    }
    graphite {
      #light = false             
      host = "127.0.0.1"         
      port = 2003                
      protocol = "tcp"           
      rootPathPrefix = "grafana.graphite.tb" 
      #bufferSize = 8192          
      #writeInterval = 1          
    }
  }

Dans cette configuration nous avons précisé à Gatling d'aller écrire les rapport dans Graphite en plus de la console et des fichiers HTML. Nous avons indiqué les informations correspondant à notre Graphite et quel préfixe sera ajouté à toutes nos clés de métriques envoyées par Gatling vers Grafana.

Grafana

Configuration de la Data Source

Pour pouvoir créer nos dashboards et nos alertes dans Grafana, il faut indiquer à ce dernier dans quel Graphite aller interroger en ajoutant une data source Graphite.

En cliquant sur le logo de Grafana vous faites apparaître un menu dans lequel vous avez une entrée "Data Sources" cliquez dessus, puis cliquez sur le bouton "+ Add data source"'.

Dans le formulaire

  • donnez un nom à votre data source, par exemple "graphite local"
  • pour le type sélectionné "Graphite"
  • dans URL "https://localhost"

Puis cliquez sur "ADD". Si la configuration fonctionne un message sur fond vert s'affiche sinon un message sur fond orange remonte une erreur.

Configuration de l'alerting

Comme cet article risque d'être un peu long si je décris tout ce qui concerne l'alerting dans Grafana, je vais simplement vous aiguiller vers un article que j'ai rédigé et qui décrit pas à pas toutes les étapes à suivre pour créer des alertes Grafana vers Slack.

Feu à volonté!

Maintenant que tout est en place et tout bien configuré vous allez pouvoir constater le fruit de votre travail, si vous ré-exécutez cette commande Gatling

%GATLING_HOME%/bin/gatling.bat -s "/ROOT_DES_SOURCES/gatling-sbt-plugin-demo/src/test/scala/computerdatabase/ComputerWorld"

Vous devriez voir dans Graphite des données

Le problème c'est que vous n'avez qu'une mesure, ce qui n'est pas terrible pour faire du suivi de performances ou créer des dashboards. Je vous propose donc de créer une tâche planifiée qui va se déclencher toutes les 5 minutes et qui va exécuter notre scénario Gatling. Ci-dessous le détail de la tache ainsi que le fichier source exécuté à adapter à votre environnement :

cd C:\Netapsys\TB\Gatling\gatling-charts-highcharts-bundle-2.2.2\bin
set NO_PAUSE=true
gatling -s "C:\Netapsys\TB\Grafana\gatling-sbt-plugin-demo\src\test\scala\computerdatabase\ComputerWorld"
cd C:\Netapsys\TB\Gatling\gatling-charts-highcharts-bundle-2.2.2\bin
Contenu du fichier bat de la tâche planifiée

Si vous laissez tourner le script pendant une heure vous aurez une dizaine de mesures.

Je vous donne également les sources du dashoboard dans lequel j'ai défini des wigdets qui représentent les temps de réponses ainsi que le nombre d'erreurs, dans lequel j'ai créé une alerte sur les temps de réponses. Vous pourrez l'importer dans Grafana :

Ce qui doit vous donner un dashboard qui ressemble à cela, en modifiant la plage de temps en fonction de vos dates de tests.

Et voici un exemple d'alerte reçue dans Slack.

Conclusion

Avec trois outils open source, vous pouvez vous créer rapidement votre système de surveillance des performances de votre application. Les scénarios sont entièrement personnalisables via Gatling, les canaux de notifications via Grafana sont multiples et tout cela est simple d'utilisation, alors allez-y lâchez-vous !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *