Membangun stack observability untuk performance testing: Grafana dashboards, Prometheus metrics, distributed tracing dengan Jaeger/Tempo, dan cara mengintegrasikan monitoring selama load test untuk menemukan bottleneck secara real-time.

Setelah di episode 8 kita memahami frontend performance, kini saatnya membahas komponen yang membuat performance testing benar-benar powerful: monitoring dan metrics. Load test tanpa monitoring hanya menghasilkan angka di terminal — angka yang memberitahu "berapa cepat" tetapi tidak "mengapa". Monitoring memberikan konteks: mengapa latency naik, di mana bottleneck muncul, dan resource mana yang kehabisan kapasitas.
Observability yang baik adalah senjata paling powerful seorang Performance Test Engineer. Di episode ini, kita akan membangun pemahaman tentang Grafana, Prometheus, distributed tracing, dan cara mengintegrasikan semuanya selama load test.
Metrics adalah angka-angka yang diukur dari waktu ke waktu — CPU usage, memory consumption, request count, error rate, latency. Metrics menjawab pertanyaan: "Apa yang terjadi di sistem saya sekarang?" dan "Bagaimana trennya?".
Logs adalah catatan peristiwa kronologis — setiap request, error, atau perubahan state mencetak log entry. Logs menjawab pertanyaan: "Mengapa sesuatu terjadi?" — tetapi sulit di-scale karena volume yang besar.
Traces adalah jejak perjalanan satu request melalui seluruh sistem — dari client sampai database dan kembali. Traces menjawab pertanyaan: "Di mana delay terjadi dalam satu request?" — krusial untuk debugging latency di microservices.
Prometheus adalah time-series database untuk metrics. Ia mengumpulkan metrics dari aplikasi, infrastructure, dan tools monitoring lainnya, lalu menyimpannya untuk query dan alerting.
docker run -d --name prometheus \
-p 9090:9090 \
-v prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus| Type | Deskripsi | Contoh |
|---|---|---|
| Counter | Naik terus, tidak turun | Total HTTP requests |
| Gauge | Naik dan turun | CPU usage, memory usage |
| Histogram | Distribusi nilai dalam bucket | Response time distribution |
| Summary | Percentile yang dihitung di client | p95 latency |
# Request rate per detik
rate(http_requests_total[5m])
# Error rate
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])
# p95 latency (dari histogram)
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))Grafana adalah platform visualisasi yang menghubungkan Prometheus (metrics), Loki (logs), dan Tempo/Jaeger (traces) ke dashboard interaktif.
docker run -d --name grafana \
-p 3000:3000 \
-e GF_SECURITY_ADMIN_PASSWORD=admin \
grafana/grafanaDashboard performance testing yang baik harus menampilkan:
# Grafana dashboard JSON (simplified)
{
"panels": [
{
"title": "Request Rate",
"type": "timeseries",
"targets": [{
"expr": "rate(http_requests_total[1m])",
"legendFormat": "{{method}} {{status}}"
}]
},
{
"title": "p95 Latency",
"type": "timeseries",
"targets": [{
"expr": "histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))",
"legendFormat": "p95"
}]
}
]
}Jaeger adalah distributed tracing system yang mengikuti perjalanan request melalui microservices. Setiap service mencetak span (unit kerja) yang terhubung dalam satu trace.
// Contoh tracing di k6 dengan ekstensi opentelemetry
import { Counter } from 'k6/metrics';
const requestCount = new Counter('requests');
export default function () {
const res = http.get('https://api.example.com/products');
requestCount.add(1);
// Trace data dikirim ke Jaeger via OpenTelemetry exporter
}Grafana Tempo adalah backend distributed tracing yang terintegrasi alami dengan Grafana. Jika kalian sudah menggunakan Grafana, Tempo adalah pilihan paling natural untuk traces.
# k6 bisa mengirim metrics ke Prometheus via pushgateway
k6 run --out prometheus=http://localhost:9091 script.jsDi sisi server, pastikan system metrics terpantau:
# CPU, memory, disk I/O
htop # Real-time system monitor
iostat -x 1 # Disk I/O per detik
sar -n DEV 1 # Network traffic per detikJika CPU usage tinggi (80-100%) dan latency naik → sistem CPU-bound. Solusi: optimize code, add CPU, atau cache hasil komputasi.
Jika memory usage naik terus selama test → indikasi memory leak. Solusi: profiling memory, perbaiki resource management.
Jika disk I/O atau network I/O menjadi bottleneck → sistem I/O-bound. Solusi: optimize queries, add caching, gunakan connection pooling.
Jika database shows high lock wait time → concurrent writes saling berebut lock. Solusi: optimize transactions, gunakan optimistic locking, atau sharding.
Di episode 9 ini kalian telah memahami monitoring & metrics untuk performance testing:
Di episode 10 selanjutnya, kita akan mempelajari Analysis & Bottleneck Detection — cara menganalisis hasil monitoring dan load test untuk menemukan bottleneck spesifik dan rekomendasi perbaikan. Siapkan data monitoring kalian!