Aller au contenu

📘 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

  1. Accéder à l'application (URL fournie par le formateur)
  2. Se connecter avec user1@perfshop.com / password1
  3. Explorer le catalogue de produits
  4. Ajouter 3 produits au panier
  5. Compléter le processus de commande
  6. 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

  1. Observer la baseline (sans anomalie)
  2. Regarder le graphique "JVM Heap Memory"
  3. Noter la valeur stable de mémoire utilisée

  4. Activer la fuite mémoire

  5. Aller sur Chaos Admin
  6. Mettre le slider "Memory Leak" à 100%
  7. Retourner sur le monitoring

  8. Observer l'évolution

  9. La mémoire monte rapidement
  10. Après ~20 secondes : crash de l'application
  11. Les graphiques s'arrêtent de se rafraîchir

  12. Rétablir l'application

  13. Demander au formateur de redémarrer
  14. 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

  1. Configuration normale
  2. Observer "Database Connection Pool" : 0-2 connexions actives
  3. Naviguer normalement : tout fonctionne

  4. Activer la saturation

  5. Chaos Admin → "DB Pool Saturation" à 80%
  6. Les requêtes deviennent lentes

  7. Tester avec charge

  8. Ouvrir 5 onglets du navigateur
  9. Naviguer simultanément dans chaque onglet
  10. Observer les ralentissements

  11. Observer les métriques

  12. Pool saturé : toutes les connexions utilisées
  13. Requêtes en attente
  14. 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

  1. Baseline CPU
  2. CPU usage : 0-5%
  3. Réponses rapides

  4. Activer CPU chaos à 50%

  5. Observer l'augmentation du CPU
  6. Navigation ralentie

  7. Analyser l'impact

  8. Mesurer le temps de chargement des pages
  9. 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)

  1. Chaos Admin → 🟢 Junior (niveau 1)
  2. Choisir un produit à 99,99 € et noter le prix affiché — il sera arrondi à 99,00 € dans le panier (A2)
  3. Passer commande et relever le montant TTC affiché
  4. Calculer manuellement montant_HT × 1,20 — l'écart révèle la TVA à 19,6% au lieu de 20% (A1)
  5. Retourner sur la fiche produit commandé — le stock est inchangé (A3)

Étape 2 — Niveau Confirmé (+A4, A5, A6, A7)

  1. Chaos Admin → 🟡 Confirmé (niveau 2)
  2. Double-cliquer rapidement sur "Commander" — vérifier dans "Mes commandes" : deux commandes identiques apparaissent (A5)
  3. Dans le formulaire de commande, saisir le code promo TOTO123 — il est accepté sans erreur et sans réduction (A6)
  4. 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)

  1. Chaos Admin → 🔴 Expert (niveau 3)
  2. Passer plusieurs commandes, puis comparer le total affiché dans "Mes commandes" avec la somme des commandes — le total est faux (A10)
  3. Se déconnecter, puis dans les 30 secondes appeler GET /api/auth/statusgraceActive: true indique que la session est encore exploitable (A11)
  4. 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)

  1. Chaos Admin → 🟢 Junior (niveau 1)
  2. Tenter de passer une commande → HTTP 500
  3. Ouvrir Grafana → Tempo → filtrer : {span.http.method = "POST"} | status = error
  4. Cliquer sur la trace rouge → identifier le span en erreur
  5. Lire exception.type et exception.message dans les attributs du span
  6. Documenter : quelle méthode a levé l'exception ? quelle est sa cause réelle simulée ?

Niveau Confirmé — F2 StackOverflowError (Level 2)

  1. Chaos Admin → 🟡 Confirmé (niveau 2)
  2. Passer une commande → HTTP 500, stacktrace tronqué
  3. Dans Tempo, comparer la trace F1 et la trace F2 : le span en erreur est-il le même ? la durée ?
  4. Compter les frames répétitives dans le stacktrace → c'est la signature d'une récursion infinie
  5. Documenter la différence entre NPE et SOE en termes de diagnostic APM

