Aller au contenu

Session 15 — F4 Data Corruption + Revue de code complète

Durée : ~4 heures
Contexte : Suite directe de la session 14. Implémentation de F4 (anomalie Master), ajout des Gauges Prometheus pour tous les compteurs fonctionnels, panel Grafana dédié F4, documentation complète. Revue de code systématique sur tous les fichiers modifiés.


🎯 Objectif de la session

Implémenter l'anomalie F4 — Corruption silencieuse : la seule anomalie fonctionnelle qui retourne HTTP 200 avec Tempo vert et aucune exception JVM, tout en corrompant les données produit en mémoire (prix ×1,5, stock forcé à 0, description tronquée).

Paradoxe pédagogique : le monitoring est aveugle. La détection nécessite l'inspection directe des payloads JSON — compétence distincte de toutes les anomalies précédentes.


📦 Fichiers modifiés

Fichier Type Nature des changements
FunctionalChaosService.java Backend cntF4, applyF4DataCorruption(), 5 switch étendus à 4, 4 Gauges Prometheus, Javadoc
FunctionalChaosController.java Backend Validation > 4, message erreur, commentaire Javadoc, defaultValue="4"
ProductService.java Backend Hook .map(functionalChaosService::applyF4DataCorruption) dans getProductById()
chaos-admin/index.html Frontend Carte N4, FN_LEVELS[4], boucle <= 4, compteur F4 (déjà présent lors de la reprise)
monitoring/monitoring.html Frontend Bandeau F4, compteur F4, repeat(4,1fr), labels/colors N4, fetchFunctional() (déjà présent)
dashboard-apm-formateur.json Grafana Mapping niveau 4, threshold purple, panel id=7 F4 Corruptions
dashboard-apm-eleve.json Grafana Guide traces +F4 (note "HTTP 200, Tempo vert"), description table traces, guide flamegraph +F4 invisible
functional.md Docs Section F4 complète, tableau signatures, TraceQL, observabilité
student-guide.md Docs TP5b Chaos Fonctionnel APM complet (4 niveaux)
session-index.md Docs Session 15 + tableau architecture Fonctionnel 0→4

🔧 Implémentation F4 — détails techniques

Point d'injection

ProductService.getProductById() — choix délibéré : - Hors checkout → ne bloque pas la règle d'or (commande toujours possible) - Endpoint fréquent — chaque visite de fiche produit déclenche la corruption - Retour Optional<Product>.map() est idiomatique et non-régressif

return productRepository.findById(id)
    .map(functionalChaosService::applyF4DataCorruption);

Corruptions appliquées

Champ Valeur originale Valeur corrompue Raison pédagogique
price ex. 29.99 44.99 (×1.5, HALF_UP) Visible à l'œil : prix anormal
stock ex. 42 0 Produit affiché épuisé à tort
description texte complet 30 premiers chars + [ERREUR: donnees tronquees] Simule sérialisation corrompue

Garanties de non-régression

  • Niveaux 0–3 : if (level.get() < 4) return product — retour immédiat, zéro overhead
  • Null-safe : if (product == null) return null — protège l'Optional.empty()
  • BDD intacte : la copie est construite champ par champ avec new Product() — jamais de save()
  • Champs identiques : id, name, category, imageUrl, createdAt, updatedAt — copiés tels quels

Gauges Prometheus ajoutées

Gauge.builder("chaos.functional.f1.npe",           cntF1, AtomicLong::get)...
Gauge.builder("chaos.functional.f2.stackoverflow",  cntF2, AtomicLong::get)...
Gauge.builder("chaos.functional.f3.oom",            cntF3, AtomicLong::get)...
Gauge.builder("chaos.functional.f4.corruption",     cntF4, AtomicLong::get)...

Noms Prometheus (dots → underscores automatique) : - chaos_functional_f4_corruption → utilisé dans le panel Grafana id=7


🔍 Revue de code — observations

Documentation non à jour corrigée

  • monitoring.html bandeau : F3 OOM sans mention F4 → corrigé
  • functional.md tableau niveaux : colonne Master absente → ajoutée
  • student-guide.md : aucun TP Chaos Fonctionnel → TP5b créé (4 niveaux)
  • session-index.md architecture : Fonctionnel 0→30→4

Découverte session — Gauges Prometheus manquantes (F1/F2/F3)

Constat : les compteurs cntF1, cntF2, cntF3 existaient en AtomicLong depuis la session 11 mais n'étaient jamais exposés comme métriques Prometheus. Ils n'étaient accessibles que via /api/chaos/public/functional/status (JSON). Un panel Grafana sur ces compteurs aurait retourné "No data".

Correction : 4 Gauges Micrometer ajoutés dans le constructeur pour F1, F2, F3 et F4. Désormais chaos_functional_f1_npe, chaos_functional_f2_stackoverflow, chaos_functional_f3_oom, chaos_functional_f4_corruption sont disponibles dans Prometheus.

Cohérence chaos-admin et monitoring déjà avancés

Lors de la reprise, les deux fichiers HTML étaient partiellement modifiés (carte N4 présente, labels JS à jour). Philippe avait sauvegardé en cours de session précédente. La revue a confirmé qu'aucun doublon ni régression n'était présent.


🗂️ Bilan qualité

Erreurs Claude cette session : 0 régression fonctionnelle

  • Doublon cntF4 détecté et corrigé immédiatement via diff
  • Éditions monitoring.html via edit_block : encodage UTF-8 détecté via fuzzy match → basculement sur lecture ligne exacte avant édition

Pattern identifié : les fichiers HTML volumineux nécessitent toujours une lecture préalable de la ligne cible avant edit_block — les apostrophes et accents encodés différemment causent des faux négatifs sur la recherche exacte.


🎓 Valeur pédagogique ajoutée

F4 complète le spectre d'apprentissage APM :

Niveau Ce que l'étudiant apprend
Junior (F1) Lire une stacktrace dans Tempo, identifier une NPE
Confirmé (F2) Différencier NPE vs SOE, reconnaître une récursion infinie
Expert (F3) Corréler heap JVM + Pyroscope + logs, comprendre un OOM
Master (F4) Comprendre qu'un monitoring "vert" ne garantit pas des données correctes

La progression couvre ainsi les deux grandes familles de problèmes APM : - Anomalies bruyantes (F1/F2/F3) : détectables automatiquement - Anomalies silencieuses (F4) : nécessitent une validation fonctionnelle active