Chaos Fonctionnel¶
Le Chaos Fonctionnel injecte de vraies exceptions Java dans le parcours applicatif, à des endroits ciblés du code. Contrairement au Chaos Performance qui dégrade l'infrastructure, ce chaos dégrade le code lui-même : NPE, StackOverflow, OutOfMemory, et corruption silencieuse de données.
L'objectif pédagogique est que l'étudiant apprenne à identifier la méthode fautive via l'APM (Tempo, Pyroscope) et à comprendre le type d'exception sans avoir accès au code source.
Service et endpoint¶
Classe : FunctionalChaosService.java
Controller : FunctionalChaosController.java
Endpoint admin : POST /api/admin/chaos/functional body {"level": 0-4}
Endpoint public : GET /api/chaos/public/functional/{status,logs,anomalies}
Niveaux¶
| Niveau | Label | Anomalies actives | Cumul |
|---|---|---|---|
| 0 | Désactivé | aucune | 0 |
| 1 | Junior | F1 | 1 |
| 2 | Confirmé | F1, F2 | 2 |
| 3 | Expert | F1, F2, F3 | 3 |
| 4 | Master | F1, F2, F3, F4 | 4 |
Comme toutes les autres familles, les niveaux sont cumulatifs : passer du niveau 2 au niveau 3 ajoute F3 sans désactiver F1 et F2.
F1 — NullPointerException paiement¶
Niveau requis : 1+ (Junior)
Méthode injectrice : applyF1PaymentNpe(String paymentMethod)
Métrique : chaos_functional_f1_npe
Compteur : cntF1
Anomalie simulée¶
NullPointerException levée dans le service de paiement
(processPaymentPublic) — toute commande échoue avec un HTTP 500. Le
message exact de l'exception est :
Payment gateway configuration is null — service 'PaymentGatewayConfig'
not initialized (injected fault)
Symptômes observables¶
- Toutes les commandes retournent HTTP 500 sur
POST /api/orders - Tempo : span
OrderService.createOrder→ enfantOrderService.processPaymentPublicmarquéERRORavecexception.type = java.lang.NullPointerException - Logs Loki :
[FunctionalChaos][F1] NullPointerException injectee dans processPaymentPublic — methode={paymentMethod} - Activity log : entrée
F1_NPEavec sévéritéERROR
Pédagogie associée¶
Diagnostic d'une cause racine non triviale via la stack Tempo. L'étudiant
doit identifier que la NPE est dans une dépendance injectée (null) et non
dans le code business — un classique des configs externes manquantes.
F2 — StackOverflowError calcul commande¶
Niveau requis : 2+ (Confirmé)
Méthode injectrice : applyF2CalculationStackOverflow(String orderRef)
Métrique : chaos_functional_f2_stackoverflow
Anomalie simulée¶
StackOverflowError levée dans le calcul du total commande
(calculateOrderTotal) via une récursion infinie pure :
Symptômes observables¶
- HTTP 500 sur
POST /api/orders(comme F1, mais cause différente) - Tempo : span
ERRORavec stack trace répétitive — le même frametriggerRecursionapparaît 50+ fois dans la stack tronquée - Logs Loki :
[FunctionalChaos][F2] StackOverflowError injectee dans calculateOrderTotal — ref={orderRef} - Activity log :
F2_STACKOVERFLOWsévéritéERROR
Pédagogie associée¶
Diagnostic différentiel avec F1 : les deux produisent un HTTP 500 sur
/api/orders, mais la signature dans Tempo est radicalement différente
(NPE = stack courte avec une cause claire ; SOE = stack ultra-longue avec
récursion). L'étudiant doit savoir lire une stack trace pour distinguer
les deux familles d'erreurs.
F3 — OutOfMemoryError catalogue¶
Niveau requis : 3+ (Expert)
Méthode injectrice : applyF3CatalogOom()
Métrique : chaos_functional_f3_oom
Anomalie simulée¶
Allocation heap massive dans getAllProducts() jusqu'à provoquer un
OutOfMemoryError :
java.util.ArrayList<byte[]> leak = new java.util.ArrayList<>();
while (true) {
leak.add(new byte[8 * 1024 * 1024]); // 8 MB par itération
}
Symptômes observables¶
- Le catalogue produits (
GET /api/products) devient inaccessible - Heap dump automatique si
-XX:+HeapDumpOnOutOfMemoryErrorest actif (PerfShop l'expose aussi via/actuator/heapdump— cet endpoint est exclu du chaos pour rester fonctionnel) - Tempo : span
ERRORavecexception.type = java.lang.OutOfMemoryError - Métriques JVM :
jvm_memory_used_bytes{area="heap"}saturé,jvm_gc_pause_secondsexplose juste avant le crash
Pédagogie associée¶
Production et analyse d'un heap dump Eclipse MAT : l'étudiant identifie
le byte[] dominant via le Dominator Tree et remonte la chaîne
jusqu'à applyF3CatalogOom. C'est le scénario phare du parcours « heap
dump » de PerfShop.
F4 — Corruption silencieuse données produit¶
Niveau requis : 4 (Master)
Méthode injectrice : applyF4DataCorruption(Product product)
Métrique : chaos_functional_f4_corruption
Anomalie simulée¶
C'est l'anomalie la plus piégeuse du chaos fonctionnel. Aucune
exception n'est levée. La méthode retourne un objet Product corrompu :
| Champ | Transformation appliquée |
|---|---|
price |
Multiplié par 1.5 (arrondi HALF_UP, scale 2) |
stock |
Forcé à 0 |
description |
Tronquée à 30 caractères + suffixe [ERREUR: donnees tronquees] |
id, name, category, imageUrl, dates |
Inchangés (garde l'identité visuelle) |
Symptômes observables¶
- HTTP 200 sur
GET /api/products/{id}— aucune erreur - Tempo vert — aucune exception ne remonte
- Aucune métrique d'erreur ne bouge
- Seul moyen de diagnostic : inspection manuelle du payload — comparer les prix retournés aux prix attendus, vérifier que les descriptions ne sont pas tronquées, que le stock n'est pas systématiquement à 0
- Logs Loki (le seul indice) :
[FunctionalChaos][F4] Corruption silencieuse produit id={id} name='{name}' — prix {old} -> {new}, stock {old} -> 0
Pédagogie associée¶
C'est l'anomalie qui démontre les limites de l'observabilité automatique. APM, monitoring, alerting : tout est vert. Le diagnostic exige soit une suite de tests d'assertion (Robot Framework, Cucumber), soit une analyse manuelle de la base de données. Idéal pour discuter de la couverture fonctionnelle des tests automatisés.
API — endpoints publics¶
| Endpoint | Description |
|---|---|
GET /api/chaos/public/functional/status |
Niveau courant + compteurs F1–F4 |
GET /api/chaos/public/functional/logs |
Activity log (200 dernières entrées) |
GET /api/chaos/public/functional/anomalies?level=N |
Catalogue pédagogique pour le niveau N |
Tous ces endpoints sont accessibles sans authentification — ils alimentent le dashboard temps réel du monitoring formateur.
API — endpoints admin¶
# Activer le niveau Expert
curl -X POST https://perfshop-api.perfshop.io/api/admin/chaos/functional \
-H "X-Admin-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{"level": 3}'
# Reset (toutes anomalies désactivées + compteurs à 0)
curl -X POST https://perfshop-api.perfshop.io/api/admin/chaos/functional/reset \
-H "X-Admin-Token: $TOKEN"
# Vider l'activity log
curl -X POST https://perfshop-api.perfshop.io/api/admin/chaos/functional/logs/clear \
-H "X-Admin-Token: $TOKEN"
Activation par l'étudiant¶
POST /api/chaos/student/functional body {"level": N} — exige le mode
étudiant et une licence valide pour level > 0. Sans licence, retourne
HTTP 402 LICENSE_REQUIRED.