RousselTMLEARNING

DevOps

Seuils, métriques et résultats d'un test k6

Lire le résumé d'un test k6, comprendre les métriques intégrées (http_req_duration, http_req_failed, iterations), définir des seuils alignés sur les SLO et créer des métriques personnalisées.

1. Les métriques intégrées #

Ce que mesure k6.

Principales métriques #

MétriqueTypeSignification
http_req_durationTrendDurée totale de la requête (envoi + attente + réception)
http_req_waitingTrendTemps jusqu'au premier octet (TTFB)
http_req_failedRatePart des requêtes en échec (par défaut : statut hors 200-399)
http_reqsCounterNombre de requêtes
iterations, iteration_durationCounter, TrendItérations du scénario
vus, vus_maxGaugeUtilisateurs virtuels actifs
checksRatePart des vérifications réussies
dropped_iterationsCounterItérations non lancées faute de VU (modèle ouvert)
Erreur Courante : Si dropped_iterations est non nul, k6 n'a pas pu générer la charge demandée : augmentez maxVUs ou la machine de test, sinon le résultat est faussé.

2. Les seuils #

Le test réussit ou échoue.

Définir des seuils #

export const options = {
  thresholds: {
    http_req_failed: ['rate<0.01'],                    // moins de 1 % d'erreurs
    http_req_duration: ['p(95)<300', 'p(99)<800'],     // 95 % sous 300 ms
    'http_req_duration{name:commande}': ['p(95)<500'], // seuil sur un tag
    checks: ['rate>0.99'],
    http_reqs: [{ threshold: 'count>1000', abortOnFail: false }],
    'http_req_duration{scenario:api}': [{ threshold: 'p(99)<1000', abortOnFail: true, delayAbortEval: '30s' }],
  },
};

Si un seuil n'est pas respecté, k6 se termine avec le code de sortie 99 : la CI marque l'étape en échec.

Bonne Pratique : Alignez les seuils sur vos SLO (voir la formation SRE) : un test de charge devient alors la preuve qu'une version tient ses objectifs.

3. Métriques personnalisées #

Mesurer ce qui compte pour le métier.

Les quatre types #

import { Trend, Counter, Rate, Gauge } from 'k6/metrics';

const dureeCommande = new Trend('duree_commande', true);   // true = durée
const commandes = new Counter('commandes');
const paiementsRefuses = new Rate('paiements_refuses');

export const options = { thresholds: { paiements_refuses: ['rate<0.05'], duree_commande: ['p(95)<2000'] } };

export default function () {
  const debut = Date.now();
  const res = http.post('http://api/commande', '{}');
  dureeCommande.add(Date.now() - debut);
  commandes.add(1);
  paiementsRefuses.add(res.status === 402);
}

Le résumé de fin de test #

k6 run --summary-trend-stats="avg,p(90),p(95),p(99),max" script.js
k6 run --summary-export=resume.json script.js

La fonction handleSummary(data) permet de produire son propre rapport (HTML, JUnit, Markdown) à la fin du test.

Articles liés

Tests de charge avec Grafana k6 : pourquoi et quels types de tests

Pourquoi tester la performance avant la production, les types de tests (smoke, charge, stress, pic, endurance…

Écrire des scripts k6 : requêtes, vérifications, scénarios et exécuteurs

La structure d'un script k6 (init, setup, default, teardown), les requêtes HTTP, les checks, les groupes et t…

Observer un test k6 : Prometheus, Grafana et corrélation avec le système testé

Envoyer les résultats de k6 dans Prometheus (remote write) ou en OpenTelemetry, les visualiser dans Grafana e…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !