Load testing de vos APIs avec Vegeta – Sabri Taleb

D’après l’ISTQB, le load testing est un type de test de performance effectué pour évaluer le comportement d’un composant ou d’un système sous des charges variables, habituellement entre des conditions prévues d’utilisation faible, typique et de pointe.

Dans le cadre d’un projet de développement d’une application exposant des services REST, qui permet la recherche et la consultation de données de référentiels et pour lesquelles d’autres applications iront interroger, je voulais mettre en place des tests de charge et voir quel est le comportement de ces APIs en les stressant.

Avant de commencer une campagne de test avec un outil comme jMeter ou Locust (ou autre), je cherchais d’abord un outil simple et rapide à mettre à disposition de tous.

L’objectif ? Valider en moins de 5 min que les APIs allaient tenir une charge importante avec un minimum de config, de code. Mes recherches m’ont amené vers le prince des Saiyans, Vegeta.

Etant un grand fan de Dragon Ball Z, c’est tout naturellement que je me suis penché vers cet outil pour me renseigner et découvrir un outil de Load testing.

Vegeta est un outil de Load testing écrit en Go pour les services HTTP. Son utilisation est extrêmement simple, en une seule ligne de commande il est possible de tester n’importe quels services HTTP. Wohou, c’est exactement ce que je recherchais ! Impatient de commencer !

Premièrement, installer Vegeta est très simple, un tar.gz (disponible ici) à télécharger et décompresser et c’est bon.

Deuxièmement, il faut lister les cibles à tester dans un fichier texte (que j’appelle targets.txt)

exemple : 

GET http://localhost:8080/path/to/first/route

GET http://localhost:8080/path/to/second/route

GET http://localhost:8080/path/to/third/route

Ici, j’ai utilisé le GET mais n’importe quel type de routes (PUT, POST etc) peut être tapée par Vegeta.

Ensuite ? ben ensuite on envoie Vegeta à son occupation favorite, à savoir taper sur tout ce qui bouge.

En utilisant la ligne de commande suivante : 

vegeta attack -targets targets.txt

Par défaut, Vegeta va attaquer toutes les APIs listées dans le fichier avec un taux de 50 requêtes par seconde et dans un temps indéfini tant qu’on ne l’arrête pas. Pour lui demander ce que l’on veut, il faut ajouter des options comme :

  • l’option header qui permet d’ajouter un header HTTP à toutes les requêtes.
  • l’option rate qui permet de régler le nombre de requêtes par secondes.
  • l’option duration qui permet de régler le temps de l’attaque en secondes.

une requête plus complexe : 

vegeta attack -targets targets.txt -header AppId:c7c734e9 -rate=20 -duration=30s

Cette commande se traduit par : Vegeta, prends ces cibles et tape les avec un taux de 20 attaques par seconde pendant 30 secondes, soit 600 requêtes au total.

Et les rapports dans tout ça ?
Ne vous en faites pas, Vegeta vous propose, via la commande plot, de générer une page html avec un graphique de statistiques complet de l’attaque.

vegeta attack -targets=targets.txt -header AppId:c7c734e9 -name=300qps -rate=300 -duration=25s > results.300qps.bin;cat results.300qps.bin | vegeta plot > plot.300qps.html

(Sur cet exemple, on peut voir que l’API implose totalement avec le nombre croissant de requêtes)

Voilà comment en quelques minutes (installation comprise), nous sommes capable de faire un retour aux développeurs pour les aider à concevoir des APIs plus performantes.

Une fois les corrections apportées et la tenue en charge des APIs, on peut aller plus loin avec Vegeta et sa puissance destructrice en appliquant un burst.

Vegeta est capable d’appliquer une très forte charge en très peu de temps. Dans l’exemple, c’est 1500 requêtes/seconde pendant 5 secondes.

vegeta attack -targets=targets.txt -header AppId:c7c734e9 -name=1500qps -rate=1500 -duration=5s > results.1500qps.bin;cat results.1500qps.bin | vegeta plot > plot.1500qps.html

Essai concluant pour cet API qui, malgré un début ou l’API met du temps à répondre, elle arrive à tenir le burst violent.

Vegeta est aussi capable d’exercer un taux constant d’attaque sur une durée rallongée (dans les limites des capacités de la machine). Dans l’exemple, c’est 1500 requêtes/sec pendant 10 minutes, soit un total de 900 000 requêtes (rien que ça, il ne faut pas embêter le prince des Saiyans…)

vegeta attack -targets=targets.txt -header AppId:c7c734e9 -name=1500qps -rate=1500 -duration=600s > results.1500qps.bin;cat results.1500qps.bin | vegeta plot > plot.1500qps.html;cat results.1500qps.bin | vegeta report -type=text

Requests      DurationLatencies
Bytes InBytes OutSuccessStatus Codes
[total, rate, throughput][total, attack, wait][mean, 50, 95, 99, max]
[total, mean][total, mean] [ratio][code:count] 
900000, 1500.00, 1500.0010m0.000316382s, 9m59.999580104s, 736.278µs1.991021ms, 663.902µs, 4.565085ms, 11.903513ms, 1.032112359s895882509, 995.420, 0.00100.00%200:900000

Load testing concluant.

Conclusion

Cet outil est une agréable surprise tant il est simple à utiliser et à générer des rapports permettant de faire des tests de charge très traumatisant pour les APIs. 

Bien sûr que si on veut complexifier les scénarios utilisateurs, mieux vaut se tourner vers des outils comme Locust ou jMeter, mais pour une alternative rapide et efficace, Vegeta peut très bien faire l’affaire (je suis fan, du nom en tout cas).

A propos de l’auteur: Sabri Taleb

Docteur en chimie de formation, j’ai décidé de me reconvertir dans le domaine de l’IT. Après avoir suivi une formation de 3 mois en développement Java JEE, j’ai suivi une formation pour devenir testeur avec l’obtention de la certification ISTQB niveau fondation.

Publié par

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s