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 :
memoryHeapCapest 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 :
memoryHeapCapabaissé à 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 unOutOfMemoryError— 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 :
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¶
Retourne la liste complète des 20 scénarios avec, pour chaque :
id— identifiant N1-01 → N4-05level— N1 / N2 / N3 / N4name— nom météo localisé selonPERFSHOP_LANGrequiresLicense— booléenaccessible— 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.