Imaginez que votre équipe soit confrontée aux questions suivantes:  

  • Quelle est la performance de l'application?
  • Quel serait le goulot d'étranglement du système?
  • Y a-t-il des améliorations à apporter à notre architecture ou à notre infrastructure?

Les systèmes peuvent tomber en panne à tout moment. Que peut-on faire pour découvrir et explorer la cause? Qu'est-ce qui peut rendre le système tolérant aux pannes? Quelle stratégie devrait être utilisée?  J'ai, comme beaucoup, été confronté à ces questions lors d'analyses sur les systèmes que je gère. J'ai ainsi décidé d’utiliser les tests de charge pour m'aider à trouver les réponses.  

Mais que sont les tests de charge? Ce sont des tests dont l'objectif principal est de trouver la limite de capacité de l'application, en identifiant le facteur limitant (logiciel, matériel, temps de réponse).  

Comment Vegeta peut-il nous aider?

VEGETA IN ACTION

Yeah !!! Vegeta a des super pouvoirs! Le pas à pas serait:  Créez un fichier de cibles avec les noeuds finaux souhaités. Créer une requête JSON. (optionnel) Ouais! Allons-y!!! Végéta attaque !!! Quel point final voulons-nous tester? Une liste de points de terminaison et de leurs méthodes respectives doit être placée dans le fichier de cibles, telle que:

Création de fichiers requests

Lorsqu'un point de terminaison POST / PUT sera testé, un fichier de demande doit être créé. Par exemple:  

Que se passe-t-il lorsque Végéta attaque?

Lorsque Végéta attaque, il génère un rapport qui peut ultérieurement être utilisé pour une analyse exploratoire. A la fin de l'attaque, nous pouvons générer un rapport avec la commande suivante:   Le rapport peut être généré dans d'autres formats, par exemple:

  • Il fournit également un rapport pratique: JSON / CSV / Plot HTML

+ Nombre de cpu à consommer + Nombre de demandes + Nombre de requêtes par seconde (simultanéité) + Nombre de redirections à suivre + Activer http2 ou non

Installer Vegeta

Sur MacOS :

brew update && brew install vegeta

Usage

Par exemple pour mon site perso :

$ MBP-de-admin:~ admin$ echo "GET https://gabrielsagnard.fr" | vegeta attack -duration=5s | tee results.bin | vegeta report

Résultat :

Requests      [total, rate]            250, 50.18
Duration      [total, attack, wait]    5.001774633s, 4.981819989s, 19.954644ms
Latencies     [mean, 50, 95, 99, max]  389.651051ms, 25.082975ms, 1.670175407s, 1.859901894s, 1.910520583s
Bytes In      [total, mean]            2088500, 8354.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:250
Error Set:

La capture d'écran ci-dessous montre un test avec 250 demandes par seconde, la durée est de 5 secondes.

Report shows facts:+ 100% successful responses (with 2xx status code)+ 0.0 % failed with status code 200 & 250+ Average latency time: 389ms; Max latency time: 1.9s

cat results.bin | vegeta report -reporter=plot > plot.html

En vous rendant désormais dans votre répertoire principal de votre poste, vous trouverez un fichier plot.html, ouvrez-le et voici ce que vous allez découvrir.

Cette image est un tracé qui montre une demande, l'axe des X représente le temps au début de la demande et l'axe des Y représente le temps pris pour compléter cette demande.

Deuxième cas d'usage

On teste avec le même site mais avec un peu plus de puissance et de durée :

MBP-de-admin:~ admin$ echo "GET https://gabrielsagnard.fr" | vegeta attack -duration=10s -rate=200 | tee results.bin | vegeta report
Requests      [total, rate]            2000, 200.08
Duration      [total, attack, wait]    10.016558609s, 9.996189255s, 20.369354ms
Latencies     [mean, 50, 95, 99, max]  422.654591ms, 21.292762ms, 2.31722311s, 2.561201466s, 3.172324732s
Bytes In      [total, mean]            16708000, 8354.00
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  100.00%
Status Codes  [code:count]             200:2000
Error Set:

Troisième cas d'usage : analyse en temps réel

Si vous êtes un utilisateur satisfait d’iTerm, vous pouvez intégrer Vegeta avec jplot en utilisant jaggr pour créer un rapport vegeta en temps réel dans le confort de votre terminal, il faut au préalable installer ces paquets depuis Brew :

brew install rs/tap/jaggr
brew install rs/tap/jplot

Après quoi il suffit de lancer cette commande adaptée à votre besoin et au site et le port que vous souhaitez viser :

echo 'GET http://localhost:8080' | \
    vegeta attack -rate 5000 -duration 10m | vegeta encode | \
    jaggr @count=rps \
          hist\[100,200,300,400,500\]:code \
          p25,p50,p95:latency \
          sum:bytes_in \
          sum:bytes_out | \
    jplot rps+code.hist.100+code.hist.200+code.hist.300+code.hist.400+code.hist.500 \
          latency.p95+latency.p50+latency.p25 \
          bytes_in.sum+bytes_out.sum

Et voici le résultat :

Vous l'aurez compris, vous pouvez quasiment tout attaquer avec Vegeta, http, https, ports spécifiques, le tout depuis un simple terminal et en générant des captures visuelles de vos attaques.

Le projet est ici :

https://github.com/tsenart/vegeta

Have fun with Vegeta ;)