Aller au contenu

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:3005 ou 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 : 800 ms (penser à l'utilisateur qui lit la page)
  • Deviation : 300 ms

Étape 2 — Ajouter le Prometheus Listener

2.1 Installer le plugin localement (pour édition)

Si vous voulez visualiser le composant dans JMeter GUI :

  1. Téléchargez jmeter-prometheus-plugin-0.6.0.jar depuis github.com/johrstrom/jmeter-prometheus-plugin/releases
  2. Copiez le .jar dans <JMETER_HOME>/lib/ext/
  3. Redémarrez JMeter

2.2 Ajouter le listener dans l'interface

  1. Clic droit sur votre Thread Group → Add → Listener → PrometheusListener
  2. 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 :

Test Plan
├── Prometheus Listener  ← ❌ hors ThreadGroup, métriques muettes
└── Thread Group
    └── ...

É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

  1. Ouvrez PerfShop JMeter UI
  2. Cliquez sur 🗂️ Gérer (bouton à côté du sélecteur de scénario)
  3. Dans le gestionnaire, choisissez le dossier cible (ou laissez dans "Général")
  4. Cliquez sur 📤 (bouton upload du groupe)
  5. 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 non 9080
  • Un bloc "Prometheus Listener" apparaît dans la section du Thread Group

Étape 4 — Lancer le tir et observer les métriques

  1. Sélectionnez votre scénario dans le sélecteur
  2. Choisissez le nombre de vUsers et la durée
  3. Sélectionnez le mode URL : Interne (réseau Docker) pour tirer sur PerfShop local
  4. 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