Aller au contenu

Monitoring Node.js

Rôle

Le monitoring est le hub central de l'observabilité PerfShop. Il remplit trois rôles :

  1. Scrape Docker — interroge le socket Docker toutes les 2s pour obtenir les stats containers
  2. Expose /metrics — format Prometheus, scraped par Prometheus toutes les 15s
  3. 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
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 :

(time() * 1000 - perfshop_client_last_received_timestamp) / 1000

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.