Kenapa Ringkasan Terminal Saja Tidak Cukup
Ringkasan di terminal hanya menampilkan agregat keseluruhan tes. Ia tidak bisa menjawab pertanyaan penting seperti: "pada detik ke berapa latency mulai naik?", "apakah p95 build ini lebih buruk dari build kemarin?", atau "apa yang terjadi di server saat p99 melonjak?".
Format Output yang Tersedia
| Perintah | Kegunaan |
|---|---|
--out json=hasil.json | Semua titik data mentah — besar, untuk analisis mendalam |
--out csv=hasil.csv | Untuk diolah di Excel/pandas |
--out experimental-prometheus-rw | Kirim langsung ke Prometheus (remote write) |
--out influxdb=http://… | InfluxDB v1 (pola klasik k6 + InfluxDB + Grafana) |
--summary-export=ringkasan.json | Hanya agregat akhir — kecil, cocok untuk artefak CI |
--out cloud | Grafana Cloud k6 (butuh akun) |
Mengirim ke Prometheus (Remote Write)
export K6_PROMETHEUS_RW_SERVER_URL=http://localhost:9090/api/v1/write
export K6_PROMETHEUS_RW_TREND_STATS="p(95),p(99),min,max,avg"
k6 run --out experimental-prometheus-rw \
--tag testid=checkout-2026-07-27 \
--tag build=421 \
skrip.jsEndpoint /api/v1/write tidak aktif secara default. Jalankan Prometheus dengan flag --web.enable-remote-write-receiver, atau kirim ke Grafana Mimir/Cortex/Thanos.
Nama output ini masih berawalan experimental- di banyak versi k6 — periksa k6 --help pada versi Anda bila perintahnya ditolak.
testid berbeda di setiap eksekusi tanpa rencana retensiSetiap nilai testid baru menciptakan seri metrik baru di Prometheus. Menjalankan tes 50× sehari dengan testid unik akan meledakkan kardinalitas dan bisa merobohkan Prometheus Anda.
Gunakan retensi pendek untuk metrik load test (misalnya 15 hari), atau simpan di instance Prometheus terpisah dari monitoring produksi.
handleSummary() — Laporan Sesuai Kebutuhan Anda
Fungsi khusus yang dipanggil k6 di akhir tes. Apa pun yang Anda kembalikan akan ditulis ke berkas.
import { textSummary } from 'https://jslib.k6.io/k6-summary/0.0.2/index.js';
export function handleSummary(data) {
const p95 = data.metrics.http_req_duration.values['p(95)'];
const gagal = data.metrics.http_req_failed.values.rate * 100;
return {
// Tetap tampilkan ringkasan biasa di terminal
'stdout': textSummary(data, { indent: ' ', enableColors: true }),
// Simpan data mentah untuk perbandingan antar-build
'hasil/ringkasan.json': JSON.stringify(data, null, 2),
// Laporan ringkas untuk dikirim ke Slack/Teams
'hasil/laporan.md':
'# Hasil Load Test\n\n' +
'| Metrik | Nilai |\n|---|---|\n' +
'| p95 latency | ' + p95.toFixed(0) + ' ms |\n' +
'| Error rate | ' + gagal.toFixed(2) + '% |\n' +
'| Total request | ' + data.metrics.http_reqs.values.count + ' |\n',
};
}Deteksi Regresi Antar-Build
Ini nilai praktis terbesar dari menyimpan ringkasan: membandingkan build hari ini dengan build sebelumnya secara otomatis.
// Dijalankan di CI setelah k6 selesai: node bandingkan.js baseline.json hasil.json
const dasar = require('./baseline.json');
const baru = require('./hasil.json');
const p95Dasar = dasar.metrics.http_req_duration.values['p(95)'];
const p95Baru = baru.metrics.http_req_duration.values['p(95)'];
const selisih = ((p95Baru - p95Dasar) / p95Dasar) * 100;
console.log('p95 baseline : ' + p95Dasar.toFixed(0) + ' ms');
console.log('p95 build ini: ' + p95Baru.toFixed(0) + ' ms');
console.log('perubahan : ' + selisih.toFixed(1) + '%');
if (selisih > 10) {
console.error('REGRESI: p95 memburuk lebih dari 10%');
process.exit(1); // gagalkan pipeline
}