Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 12 · Modul 12 dari 15

Output & Integrasi: Prometheus, Grafana, JSON, handleSummary

Mengirim hasil k6 ke sistem monitoring, membuat laporan HTML kustom, dan menyimpan riwayat untuk deteksi regresi.

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

PerintahKegunaan
--out json=hasil.jsonSemua titik data mentah — besar, untuk analisis mendalam
--out csv=hasil.csvUntuk diolah di Excel/pandas
--out experimental-prometheus-rwKirim langsung ke Prometheus (remote write)
--out influxdb=http://…InfluxDB v1 (pola klasik k6 + InfluxDB + Grafana)
--summary-export=ringkasan.jsonHanya agregat akhir — kecil, cocok untuk artefak CI
--out cloudGrafana Cloud k6 (butuh akun)

Mengirim ke Prometheus (Remote Write)

terminalbash
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.js
⚠️ Prometheus harus mengizinkan remote write

Endpoint /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.

⛔ Jangan pakai tag testid berbeda di setiap eksekusi tanpa rencana retensi

Setiap 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.

handle-summary.jsjavascript
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.

bandingkan.jsjavascript
// 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
}