Monitoring Node.js¶
Rôle¶
Le monitoring est le hub central de l'observabilité PerfShop. Il remplit trois rôles :
- Scrape Docker — interroge le socket Docker toutes les 2s pour obtenir les stats containers
- Expose
/metrics— format Prometheus, scraped par Prometheus toutes les 15s - Reçoit les métriques navigateur — endpoint POST depuis
chaos-agent.js
Architecture deux niveaux¶
Le dashboard est divisé en deux niveaux d'accès :
| Fichier | Accès | Onglets |
|---|---|---|
public/index.html |
Public — élèves | 🔧 Backend · 🖥️ Frontend · 🐳 Vue Générale |
public/admin/index.html |
Login admin | formulaire d'authentification |
public/admin/monitoring.html |
Admin authentifié | 7 onglets complets |
Dashboard admin — 7 onglets¶
| Onglet | Contenu |
|---|---|
| 🔧 Backend | 6 stats + 14 graphiques + chaos grid (7 anomalies) + Heap Dump |
| 🖥️ Frontend | Stats Nginx + métriques navigateur + chaos grid (4 anomalies) |
| 🐳 Vue Générale | CPU/RAM/Réseau tous containers |
| 📜 Scripting | Niveau actif (0–4), bundles sessions, logs activité API |
| 🎯 Chaos Métier | Bannière niveau, KPIs A1-A11, logs filtrables (INFO/WARN/ERROR) |
| 🔐 Chaos Sécurité | 9 failles OWASP S1-S9, compteurs, flux attaques temps réel |
| ⚡ Chaos Fonctionnel | Compteurs F1-NPE/F2-SOF/F3-OOM, journal exceptions |
Parsing réponse chaos backend
/api/admin/chaos/public/status retourne { "backend":{...}, "frontend":{...}, ... }.
Il faut extraire resp.backend — itérer sur resp directement affiche tout à 0%.
Endpoints¶
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /config.js |
Config dynamique — window.__CONFIG__ avec URLs de prod |
| GET | /metrics |
Métriques Prometheus (containers + navigateur) |
| GET | /api/docker/all |
Stats JSON tous les containers |
| GET | /api/prometheus-raw |
Texte Prometheus brut de Spring Boot |
| GET | /api/heapdump |
Proxy vers actuator:9090/heapdump |
| GET | /api/chaos/client-metrics |
Dernières métriques navigateur |
| POST | /api/chaos/client-metrics |
Push métriques depuis chaos-agent.js |
Route /config.js obligatoire
Sans cette route, les pages admin/index.html et admin/monitoring.html reçoivent
un 404 avec MIME text/html → le navigateur refuse d'exécuter le script
(strict MIME checking) → API_URL tombe sur http://localhost:8080
→ toutes les requêtes chaos échouent.
Métriques exposées dans /metrics¶
Containers Docker¶
docker_container_cpu_percent{container="perfshop-app"} 52.3
docker_container_mem_usage_bytes{container="perfshop-app"} 412345678
docker_container_mem_limit_bytes{container="perfshop-app"} 1073741824
docker_container_net_rx_bytes{container="perfshop-frontend"} 123456789
docker_container_net_tx_bytes{container="perfshop-frontend"} 987654321
docker_container_pids{container="perfshop-app"} 42
Navigateur client (si données fraîches < 10s)¶
perfshop_client_fps 39
perfshop_client_heap_used_mb 74.2
perfshop_client_long_tasks_per_sec 10.0
perfshop_client_fetch_req_per_sec 48
perfshop_client_dom_node_count 1190
perfshop_client_cpu_worker_active 1
perfshop_client_last_received_timestamp 1741520000000
perfshop_client_last_received_timestamp est le timestamp Unix (ms) de la dernière réception
de métriques navigateur. Utilisé dans Grafana pour afficher l'âge des données :
Données stale
Si aucun navigateur n'a pushé de métriques depuis plus de 10 secondes,
les métriques perfshop_client_* sont absentes de /metrics.
Cela évite que Grafana affiche des valeurs figées quand personne n'est connecté.
Déploiement¶
# Modifier server.js
vi /volume4/docker-speed/perfshop/monitoring/src/server.js
# Rebuild nécessaire — server.js est copié dans l'image Docker
cd /volume4/docker-speed/perfshop
docker compose -f docker-compose.build.yml up -d --build perfshop-monitoring
Rebuild obligatoire
Contrairement aux fichiers du dossier public/ (montés en volume),
src/server.js est embarqué dans l'image au build.
Un simple restart ne suffit pas — il faut rebuilder l'image.