Satu Panel, Banyak Kueri
Setiap kueri punya refId (A, B, C…). Dua kegunaan penting: menampilkan beberapa metrik berdampingan, dan menjadi masukan bagi transformation atau ekspresi matematis.
A: sum(rate(http_requests_total{status=~"5.."}[$__rate_interval]))
B: sum(rate(http_requests_total[$__rate_interval]))
# lalu tambahkan Expression (tipe Math):
C: $A / $B * 100 → error rate dalam persenGrafana punya jenis kueri khusus bernama Expression yang beroperasi pada hasil kueri lain:
- Math — aritmetika antar refId:
$A / $B. - Reduce — series menjadi satu angka:
last,mean,max. - Resample — menyeragamkan interval sebelum operasi matematis.
- Threshold — menghasilkan 0/1, dipakai berat oleh alerting.
Expression sangat berguna saat menggabungkan data dari dua data source berbeda — sesuatu yang tidak bisa dilakukan di bahasa kueri mana pun.
Variabel Interval Bawaan — Bagian Tersulit bagi Pemula
| Variabel | Nilainya | Kapan dipakai |
|---|---|---|
$__interval | rentang waktu ÷ lebar panel dalam piksel, dibulatkan | GROUP BY di SQL, step manual |
$__rate_interval | max(interval + scrape, 4 × scrape) | Selalu untuk rate(), increase() |
$__range | Seluruh rentang waktu dashboard | Total sepanjang rentang |
$__interval_ms | $__interval dalam milidetik | Kueri yang butuh angka |
$__from / $__to | Epoch milidetik | API kustom, tautan eksternal |
❌ rate(http_requests_total[5m])
Saat dashboard di-zoom ke 30 hari, step menjadi ±10 menit sementara
rentang rate tetap 5 menit → banyak titik tanpa data → grafik berlubang.
❌ rate(http_requests_total[$__interval])
Saat panel sempit, $__interval bisa menjadi 10s — lebih kecil dari
scrape_interval 15s → rate() butuh minimal dua sampel → hasil kosong.
✅ rate(http_requests_total[$__rate_interval])
Dijamin selalu mencakup minimal empat kali scrape_interval.Instant vs Range Query
| Range | Instant | |
|---|---|---|
| Hasil | Deret titik sepanjang waktu | Satu nilai per series, pada waktu to |
| Beban | Berat | Ringan |
| Panel yang cocok | Time series, heatmap | Stat, Gauge, Table, Bar gauge |
Panel Stat yang menjalankan range query lalu mengambil nilai terakhir adalah pemborosan besar: ia menarik ribuan titik untuk menampilkan satu angka. Beralih ke instant query sering memangkas waktu muat dashboard secara dramatis.
Legenda: Dari Tidak Terbaca Menjadi Berguna
Tanpa legendFormat:
{__name__="http_requests_total", instance="10.0.0.5:8080", job="api",
method="POST", route="/pesanan", status="200"} ← tak terbaca
legendFormat: {{route}} · {{status}}
/pesanan · 200 ← langsung jelasUntuk data source SQL, gunakan kolom beralias metric. Untuk Loki, gunakan label stream. Prinsipnya sama: legenda harus bisa dibaca dari jarak tiga meter saat rapat insiden.
Grafik dengan 300 garis tidak memberi informasi apa pun. Kurangi di tingkat kueri:
# hanya 5 endpoint paling lambat
topk(5, histogram_quantile(0.95,
sum by (route, le) (rate(http_request_duration_seconds_bucket[$__rate_interval]))))
# agregasi, bukan per-instance
sum by (layanan) (rate(http_requests_total[$__rate_interval]))Query Options di Tiap Panel
| Opsi | Fungsi | Kapan dipakai |
|---|---|---|
| Min interval | Lantai bagi $__interval | Cegah step lebih rapat dari scrape |
| Max data points | Batas jumlah titik | Turunkan ke 300–500 untuk panel berat |
| Relative time | Geser rentang panel ini saja | Panel "minggu lalu" di dashboard hari ini |
| Time shift | Mundurkan rentang | Perbandingan minggu-ke-minggu |
| Cache timeout | Waktu cache hasil | Data source yang mahal |
Explore: Tempat Menulis Kueri, Bukan Dashboard
Explore adalah mode kueri ad-hoc tanpa panel. Alur kerja yang efisien: susun dan uji kueri di Explore, baru pindahkan ke dashboard setelah benar. Explore juga tempat melakukan split view — misalnya metrik di kiri, log Loki di kanan, dengan time range yang tersinkron.