Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 5 · Modul 5 dari 15

Check, Group & Threshold — Menentukan Lulus atau Gagal

Perbedaan mendasar check dan threshold, cara menulis threshold untuk SLO, abortOnFail, dan kaitannya dengan exit code di CI/CD.

Tiga Konsep yang Sering Tertukar

KonsepGunanyaMenggagalkan tes?
check()Memverifikasi satu kondisi, mencatat rasio benar/salahTIDAK
group()Mengelompokkan langkah agar laporan terbacaTidak
thresholdsMenetapkan kriteria lulus atas sebuah metrikYA — exit code 99
⛔ Kesalahan paling mahal di k6

Menulis puluhan check() lalu mengira pipeline CI akan merah bila ada yang gagal. Tidak akan. k6 tetap keluar dengan exit code 0 meskipun 100% check gagal. Satu-satunya cara membuat tes benar-benar gagal adalah thresholds.

Karena itu, hampir setiap proyek yang serius menambahkan threshold pada metrik checks itu sendiri:

javascript
thresholds: { checks: ['rate>0.99'] }

check() — Verifikasi Tanpa Menghentikan

check.jsjavascript
import { check } from 'k6';

const res = http.get(url);

const berhasil = check(res, {
  'status 200':        (r) => r.status === 200,
  'respons < 500ms':   (r) => r.timings.duration < 500,
  'body ada isinya':   (r) => r.body.length > 0,
  'field id ada':      (r) => r.json('id') !== undefined,
});

// check() mengembalikan boolean -> bisa dipakai untuk logika lanjutan
if (!berhasil) {
  console.error('Request gagal: ' + res.status + ' ' + res.body.slice(0, 200));
  return;    // hentikan iterasi ini, jangan lanjut ke langkah berikutnya
}

group() — Struktur Laporan

Group membungkus beberapa langkah menjadi satu unit yang muncul terpisah di laporan, dan otomatis menambahkan tag group pada semua metrik di dalamnya.

group.jsjavascript
group('Alur Checkout', function () {
  group('01 Tambah ke keranjang', function () { /* … */ });
  group('02 Isi alamat',          function () { /* … */ });
  group('03 Bayar',               function () { /* … */ });
});

// Threshold bisa menyasar group tertentu:
thresholds: {
  'http_req_duration{group:::Alur Checkout::03 Bayar}': ['p(95)<2000'],
}
⚠️ Perhatikan pemisah ::

Group bersarang dipisahkan dengan dua titik dua, dan diawali ::. Salah satu titik dua saja membuat threshold tidak pernah cocok — dan yang berbahaya, k6 tidak memberi peringatan; threshold itu hanya diam saja tidak pernah dievaluasi.

thresholds — SLO sebagai Kode

thresholds.jsjavascript
export const options = {
  thresholds: {
    // Latency
    http_req_duration: ['p(95)<500', 'p(99)<1500', 'max<5000'],

    // Hanya request yang dianggap "berhasil" — lebih adil
    'http_req_duration{expected_response:true}': ['p(95)<400'],

    // Error rate
    http_req_failed: ['rate<0.01'],          // < 1% gagal

    // Rasio check yang lulus
    checks: ['rate>0.99'],

    // Throughput minimum
    http_reqs: ['count>1000', 'rate>50'],

    // Per endpoint (memakai tag name)
    'http_req_duration{name:Login}':    ['p(95)<800'],
    'http_req_duration{name:Checkout}': ['p(95)<2000'],

    // Metrik kustom
    waktu_checkout: ['p(95)<3000'],

    // Hentikan tes SEGERA bila sistem jelas sudah rusak
    'http_req_failed{scenario:beban_utama}': [
      { threshold: 'rate<0.25', abortOnFail: true, delayAbortEval: '30s' },
    ],
  },
};

Agregasi yang Tersedia

Tipe metrikAgregasi
Countercount, rate
Gaugevalue
Raterate
Trendavg, min, med, max, p(N)

Exit Code — Bahasa yang Dimengerti CI/CD

Exit codeArti
0Tes selesai, semua threshold lulus
99Tes selesai tetapi ada threshold yang gagal
104Tes dihentikan oleh abortOnFail
107Error saat menjalankan skrip (sintaks, dsb.)

Inilah alasan k6 mudah sekali dipasang di pipeline: cukup jalankan perintahnya, dan CI otomatis merah bila SLO dilanggar.