Niveau Expert — F3 OutOfMemoryError (Level 3)

  1. Chaos Admin → 🔴 Expert (niveau 3)
  2. Appeler plusieurs fois GET /api/products — observer la montée du heap dans Grafana
  3. Dans Grafana → Pyroscope → profil memory:alloc_objects → identifier applyF3CatalogOom
  4. Corréler : GC pause (jvm_gc_pause_seconds_sum) vs heap (jvm_memory_used_bytes)
  5. 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.

  1. Chaos Admin → ⭐ Master (niveau 4)
  2. Naviguer dans le shop → des prix semblent étranges, des produits apparaissent épuisés
  3. Vérifier dans Tempo : aucune trace rouge — tout est vert
  4. Appeler directement l'API :
    curl -s https://perfshop-api.perfshop.io/api/products/1 | jq '{price, stock, description}'
    
  5. Comparer avec les données en BDD (via le formateur ou SSH)
  6. Identifier le point de divergence : l'anomalie est dans GET /api/products/{id}
  7. Consulter les logs du container : [FunctionalChaos][F4] confirme les corruptions
  8. 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)

  1. Chaos Admin → onglet 🔐 Chaos Scripting → cliquer sur 🟢 Junior
  2. Dans votre outil de test, créer un scénario avec les 3 étapes :
  3. POST /api/auth/loginextraire X-Session-Token de la réponse
  4. POST /api/cart/addinjecter X-Session-Token + X-Request-ID (UUID généré)
  5. POST /api/orders → mêmes headers
  6. Sans les headers → l'API répond 400 Missing header: X-Session-Token
  7. Avec les bons headers → 200 OK sur le panier, 201 Created sur la commande

Étape 2 — Niveau Confirmé (Level 2)

  1. Chaos Admin → 🟡 Confirmé
  2. Adapter le script : extraire aussi X-Action-Token au login
  3. Observer : après 30s sans appel, l'X-Action-Token expire → 401 Action token expired
  4. Implémenter la logique de renouvellement (re-login automatique si > 28s)

Étape 3 — Niveau Expert (Level 3)

  1. Chaos Admin → 🔴 Expert
  2. Extraire 5 tokens au login : X-Session-Token, X-Action-Token, X-CSRF-Token, X-Step-Token, X-Signature
  3. Après chaque appel réussi, mettre à jour CSRF, Step et Signature depuis la réponse
  4. Respecter la séquence : panier (step1) avant commande (step2)
  5. 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

  1. Chaos Admin → 🟢 Junior (niveau 1)
  2. S1 — Injection SQL : appeler GET /api/products/search?q=' OR '1'='1 — observer si tous les produits sont retournés
  3. 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 être 200 au lieu de 403
  4. S3 — Hash exposé : appeler GET /api/auth/me après login — observer le champ password dans la réponse

Niveau Confirmé — +S4, S5, S6

  1. Chaos Admin → 🟡 Confirmé (niveau 2)
  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
  3. S5 — Prix : intercepter POST /api/orders avec Burp Suite, modifier unitPrice à 0.01 — vérifier le totalAmount dans la réponse
  4. S6 — Timing : mesurer les temps de réponse de POST /api/auth/login pour un email existant vs inexistant — l’écart de ~300ms révèle l’existence du compte

Niveau Expert — +S7, S8, S9

  1. Chaos Admin → 🔴 Expert (niveau 3)
  2. S7 — Token HMAC : se connecter, capturer le header X-Debug-Token dans la réponse, décoder la partie gauche en Base64url, modifier le userId, re-signer avec la clé secret123
  3. S8 — Path Traversal : appeler GET /api/orders/1/invoice?format=../../etc/passwd — observer le contenu simulé retourné
  4. S9 — Mass Assignment : envoyer PUT /api/auth/me avec {"email": "nouvel@email.fr", "password": "piraté"} — vérifier si les modifications sont appliquées

Niveau Master — Scénario chaîné S10 → S11 → S12

  1. Chaos Admin → ⭐ Master (niveau 4)
  2. Découverte : analyser le bundle JS du shop (DevTools → Sources) ou fuzzer les routes — trouver /admin
  3. S10 : GET /api/admin/portal/stats (sans token) — relever l’email adminContact
  4. S11 : POST /api/admin/portal/login avec {"email": "admin' OR '1'='1' --", "password": "x"} — récupérer l’adminToken
  5. S12 : PUT /api/admin/portal/accounts/1/promote avec header X-Admin-Token: <token> — observer isSuperAdmin: true
  6. 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

  1. Observer les symptômes utilisateur
  2. Pages lentes ?
  3. Erreurs ?
  4. Timeout ?

  5. Consulter le monitoring

  6. Quelle métrique est anormale ?
  7. Y a-t-il des pics ?

  8. Corréler les données

  9. Mémoire haute + GC fréquents = fuite mémoire
  10. CPU 100% + threads bloqués = CPU intensif
  11. Connexions DB saturées = pool trop petit

  12. Vérifier les logs (via SSH)

    docker compose logs perfshop-app | tail -100
    

  13. Proposer une solution

  14. Augmenter le pool ?
  15. Optimiser le code ?
  16. 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

  1. Toujours commencer par le monitoring
  2. Chercher les anomalies visuelles (pics, saturation)
  3. Corréler plusieurs métriques (ne pas se fier à une seule)
  4. Reproduire le problème pour confirmer
  5. 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 ! 🚀