Aller au contenu

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 → enfant OrderService.processPaymentPublic marqué ERROR avec exception.type = java.lang.NullPointerException
  • Logs Loki : [FunctionalChaos][F1] NullPointerException injectee dans processPaymentPublic — methode={paymentMethod}
  • Activity log : entrée F1_NPE avec 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 :

private void triggerRecursion(int depth) {
    triggerRecursion(depth + 1);
}

Symptômes observables

  • HTTP 500 sur POST /api/orders (comme F1, mais cause différente)
  • Tempo : span ERROR avec stack trace répétitive — le même frame triggerRecursion apparaît 50+ fois dans la stack tronquée
  • Logs Loki : [FunctionalChaos][F2] StackOverflowError injectee dans calculateOrderTotal — ref={orderRef}
  • Activity log : F2_STACKOVERFLOW sé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:+HeapDumpOnOutOfMemoryError est actif (PerfShop l'expose aussi via /actuator/heapdump — cet endpoint est exclu du chaos pour rester fonctionnel)
  • Tempo : span ERROR avec exception.type = java.lang.OutOfMemoryError
  • Métriques JVM : jvm_memory_used_bytes{area="heap"} saturé, jvm_gc_pause_seconds explose 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.