Aller au contenu

Scénarios météo

Les scénarios météo sont 20 presets pré-calibrés qui combinent plusieurs leviers de Chaos Performance (backend + frontend) en un seul clic étudiant. Ils sont définis dans la classe PerformanceScenario.java sous la forme d'un catalogue immuable (PerformanceScenario.ALL) et exposés à l'étudiant via GET /api/chaos/student/performance/scenarios.

Chaque scénario porte un nom météorologique opaque (Brise légère, Tempête de sable…) — l'étudiant ne voit ni les leviers activés, ni leur intensité. C'est volontaire : le but est qu'il diagnostique le comportement à partir des dashboards d'observabilité et non en lisant la configuration chaos.

Niveaux N1 → N4

Les scénarios sont organisés en 4 niveaux de difficulté progressive, nommés N1 à N4 (à ne pas confondre avec les niveaux 0 – 4 unifiés des autres familles de chaos) :

Niveau Label Scénarios Profil pédagogique
N1 Junior N1-01 → N1-05 Diagnostic basique — un seul levier dominant
N2 Confirmé N2-01 → N2-05 Combinaisons de 2 leviers cohérents
N3 Expert N3-01 → N3-05 Diagnostic différentiel, plusieurs leviers
N4 Master N4-01 → N4-05 Saturation extrême — tous les indicateurs au rouge

Freemium

Seuls N1-01 (Brise légère) et N1-02 (Brume matinale) sont accessibles sans licence. Les 18 autres scénarios retournent un HTTP 402 (LICENSE_REQUIRED) à l'étudiant freemium. Le formateur garde l'accès total via le panneau chaos-admin.

Catalogue exhaustif

Les valeurs ci-dessous sont extraites directement de PerformanceScenario.buildCatalogue(). Les colonnes représentent les intensités appliquées aux leviers backend et frontend ; un tiret signifie que le levier est inactif (valeur 0 ou défaut).

Niveau N1 — Junior

ID Nom (FR) Free CPU Mem DB Thrd SQL Net FE-Mem
N1-01 Brise légère 40
N1-02 Brume matinale 30
N1-03 Grain passager 40
N1-04 Crachin réseau 30
N1-05 Nuage de passage 30 20

Niveau N2 — Confirmé

ID Nom (FR) CPU Mem DB Thrd SQL Net FE-Fch
N2-01 Vent de travers 60 50
N2-02 Étang gelé 50
N2-03 Bourrasque 40 60
N2-04 Brouillard double 30 60
N2-05 Marée montante 60

Note N2-05 : memoryHeapCap est abaissé à 70 % (au lieu du défaut 80 %) pour resserrer le garde-fou.

Niveau N3 — Expert

ID Nom (FR) CPU Ratio Mem DB Thrd SQL DL Net FE-Mem
N3-01 Tempête de sable 80 3 60
N3-02 Gel profond 70 40
N3-03 Déluge croisé 80 70
N3-04 Front orageux 70 70
N3-05 Cyclone en formation 70 2 60 40

Note N3-03 : memoryHeapCap abaissé à 50 % — la fuite mémoire backend est plafonnée plus tôt et combinée avec une fuite mémoire frontend.

Niveau N4 — Master

ID Nom (FR) CPU Ratio Mem DB Thrd SQL DL Net FE-tout
N4-01 Ouragan 95 5
N4-02 Effondrement 90 80 70
N4-03 Point de rupture 105
N4-04 Tsunami 50 100
N4-05 Tempête parfaite 80 70 80 70 60

Notes N4 :

  • N4-03 Point de rupture : memory = 105 + memoryHeapCap = 100 → c'est le mode OOM intentionnel. Le scénario provoque délibérément un OutOfMemoryError — utile pour générer un heap dump pédagogique exploitable sous Eclipse MAT.
  • N4-04 Tsunami : active simultanément les quatre chaos frontend à 100 % (feCpuBurn, feMemoryLeak, feDomFlood, feFetchFlood) en plus d'un CPU backend à 50 %.
  • N4-05 Tempête parfaite : combine 5 leviers backend simultanés.

Activation par l'étudiant

L'étudiant active un scénario via POST /api/chaos/student/performance/scenario en envoyant un body JSON contenant l'identifiant du scénario :

curl -X POST https://perfshop-api.perfshop.io/api/chaos/student/performance/scenario \
  -H "Content-Type: application/json" \
  -d '{"scenarioId": "N2-03"}'

Réponse en cas de succès :

{
  "success":    true,
  "scenarioId": "N2-03",
  "name":       "Bourrasque",
  "level":      "N2",
  "active":     true
}

L'endpoint exige que le mode étudiant soit activé par le formateur (studentModeService.isEnabled()). Sans cela, il retourne 403 avec student.error.blocked.

Codes d'erreur

Code Cause
400 scenarioId inconnu (student.scenario.unknown)
402 LICENSE_REQUIRED — scénario hors freemium
403 Mode étudiant désactivé par le formateur

Désactivation

Pour désactiver le scénario actif, l'étudiant envoie une chaîne vide :

curl -X POST https://perfshop-api.perfshop.io/api/chaos/student/performance/scenario \
  -H "Content-Type: application/json" \
  -d '{"scenarioId": ""}'

Le backend appelle alors chaosService.resetAll() et frontendChaosController.resetState()tous les leviers Performance (backend et frontend) sont remis à zéro, pas seulement ceux du scénario courant. La réponse est { success: true, scenarioId: "", active: false }.

Listage et statut courant

curl https://perfshop-api.perfshop.io/api/chaos/student/performance/scenarios

Retourne la liste complète des 20 scénarios avec, pour chaque :

  • id — identifiant N1-01 → N4-05
  • level — N1 / N2 / N3 / N4
  • name — nom météo localisé selon PERFSHOP_LANG
  • requiresLicense — booléen
  • accessible — booléen calculé (!requiresLicense || licenseValid)

Le champ activeScenario du body de réponse contient l'identifiant du scénario courant (chaîne vide si aucun n'est actif).

Pertinence pédagogique

Quelques scénarios emblématiques et la compétence de diagnostic qu'ils ciblent :

Scénario Compétence diagnostiquée
N1-01 Brise légère Lire container_cpu_usage et corréler avec la latence p99
N1-02 Brume matinale Analyser un heap JS qui croît dans Chrome DevTools
N2-02 Étang gelé Détecter une saturation hikaricp_connections_pending
N2-04 Brouillard double Distinguer pression réseau backend vs flood frontend
N3-02 Gel profond Diagnostic différentiel pool DB + deadlock MySQL
N3-03 Déluge croisé Différencier fuite mémoire backend vs fuite mémoire navigateur
N3-05 Cyclone formation Trois leviers simultanés — corrélation multi-métriques
N4-03 Point de rupture Génération et analyse d'un heap dump avec Eclipse MAT
N4-04 Tsunami Diagnostic d'un crash navigateur — quatre vecteurs frontend
N4-05 Tempête parfaite Synthèse complète — toutes les compétences précédentes

Réconciliation automatique

Le contrôleur ChaosStudentController réconcilie automatiquement le champ activeScenarioId à null quand tous les leviers sont à zéro (méthode isAllChaosOff()). Cela évite qu'un scénario reste affiché « actif » après un reset manuel via le panneau formateur.

Validation au démarrage

Chaque scénario est validé par le Builder.build() au chargement de la classe : cpu ∈ [0, 100], cpuRatio ∈ [1, 5], memory ∈ [0, 100] ∪ {105}, memoryHeapCap ∈ [0, 100], etc. Une valeur hors plage déclenche une IllegalArgumentException au démarrage du backend — le catalogue est fail-fast.