Chaos Frontend¶
Les 4 anomalies frontend s'exécutent dans le navigateur de l'apprenant, pas dans le container Nginx. Nginx sert uniquement les fichiers statiques.
Où s'exécute le chaos ?
Le chaos frontend tourne dans le moteur JavaScript du navigateur (V8 sur Chrome).
Le container perfshop-frontend restera toujours à ~0% CPU — c'est normal.
Les métriques à observer sont dans la section Navigateur client du dashboard.
Architecture¶
chaos-agent.js est chargé par le frontend React. Il poll GET /api/chaos/frontend/state
toutes les 5 secondes et applique les anomalies actives. Il remonte les métriques vers
le monitoring via POST /api/chaos/client-metrics toutes les 2 secondes.
applyState() ne redémarre une anomalie que si sa valeur a changé — pas de reset inutile
si l'état est identique. Les clés inconnues reçues de l'API sont ignorées (whitelist KNOWN_KEYS).
1. CPU Burn 🔥¶
Deux niveaux simultanés :
Web Worker (thread OS réel)¶
// fixedRate = 100ms — même pattern que CpuChaosScheduler.java
// iterations = intensity × 3200
timer = setInterval(runBurn, 100);
Visible dans le gestionnaire de tâches du navigateur (onglet Performance de Chrome DevTools).
Thread principal (Long Tasks + FPS)¶
// 150ms de blocage toutes les 100ms à 100%
const blockMs = Math.floor(pct * 150);
const repeatMs = 100;
PerformanceObserver.
Métriques impactées :
| Métrique | Nominal | À 50% | À 100% |
|---|---|---|---|
| FPS | ~144 | ~40 | ~10 |
| Long Tasks/s | 0 | ~7 | ~15 |
| CPU Worker | OFF | ON | ON |
2. Memory Leak 💾¶
Accumulation d'objets JavaScript en mémoire avec deux mécanismes :
- Objets simples : tableaux, closures — plafond 1.2 Go (
MAX_BYTES = 1.2 × 1024³) - Event listeners orphelins : éléments DOM détachés avec closures volumineuses,
jamais collectés par le GC — plafond 50 000 listeners (
MAX_LISTENERS = 50_000)
Les deux plafonds sont séparés et indépendants — évite un crash de l'onglet Chrome (limite Chrome ~1.5–4 Go selon l'OS).
Vitesse de montée à 100% : ~60 Mo/s → plafond 1.2 Go atteint en ~20 secondes.
Métriques impactées :
- perfshop_client_heap_used_mb → montée rapide et visible (~60 Mo/s à 100%)
3. DOM Flood 🌊¶
Création et destruction rapides de 2 000 nœuds DOM avec reflows agressifs — l'opération la plus coûteuse pour le moteur de rendu du navigateur.
Mécanisme de layout thrashing :
- Lecture/écriture alternées sur tous les enfants (plus 1 sur 3)
- 4 propriétés forcent un reflow par nœud : offsetHeight, marginLeft, offsetWidth, paddingTop
- Total : 2 000 × 4 = 8 000 reflows toutes les 100ms → Chrome ne peut pas batcher
for (let i = 0; i < children.length; i++) {
void children[i].offsetHeight; // reflow lecture
children[i].style.marginLeft = Math.random() + 'px'; // invalide layout
void children[i].offsetWidth; // reflow lecture
children[i].style.paddingTop = Math.random()*2 + 'px'; // invalide layout
}
Métriques impactées :
- perfshop_client_dom_node_count → oscillations rapides (+2000 nœuds)
- perfshop_client_long_tasks_per_sec → monte (reflows = Long Tasks)
- FPS → chute visible même sur PC moderne
4. Fetch Flood 📡¶
Lance jusqu'à 200 requêtes GET par seconde vers l'API backend sur 12 endpoints variés :
const FLOOD_ENDPOINTS = [
`/api/products?size=20`,
`/api/products?page=1&size=20`,
`/api/products?page=2&size=20`,
`/api/products?page=3&size=20`,
`/api/products?category=AVION&size=10`,
`/api/products?category=VOITURE&size=10`,
`/api/products?category=BATEAU&size=10`,
`/api/products/1`, // ...jusqu'à /5
];
Les 12 endpoints variés (pagination + catégorie + détail par ID) évitent tout cache HTTP et forcent Spring à exécuter de vraies requêtes SQL à chaque fois.
Comportement côté client : Chrome limite à 6 connexions simultanées par domaine — les requêtes excédentaires se mettent en file d'attente (barres grises "Queueing" dans DevTools Network). Les vraies requêtes de navigation passent devant car Chrome les priorise.
Métriques impactées :
| Métrique | À 50% | À 100% |
|---|---|---|
perfshop_client_fetch_req_per_sec |
~100 | ~200 |
http_server_requests_seconds_count{uri="/api/products"} |
monte | monte fortement |
| Grafana débit HTTP | pic visible | pic fort |
Vérification en console navigateur¶
Affiche : fps, heapUsedMB, longTasksPerSec, domNodeCount, pendingFetches, cpuWorkerActive.
// Test de connectivité monitoring
fetch('https://perfshop-monitoring.perfshop.io/api/chaos/client-metrics')
.then(r => r.json())
.then(d => console.log('stale:', d.stale, 'fps:', d.fps))
Validation par anomalie¶
| Anomalie | Où observer | Ce qu'on voit |
|---|---|---|
| 🔥 CPU Burn | DevTools → Performance → FPS meter | FPS chute, Long Tasks dans la timeline |
| 💾 Memory Leak | DevTools → Memory | Heap monte ~60 Mo/s, plafonne à 1.2 Go |
| 🌊 DOM Flood | DevTools → Performance → Rendering | Repaints constants, FPS instable |
| 📡 Fetch Flood | DevTools → Network | 200 req/s, barres "Queueing" longues |