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