Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 8 · Modul 8 dari 15

Metrik Bawaan & Metrik Kustom (Counter, Gauge, Rate, Trend)

Membaca setiap baris output k6 dengan benar, dan membuat metrik sendiri untuk mengukur alur bisnis, bukan sekadar request.

Membaca Ringkasan k6 Baris demi Baris

ringkasan k6console
     checks.........................: 99.42% ✓ 17204     ✗ 100
     data_received..................: 45 MB   1.5 MB/s
     data_sent......................: 3.2 MB  107 kB/s
     http_req_blocked...............: avg=1.2ms   p(95)=0.8ms
     http_req_connecting............: avg=0.5ms   p(95)=0.2ms
     http_req_duration..............: avg=245ms   p(95)=487ms  p(99)=1.2s
       { expected_response:true }...: avg=238ms   p(95)=465ms
     http_req_failed................: 0.58%  ✓ 100       ✗ 17204
     http_req_receiving.............: avg=12ms    p(95)=45ms
     http_req_sending...............: avg=0.1ms   p(95)=0.2ms
     http_req_tls_handshaking.......: avg=2.1ms   p(95)=0ms
     http_req_waiting...............: avg=233ms   p(95)=460ms
     http_reqs......................: 17304   576.8/s
     iteration_duration.............: avg=1.24s   p(95)=1.9s
     iterations.....................: 17304   576.8/s
     vus............................: 50      min=1  max=50
     vus_max........................: 50
MetrikArtinyaKapan jadi masalah
http_req_blockedMenunggu slot koneksi TCP tersediaTinggi = connection pool habis / batchPerHost terlalu kecil
http_req_connectingWaktu TCP handshakeTinggi = latensi jaringan atau server kehabisan socket
http_req_tls_handshakingWaktu negosiasi TLSTinggi = koneksi tidak di-reuse, atau cipher berat
http_req_sendingMengirim requestTinggi = payload sangat besar / bandwidth upload terbatas
http_req_waitingTTFB — waktu berpikir serverMetrik utama untuk menilai backend
http_req_receivingMengunduh isi responsTinggi = respons besar, perlu paginasi/kompresi
http_req_durationTotal = sending + waiting + receivingIni yang dilihat pengguna
iteration_durationDurasi satu perjalanan pengguna (termasuk sleep)Berguna untuk validasi think time
dropped_iterationsIterasi yang gagal dijadwalkan> 0 berarti generator kewalahan — hasil tidak valid
⛔ Bila dropped_iterations muncul, hasil tes Anda TIDAK SAH

Metrik ini berarti k6 tidak sanggup menjalankan iterasi sebanyak yang Anda minta — biasanya karena CPU generator penuh atau preAllocatedVUs kurang pada arrival-rate executor. Beban yang benar-benar sampai ke server lebih kecil dari yang Anda kira, sehingga kesimpulan kapasitas jadi salah.

Perbaikan: naikkan preAllocatedVUs/maxVUs, kurangi target laju, atau tambah mesin generator.

Empat Tipe Metrik Kustom

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

// COUNTER — angka yang hanya bertambah. Untuk menghitung kejadian.
const pesananDibuat = new Counter('pesanan_dibuat');
pesananDibuat.add(1);

// GAUGE — menyimpan nilai terakhir. Untuk nilai yang naik-turun.
const ukuranKeranjang = new Gauge('ukuran_keranjang');
ukuranKeranjang.add(res.json('items').length);

// RATE — persentase true dari total. Untuk rasio keberhasilan.
const stokTersedia = new Rate('stok_tersedia');
stokTersedia.add(res.json('stok') > 0);

// TREND — kumpulan nilai, menghasilkan avg/min/med/max/p(N).
// Argumen kedua true = tampilkan sebagai satuan waktu.
const durasiCheckout = new Trend('durasi_checkout', true);
durasiCheckout.add(Date.now() - mulai);

Kapan Memakai Metrik Kustom

Metrik bawaan mengukur request. Metrik kustom mengukur bisnis. Manajemen tidak peduli pada http_req_duration — mereka peduli pada "berapa lama pelanggan menunggu sampai pesanan terkonfirmasi".

metrik-bisnis.jsjavascript
export default function () {
  const mulai = Date.now();

  const login    = http.post(BASE + '/login', /* … */);
  const cari     = http.get(BASE + '/cari?q=sepatu');
  const keranjang= http.post(BASE + '/keranjang', /* … */);
  const bayar    = http.post(BASE + '/bayar', /* … */);

  // Satu angka yang mewakili keseluruhan perjalanan pengguna
  durasiCheckout.add(Date.now() - mulai);

  const berhasil = bayar.status === 201;
  tingkatKonversi.add(berhasil);
  if (berhasil) pesananDibuat.add(1);
}

Tag pada Metrik Kustom

tag-metrik.jsjavascript
durasiCheckout.add(Date.now() - mulai, {
  metode_bayar: 'kartu_kredit',
  tier: user.tier,
});

// Lalu bisa dibuat threshold spesifik:
thresholds: {
  'durasi_checkout{metode_bayar:kartu_kredit}': ['p(95)<3000'],
  'durasi_checkout{metode_bayar:va}':           ['p(95)<5000'],
}
⚠️ Batasi jumlah nilai tag yang mungkin (cardinality)

Tag dengan nilai tak terbatas (user ID, timestamp, UUID) akan menciptakan jutaan seri metrik dan membuat k6 maupun backend metrik Anda kehabisan memori. Gunakan tag hanya untuk kategori dengan jumlah nilai terbatas: tier, metode bayar, region, nama endpoint.