Créer un script JMeter et l'intégrer à PerfShop¶
Ce guide explique comment créer un scénario JMeter depuis l'interface graphique JMeter sur votre poste, puis l'uploader dans PerfShop avec le monitoring Prometheus correctement configuré.
Prérequis¶
- JMeter 5.5 installé localement (téléchargement)
- Plugin Prometheus Listener installé dans JMeter local (optionnel pour l'édition, obligatoire pour les tirs PerfShop)
- Accès à l'interface PerfShop JMeter UI (
http://localhost:3005ou URL publique)
Étape 1 — Créer le scénario dans JMeter GUI¶
1.1 Structure minimale recommandée¶
Dans JMeter GUI, créez le plan de test avec cette structure :
Test Plan
└── Thread Group ← vos utilisateurs virtuels
├── HTTP Request Defaults ← hôte et port via variables
├── [vos samplers HTTP]
├── [assertions]
├── GaussianRandomTimer ← think time entre requêtes
└── Prometheus Listener ← OBLIGATOIRE, voir §2
PrometheusListener : position critique
Le PrometheusListener doit être enfant du Thread Group, pas enfant du Test Plan.
Placé au niveau du Test Plan, il ne collecte aucune métrique pendant le tir.
1.2 Configurer les variables de cible¶
N'écrivez jamais l'hôte et le port en dur. Utilisez les propriétés JMeter injectées par PerfShop :
Dans HTTP Request Defaults (ou directement dans chaque sampler) :
| Champ | Valeur à saisir |
|---|---|
| Server Name or IP | ${__P(target_host,perfshop-app)} |
| Port Number | ${__P(target_port,8080)} |
| Protocol | http |
Valeur par défaut 8080
PerfShop injecte toujours -Jtarget_port=8080 (mode Interne) ou la valeur choisie (mode Externe).
La valeur par défaut dans la propriété doit être 8080, jamais 9080 (port public nginx).
1.3 Ajouter le think time¶
Un GaussianRandomTimer réaliste entre chaque action :
- Constant Delay Offset :
800ms (penser à l'utilisateur qui lit la page) - Deviation :
300ms
Étape 2 — Ajouter le Prometheus Listener¶
2.1 Installer le plugin localement (pour édition)¶
Si vous voulez visualiser le composant dans JMeter GUI :
- Téléchargez
jmeter-prometheus-plugin-0.6.0.jardepuis github.com/johrstrom/jmeter-prometheus-plugin/releases - Copiez le
.jardans<JMETER_HOME>/lib/ext/ - Redémarrez JMeter
2.2 Ajouter le listener dans l'interface¶
- Clic droit sur votre Thread Group → Add → Listener → PrometheusListener
- Configurez :
| Propriété | Valeur |
|---|---|
| Port | ${__P(prometheus.port,9270)} |
| Save active threads | ✅ coché |
| Save JVM metrics | ☐ décoché |
Ne pas mettre de port fixe
Évitez 9270 en dur. Utilisez ${__P(prometheus.port,9270)} — PerfShop injecte
toujours ce port, et la valeur par défaut 9270 garantit que le script fonctionne
même lancé manuellement.
2.3 Vérifier la position dans l'arbre¶
L'arbre doit ressembler à ceci dans JMeter GUI :
Test Plan
└── Thread Group ← niveau ThreadGroup
├── HTTP Request Defaults
├── GET /api/products ← sampler
├── GaussianRandomTimer
└── Prometheus Listener ← ✅ enfant du ThreadGroup
Et NON :
Étape 3 — Sauvegarder et uploader dans PerfShop¶
3.1 Sauvegarder le .jmx¶
Dans JMeter GUI : File → Save Test Plan As → choisissez un nom explicite,
par exemple mon-scenario-custom.jmx.
3.2 Uploader via l'interface PerfShop¶
- Ouvrez PerfShop JMeter UI
- Cliquez sur 🗂️ Gérer (bouton à côté du sélecteur de scénario)
- Dans le gestionnaire, choisissez le dossier cible (ou laissez dans "Général")
- Cliquez sur 📤 (bouton upload du groupe)
- Sélectionnez votre
.jmx
Le scénario apparaît immédiatement dans le sélecteur principal.
3.3 Vérifier avant de lancer¶
Avant le premier tir, ouvrez l'éditeur inline (bouton ✏️) et vérifiez :
- Les champs Threads, Ramp, Duration sont bien détectés
- Le port affiché dans les samplers est
${__P(target_port,8080)}et non9080 - Un bloc "Prometheus Listener" apparaît dans la section du Thread Group
Étape 4 — Lancer le tir et observer les métriques¶
- Sélectionnez votre scénario dans le sélecteur
- Choisissez le nombre de vUsers et la durée
- Sélectionnez le mode URL : Interne (réseau Docker) pour tirer sur PerfShop local
- Cliquez sur ▶ Lancer le tir
Les métriques apparaissent dans les cards (TPS, erreurs, P50/P95/P99) au bout de ~10 secondes.
Métriques muettes ?
Si les cards restent à — après 15 secondes, c'est que le PrometheusListener
n'est pas dans le ThreadGroup ou que le port 9270 est déjà occupé.
Consultez Troubleshooting JMeter.
Récapitulatif — Checklist avant upload¶
| Point de contrôle | ✅ Attendu |
|---|---|
target_host |
${__P(target_host,perfshop-app)} |
target_port |
${__P(target_port,8080)} — défaut 8080, jamais 9080 |
| PrometheusListener | Enfant du Thread Group, pas du Test Plan |
| Port Prometheus | ${__P(prometheus.port,9270)} |
| Think time | GaussianRandomTimer présent entre les actions |
| Pas d'URL en dur | Ni localhost, ni 192.168.x.x, ni perfshop.perfshop.io |