Session 17 — Intégration JMeter complète (container permanent + IHM Node.js)¶
Durée : ~5 heures (2 conversations)
Contexte : Intégration d'un environnement JMeter complet dans PerfShop —
container permanent, IHM de pilotage Node.js, dashboard Grafana dédié,
7 scénarios JMX pédagogiques. Déploiement et debug NAS Synology.
🎯 Objectif de la session¶
Ajouter à PerfShop un service JMeter clé-en-main pour les formations tests de performance :
- Container
perfshop-jmeterpermanent (plus de latence JVM à chaque tir) - IHM
perfshop-jmeter-uiNode.js sur port 3005 — authentification, pilotage, métriques live - Dashboard Grafana
perfshop-jmeter-live— 25 panels, métriques johrstrom 0.6.0 - 7 scénarios JMX progressifs (baseline → chaos master → E2E)
📦 Fichiers créés / modifiés¶
| Fichier | Nature |
|---|---|
docker-compose.yml + variants |
Services perfshop-jmeter + perfshop-jmeter-ui |
jmeter-ui/src/server.js |
Serveur Node.js — auth, docker exec, métriques Prometheus |
jmeter-ui/public/index.html |
IHM complète — login, pilotage, statut, rapports |
jmeter-ui/Dockerfile |
Image node:20-alpine — pas de docker-cli (incompatible DSM 7) |
jmeter-ui/package.json |
Dépendances : express, express-session, node-fetch, multer |
jmeter/scenarios/*.jmx |
7 scénarios JMX avec plugin PrometheusListener |
jmeter/plugins/jmeter-prometheus-plugin-0.6.0.jar |
Plugin johrstrom |
grafana/dashboards/dashboard-jmeter.json |
Dashboard JMeter live (uid=perfshop-jmeter-live) |
prometheus/prometheus.yml |
Job scrape perfshop-jmeter:9270 toutes les 5s |
.env.example |
Variables JMETER_* ajoutées |
🔧 Architecture JMeter — choix techniques¶
Container permanent vs docker run éphémère¶
Problème : chaque docker run justb4/jmeter = ~5s de latence JVM + problèmes réseau récurrents.
Solution : container perfshop-jmeter toujours up (tail -f /dev/null),
tirs via docker exec depuis jmeter-ui. Un seul chargement JVM pour toute la journée.
perfshop-jmeter:
entrypoint: ["/bin/sh", "-c",
"cp /plugins/*.jar /opt/apache-jmeter-5.5/lib/ext/ 2>/dev/null || true
&& tail -f /dev/null"]
Docker via socket Unix (sans docker-cli)¶
Synology DSM 7 bloque seccomp → docker-cli inutilisable dans un container Alpine.
Solution : appels directs à l'API Docker REST via socket Unix en Node.js pur (http.request).
Fonctions implémentées : dockerExec, dockerExecInspect, dockerInspect, dockerKillJmeter.
Plugin PrometheusListener¶
Plugin jmeter-prometheus-plugin-0.6.0.jar (johrstrom) copié dans /lib/ext/ au démarrage.
Exposition sur perfshop-jmeter:9270/metrics.
Prometheus scrape toutes les 5s → métriques disponibles dans Grafana en temps réel.
7 scénarios JMX pédagogiques¶
| Script | Niveau | Description |
|---|---|---|
baseline-nominal.jmx |
Débutant | Tir de référence, assertions HTTP simples |
simple-api-products.jmx |
Débutant | Catalogue produits uniquement |
browse-product-f4.jmx |
Fonctionnel | Détection corruption F4 silencieuse |
checkout-stress-f1f2.jmx |
Fonctionnel | Stress checkout avec anomalies F1/F2 |
load-catalogue-f3.jmx |
Fonctionnel | Charge catalogue + OOM F3 |
parcours-complet-e2e.jmx |
E2E | Parcours complet (login → panier → commande) |
full-chaos-master.jmx |
Master | Toutes anomalies simultanées |
Tous paramétrés via ${__P(users,10)} et ${__P(duration,300)} — pilotés par l'IHM.
🐛 Bugs résolus en session¶
Problème seccomp DSM 7¶
docker build impossible sur Synology → solution : image node:20-alpine avec code source
monté en volume + npm install au démarrage (pas de Dockerfile sur le NAS).
Problème réseau Docker¶
perfshop-jmeter non rattaché au réseau perfshop-network → ajout explicite.
Arguments JMeter mal formés¶
Variables d'environnement HEAP interprétées incorrectement → passage en jmeterEnv[]
directement dans dockerExec.
Plugin Prometheus manquant¶
Chemin /lib/ext/ vs /opt/apache-jmeter-5.5/lib/ext/ — corrigé dans l'entrypoint.
🗂️ Bilan qualité¶
Erreurs Claude : ~3 bugs nécessitant debug (seccomp, réseau, plugin path)
Toutes résolues dans la même session. Aucune régression sur les services existants.
Syndrome "Fix Théorique Sans Validation Empirique" : détecté 1 fois sur la config
réseau — corrigé après vérification docker network inspect.