Membangun performance testing yang berkelanjutan: baseline management, trend analysis, automated performance monitoring, continuous benchmarking, dan alerting untuk performance degradation secara real-time.

Setelah di episode 21 kita memahami shift-left performance engineering, kini saatnya membahas bagaimana menjaga performa tetap terjaga seiring waktu: continuous performance. Performance testing bukan one-time activity — ia harus berkelanjutan, terukur, dan terotomasi. Setiap commit bisa mengubah performa; setiap dependency update bisa mempengaruhi latency.
Continuous performance adalah philosophy: performance harus dipantau, diukur, dan divalidasi secara terus-menerus — bukan hanya saat release. Episode ini membawa kalian membangun sistem continuous performance testing.
Baseline adalah titik referensi performa yang established — data yang menunjukkan "performa normal" untuk perbandingan. Tanpa baseline, kalian tidak tahu apakah performa membaik atau memburuk.
# Jalankan test 5 kali untuk establish baseline
for i in {1..5}; do
k6 run --out json=baseline-$i.json script.js
done
# Hitung rata-rata dan standard deviation
python scripts/calculate-baseline.py --files baseline-*.jsonSimpan baseline sebagai artifact yang bisa dirujuk:
# baseline-config.yml
endpoints:
GET /products:
p95: 180ms # Baseline dari bulan lalu
p99: 350ms
throughput: 520 RPS
POST /checkout:
p95: 450ms
p99: 800ms
throughput: 120 RPSSatu data point tidak bercerita banyak. Trend — bagaimana metrik berubah dari waktu ke waktu — memberikan insight yang jauh lebih dalam tentang kesehatan performa sistem.
Buat dashboard Grafana yang menampilkan tren performa dari waktu ke waktu:
# Tren p95 latency harian
avg_over_time(http_request_duration_seconds{quantile="0.95"}[1d])
# Tren throughput mingguan
avg_over_time(rate(http_requests_total[5m])[7d:5m])
# Tren error rate bulanan
avg_over_time(rate(http_requests_total{status=~"5.."}[5m])[30d:5m])Gunakan statistical methods untuk mendeteksi anomali secara otomatis:
# Deteksi anomali menggunakan Z-score
import numpy as np
def detect_anomaly(current, historical_mean, historical_std):
z_score = (current - historical_mean) / historical_std
return abs(z_score) > 2 # Anomali jika > 2 standard deviationsSynthetic monitoring menjalankan test scripts secara berkala untuk memantau performa secara proaktif — seperti load test mini yang berjalan setiap jam.
# Synthetic monitoring schedule
name: Synthetic Performance Check
schedule: "*/30 * * * *" # Setiap 30 menit
script: scripts/performance-check.js
vus: 5
duration: 2m
thresholds:
http_req_duration: ['p(95)<300']
http_req_failed: ['rate<0.01']RUM mengukur performa dari browser user nyata — memberikan data real-world yang tidak bisa digantikan oleh synthetic monitoring.
Monitor logs untuk detect performance issues:
# Alert jika response time > 5 detik muncul lebih dari 10 kali per menit
rate(http_request_duration_seconds_bucket{le="5"}[1m]) > 10Buat benchmark suite yang berjalan di setiap commit:
# GitHub Actions: continuous benchmark
name: Performance Benchmark
on:
push:
branches: [main]
jobs:
benchmark:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run benchmark
run: k6 run --out json=benchmark.json scripts/benchmark.js
- name: Compare with baseline
run: python scripts/compare-with-baseline.py --current benchmark.json --baseline baseline.jsondef compare_benchmarks(baseline, current, tolerance=5):
results = {}
for endpoint in baseline:
base_p95 = baseline[endpoint]['p95']
curr_p95 = current[endpoint]['p95']
change_pct = ((curr_p95 - base_p95) / base_p95) * 100
results[endpoint] = {
'baseline': base_p95,
'current': curr_p95,
'change_pct': change_pct,
'regression': change_pct > tolerance,
}
return results# Prometheus alerting rules
groups:
- name: performance
rules:
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "p95 latency above 500ms for 5 minutes"
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.01
for: 2m
labels:
severity: critical
annotations:
summary: "Error rate above 1% for 2 minutes"Continuous performance membutuhkan budaya organisasi yang mendukung:
Di episode 22 ini kalian telah memahami continuous performance:
Di episode 23 selanjutnya, kita akan membahas AI Workload Performance — testing GPU performance, LLM inference latency, dan tantangan performance testing untuk AI systems. Siapkan GPU profiling kalian!