📘 Guide Étudiant - PerfShop¶
Bienvenue !¶
Ce guide vous accompagne dans l'apprentissage des tests de performance avec PerfShop.
🎯 Objectifs d'Apprentissage¶
À la fin de cette formation, vous saurez : 1. Identifier les problèmes de performance courants 2. Utiliser des outils de monitoring 3. Analyser des métriques système 4. Écrire des scripts de tests de charge 5. Proposer des solutions d'optimisation
📚 TP1 : Découverte de l'Application¶
Objectif¶
Comprendre le fonctionnement de PerfShop sans anomalie
Étapes¶
- Accéder à l'application (URL fournie par le formateur)
- Se connecter avec
user1@perfshop.com/password1 - Explorer le catalogue de produits
- Ajouter 3 produits au panier
- Compléter le processus de commande
- Noter le numéro de commande
Questions¶
- Combien de temps a pris le processus complet ?
- Combien d'étapes avant la confirmation de commande ?
- Quelles informations sont demandées ?
🔥 TP2 : Première Anomalie - Fuite Mémoire¶
Objectif¶
Observer et comprendre une fuite mémoire
Pré-requis¶
- Ouvrir le monitoring (URL fournie par le formateur)
- Ouvrir le Chaos Admin
Procédure¶
- Observer la baseline (sans anomalie)
- Regarder le graphique "JVM Heap Memory"
-
Noter la valeur stable de mémoire utilisée
-
Activer la fuite mémoire
- Aller sur Chaos Admin
- Mettre le slider "Memory Leak" à 100%
-
Retourner sur le monitoring
-
Observer l'évolution
- La mémoire monte rapidement
- Après ~20 secondes : crash de l'application
-
Les graphiques s'arrêtent de se rafraîchir
-
Rétablir l'application
- Demander au formateur de redémarrer
- Ou via SSH :
docker compose restart perfshop-app
Analyse¶
- Quelle était la mémoire max disponible ?
- À quelle vitesse la mémoire a-t-elle augmenté ?
- Pourquoi l'application a-t-elle crashé ?
- Comment éviter ce problème en production ?
🗄️ TP3 : Saturation du Pool de Connexions DB¶
Objectif¶
Comprendre l'impact d'un pool DB trop petit
Procédure¶
- Configuration normale
- Observer "Database Connection Pool" : 0-2 connexions actives
-
Naviguer normalement : tout fonctionne
-
Activer la saturation
- Chaos Admin → "DB Pool Saturation" à 80%
-
Les requêtes deviennent lentes
-
Tester avec charge
- Ouvrir 5 onglets du navigateur
- Naviguer simultanément dans chaque onglet
-
Observer les ralentissements
-
Observer les métriques
- Pool saturé : toutes les connexions utilisées
- Requêtes en attente
- Timeouts possibles
Analyse¶
- Combien de connexions max dans le pool ?
- Que se passe-t-il quand il n'y a plus de connexions disponibles ?
- Quelle est la solution pour améliorer les performances ?
⚡ TP4 : CPU Intensif¶
Objectif¶
Identifier un problème de CPU
Procédure¶
- Baseline CPU
- CPU usage : 0-5%
-
Réponses rapides
-
Activer CPU chaos à 50%
- Observer l'augmentation du CPU
-
Navigation ralentie
-
Analyser l'impact
- Mesurer le temps de chargement des pages
- Comparer avec/sans anomalie
Analyse¶
- Où est le CPU utilisé ? (voir code dans GitLab)
- Comment optimiser ces calculs ?
💼 TP5 : Chaos Métier — Anomalies fonctionnelles¶
Objectif¶
Identifier des anomalies silencieuses dans la logique e-commerce — prix incorrects, stock inconsistant, comportements inattendus — sans message d'erreur visible.
Pré-requis¶
- Être connecté avec
user1@perfshop.com/password1 - Ouvrir le Chaos Admin → onglet 💼 Chaos Métier
Procédure¶
Étape 1 — Niveau Junior (A1, A2, A3)¶
- Chaos Admin → 🟢 Junior (niveau 1)
- Choisir un produit à 99,99 € et noter le prix affiché — il sera arrondi à 99,00 € dans le panier (A2)
- Passer commande et relever le montant TTC affiché
- Calculer manuellement
montant_HT × 1,20— l'écart révèle la TVA à 19,6% au lieu de 20% (A1) - Retourner sur la fiche produit commandé — le stock est inchangé (A3)
Étape 2 — Niveau Confirmé (+A4, A5, A6, A7)¶
- Chaos Admin → 🟡 Confirmé (niveau 2)
- Double-cliquer rapidement sur "Commander" — vérifier dans "Mes commandes" : deux commandes identiques apparaissent (A5)
- Dans le formulaire de commande, saisir le code promo
TOTO123— il est accepté sans erreur et sans réduction (A6) - Observer l'email de confirmation reçu — les frais de port sont absents du récapitulatif (A4)
Étape 3 — Niveau Expert (+A8, A9, A10, A11)¶
- Chaos Admin → 🔴 Expert (niveau 3)
- Passer plusieurs commandes, puis comparer le total affiché dans "Mes commandes" avec la somme des commandes — le total est faux (A10)
- Se déconnecter, puis dans les 30 secondes appeler
GET /api/auth/status—graceActive: trueindique que la session est encore exploitable (A11) - Observer l'onglet 🎯 Métier du monitoring — les compteurs A1-A11 et les logs
WARN [BusinessChaos]apparaissent en temps réel
Analyse¶
- Quelles anomalies sont visibles dans l'interface ? Lesquelles sont uniquement détectables par les logs ?
- Quelle anomalie serait la plus grave en production ? Pourquoi ?
- Comment un test de régression automatisé aurait-il détecté A1 (TVA) ?
⚡ TP5b : Chaos Fonctionnel APM — Exceptions Java réelles¶
Objectif¶
Utiliser un outil APM (Tempo) pour identifier des exceptions JVM injectées dans le code, localiser la méthode fautive et comprendre la chaîne de causalité.
Pré-requis¶
- Accès à Grafana → dashboard APM ÉLÈVE ou APM FORMATEUR
- Accès à Grafana → source Tempo (traces)
- Chaos Admin → onglet ⚡ Chaos Fonctionnel
Niveau Junior — F1 NullPointerException (Level 1)¶
- Chaos Admin → 🟢 Junior (niveau 1)
- Tenter de passer une commande → HTTP 500
- Ouvrir Grafana → Tempo → filtrer :
{span.http.method = "POST"} | status = error - Cliquer sur la trace rouge → identifier le span en erreur
- Lire
exception.typeetexception.messagedans les attributs du span - Documenter : quelle méthode a levé l'exception ? quelle est sa cause réelle simulée ?
Niveau Confirmé — F2 StackOverflowError (Level 2)¶
- Chaos Admin → 🟡 Confirmé (niveau 2)
- Passer une commande → HTTP 500, stacktrace tronqué
- Dans Tempo, comparer la trace F1 et la trace F2 : le span en erreur est-il le même ? la durée ?
- Compter les frames répétitives dans le stacktrace → c'est la signature d'une récursion infinie
- Documenter la différence entre NPE et SOE en termes de diagnostic APM
Niveau Expert — F3 OutOfMemoryError (Level 3)¶
- Chaos Admin → 🔴 Expert (niveau 3)
- Appeler plusieurs fois
GET /api/products— observer la montée du heap dans Grafana - Dans Grafana → Pyroscope → profil
memory:alloc_objects→ identifierapplyF3CatalogOom - Corréler : GC pause (
jvm_gc_pause_seconds_sum) vs heap (jvm_memory_used_bytes) - Documenter : pourquoi le monitoring peut-il détecter F3 mais pas F4 ?
Niveau Master — F4 Corruption silencieuse (Level 4)¶
Le paradoxe APM
À ce niveau, toutes les traces sont vertes dans Tempo. Aucune exception. HTTP 200 partout. Pourtant le shop est dysfonctionnel. Votre mission : trouver le problème sans aucune alerte.
- Chaos Admin → ⭐ Master (niveau 4)
- Naviguer dans le shop → des prix semblent étranges, des produits apparaissent épuisés
- Vérifier dans Tempo : aucune trace rouge — tout est vert
- Appeler directement l'API :
- Comparer avec les données en BDD (via le formateur ou SSH)
- Identifier le point de divergence : l'anomalie est dans
GET /api/products/{id} - Consulter les logs du container :
[FunctionalChaos][F4]confirme les corruptions - Observer le counter Grafana F4 Corruptions silencieuses → il monte à chaque visite produit
Analyse finale — F4 vs F1/F2/F3¶
| Critère | F1/F2/F3 | F4 |
|---|---|---|
| Traces Tempo | 🔴 Erreur visible | ✅ Vert — invisible |
| HTTP status | 500 | 200 |
| Détection monitoring | Immédiate | Impossible sans inspection payload |
| Impact utilisateur | Crash fonctionnel | Données fausses — achat au mauvais prix |
| Gravité en production | Haute (visible) | Très haute (silencieuse) |
Questions¶
- Quel outil vous a permis de détecter F4 si le monitoring ne voit rien ?
- Comment un test de régression automatisé (Selenium/k6) aurait pu détecter F4 ?
- Quelle est la différence entre une anomalie "bruyante" (F1-F3) et "silencieuse" (F4) en termes de risque business ?
Objectif¶
Apprendre à gérer des tokens HTTP dynamiques dans un script de test, comme dans une vraie API d'entreprise.
Pré-requis¶
- Être connecté avec un compte de test (
user1@perfshop.com/password1) - Avoir JMeter ou k6 installé
- Ouvrir le Chaos Admin
Procédure¶
Étape 1 — Niveau Junior (Level 1)¶
- Chaos Admin → onglet 🔐 Chaos Scripting → cliquer sur 🟢 Junior
- Dans votre outil de test, créer un scénario avec les 3 étapes :
POST /api/auth/login→ extraireX-Session-Tokende la réponsePOST /api/cart/add→ injecterX-Session-Token+X-Request-ID(UUID généré)POST /api/orders→ mêmes headers- Sans les headers → l'API répond
400 Missing header: X-Session-Token - Avec les bons headers →
200 OKsur le panier,201 Createdsur la commande
Étape 2 — Niveau Confirmé (Level 2)¶
- Chaos Admin → 🟡 Confirmé
- Adapter le script : extraire aussi
X-Action-Tokenau login - Observer : après 30s sans appel, l'
X-Action-Tokenexpire →401 Action token expired - Implémenter la logique de renouvellement (re-login automatique si > 28s)
Étape 3 — Niveau Expert (Level 3)¶
- Chaos Admin → 🔴 Expert
- Extraire 5 tokens au login :
X-Session-Token,X-Action-Token,X-CSRF-Token,X-Step-Token,X-Signature - Après chaque appel réussi, mettre à jour CSRF, Step et Signature depuis la réponse
- Respecter la séquence : panier (
step1) avant commande (step2) - Tout doit se passer en moins de 15 secondes entre deux appels
Codes d'erreur Expert à connaître¶
| Code | Cause | Solution |
|---|---|---|
E-CSRF-01 |
CSRF manquant ou déjà utilisé | Extraire le nouveau CSRF depuis la réponse précédente |
E-STEP-04 |
Step hors séquence | Vérifier l'ordre : panier avant commande |
E-SIG-07 |
Signature invalide | Recalculer depuis les tokens actuels |
E-TKN-99 |
Chaîne expirée (15s) | Re-login pour obtenir une nouvelle chaîne |
Questions¶
- Quelle est la différence entre corrélation et extraction ?
- Comment gérer l'expiration dans un test de charge avec 100 utilisateurs simultanés ?
- Pourquoi les erreurs du niveau Expert sont-elles volontairement cryptiques ?
🔐 TP7 : Chaos Sécurité — Failles OWASP¶
Objectif¶
Identifier, exploiter et documenter des failles de sécurité web classiques injectées dans PerfShop, en suivant la méthodologie OWASP Top 10.
Pré-requis¶
- Avoir Burp Suite Community ou curl installé
- Ouvrir le Chaos Admin → onglet 🔒 Chaos Sécurité
- Ouvrir le monitoring → onglet 🔐 Chaos Sécurité (flux d’attaques en temps réel)
Usage pédagogique uniquement
Ces techniques ne doivent jamais être utilisées sur des systèmes réels.
Niveau Junior — S1, S2, S3¶
- Chaos Admin → 🟢 Junior (niveau 1)
- S1 — Injection SQL : appeler
GET /api/products/search?q=' OR '1'='1— observer si tous les produits sont retournés - S2 — IDOR : passer une commande, noter l’ID, se déconnecter, se reconnecter avec
user2@perfshop.com— accéder àGET /api/orders/<id_user1>— la réponse doit être200au lieu de403 - S3 — Hash exposé : appeler
GET /api/auth/meaprès login — observer le champpassworddans la réponse
Niveau Confirmé — +S4, S5, S6¶
- Chaos Admin → 🟡 Confirmé (niveau 2)
- S4 — XSS : passer une commande avec l’adresse
<script>alert('XSS')</script>— vérifier que la valeur est stockée telle quelle dans la réponse - S5 — Prix : intercepter
POST /api/ordersavec Burp Suite, modifierunitPriceà0.01— vérifier letotalAmountdans la réponse - S6 — Timing : mesurer les temps de réponse de
POST /api/auth/loginpour un email existant vs inexistant — l’écart de ~300ms révèle l’existence du compte
Niveau Expert — +S7, S8, S9¶
- Chaos Admin → 🔴 Expert (niveau 3)
- S7 — Token HMAC : se connecter, capturer le header
X-Debug-Tokendans la réponse, décoder la partie gauche en Base64url, modifier leuserId, re-signer avec la clésecret123 - S8 — Path Traversal : appeler
GET /api/orders/1/invoice?format=../../etc/passwd— observer le contenu simulé retourné - S9 — Mass Assignment : envoyer
PUT /api/auth/meavec{"email": "nouvel@email.fr", "password": "piraté"}— vérifier si les modifications sont appliquées
Niveau Master — Scénario chaîné S10 → S11 → S12¶
- Chaos Admin → ⭐ Master (niveau 4)
- Découverte : analyser le bundle JS du shop (DevTools → Sources) ou fuzzer les routes — trouver
/admin - S10 :
GET /api/admin/portal/stats(sans token) — relever l’emailadminContact - S11 :
POST /api/admin/portal/loginavec{"email": "admin' OR '1'='1' --", "password": "x"}— récupérer l’adminToken - S12 :
PUT /api/admin/portal/accounts/1/promoteavec headerX-Admin-Token: <token>— observerisSuperAdmin: true - Utiliser le token pour accéder au chaos-admin et au monitoring
Analyse¶
- Quelle faille est la plus facile à détecter avec un scanner automatique ?
- Quelle faille nécessite une intervention manuelle ? Pourquoi ?
- Dans le scénario Master, quelle est la faille « pivot » (sans laquelle les suivantes sont impossibles) ?
- Quel header HTTP révèle la présence du chaos niveau 3 ?
🎓 TP8 : Scénario Complet (Avancé)¶
Objectif¶
Diagnostiquer un problème sans savoir quelle anomalie est active
Mise en situation¶
Le formateur a activé 2-3 anomalies. Vous devez : 1. Identifier les symptômes 2. Consulter le monitoring 3. Formuler des hypothèses 4. Valider avec les métriques 5. Proposer des solutions
Méthodologie¶
- Observer les symptômes utilisateur
- Pages lentes ?
- Erreurs ?
-
Timeout ?
-
Consulter le monitoring
- Quelle métrique est anormale ?
-
Y a-t-il des pics ?
-
Corréler les données
- Mémoire haute + GC fréquents = fuite mémoire
- CPU 100% + threads bloqués = CPU intensif
-
Connexions DB saturées = pool trop petit
-
Vérifier les logs (via SSH)
-
Proposer une solution
- Augmenter le pool ?
- Optimiser le code ?
- Ajouter de la RAM ?
🛠️ Outils et Ressources¶
URLs (fournies par le formateur)¶
- Application : frontend
- Monitoring : dashboard temps réel
- Chaos Admin : panneau de contrôle anomalies
- Grafana : dashboards métriques
Comptes de Test¶
- user1 à user10 :
userN@perfshop.com/passwordN - Tests perfs :
perf.test1@perfshop.com/TestPerf123!
Commandes Utiles (SSH)¶
# Voir les logs
docker compose logs -f perfshop-app
# Redémarrer l'app
docker compose restart perfshop-app
# Réinitialiser tout
docker compose down
docker compose up -d
📊 Métriques à Surveiller¶
JVM¶
- Heap Memory : Mémoire utilisée / Max
- GC Pauses : Fréquence du garbage collector
- Threads Live : Nombre de threads actifs
Tomcat¶
- Busy Threads : Threads en cours d'exécution
- Request Count : Nombre de requêtes traitées
Database¶
- Active Connections : Connexions DB en cours
- Idle Connections : Connexions disponibles
HTTP¶
- Response Time p95 : 95% des requêtes en dessous de X ms
- Error Rate : Pourcentage d'erreurs
🎯 Conseils de Diagnostic¶
- Toujours commencer par le monitoring
- Chercher les anomalies visuelles (pics, saturation)
- Corréler plusieurs métriques (ne pas se fier à une seule)
- Reproduire le problème pour confirmer
- Tester la solution avant de conclure
📝 Livrables Attendus¶
Pour chaque TP, rédiger un rapport contenant : 1. Description du problème observé 2. Métriques relevées 3. Hypothèse de cause 4. Validation de l'hypothèse 5. Solution proposée 6. Résultat après correction
❓ FAQ¶
Q : L'application ne répond plus, que faire ?
R : Demander au formateur de redémarrer, ou via SSH : docker compose restart perfshop-app
Q : Comment réinitialiser les anomalies ?
R : Chaos Admin → bouton "Reset All to 0%"
Q : Puis-je modifier le code ?
R : Oui (Bac+4/5), le code est sur GitLab. Cloner, modifier, rebuild.
Q : JMeter ne se connecte pas ?
R : Vérifier l'URL de l'API fournie par le formateur
Bon apprentissage ! 🚀