Aller au contenu

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-jmeter permanent (plus de latence JVM à chaque tir)
  • IHM perfshop-jmeter-ui Node.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).

http.request({ socketPath: '/var/run/docker.sock', method: 'POST', ... })

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.