Kodeloka
  1. Kodeloka
  2. Kelas Grafana
  3. Materi

Modul 5 · Modul 5 dari 15

Query Editor, $__interval, dan Legenda yang Terbaca

Menulis kueri panel yang efisien, memahami variabel interval bawaan Grafana, dan membuat legenda yang tidak membuat dashboard tak terbaca.

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.

dua kueri dalam satu panelpromql
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 persen
🎯 Expression: kalkulasi tanpa membebani data source

Grafana 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

VariabelNilainyaKapan dipakai
$__intervalrentang waktu ÷ lebar panel dalam piksel, dibulatkanGROUP BY di SQL, step manual
$__rate_intervalmax(interval + scrape, 4 × scrape)Selalu untuk rate(), increase()
$__rangeSeluruh rentang waktu dashboardTotal sepanjang rentang
$__interval_ms$__interval dalam milidetikKueri yang butuh angka
$__from / $__toEpoch milidetikAPI kustom, tautan eksternal
⛔ Kesalahan paling umum: rate() dengan rentang tetap
promql
❌ 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

RangeInstant
HasilDeret titik sepanjang waktuSatu nilai per series, pada waktu to
BebanBeratRingan
Panel yang cocokTime series, heatmapStat, 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

perbandingan legendatext
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 jelas

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

💡 Batasi jumlah series sebelum menggambar

Grafik dengan 300 garis tidak memberi informasi apa pun. Kurangi di tingkat kueri:

promql
# 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

OpsiFungsiKapan dipakai
Min intervalLantai bagi $__intervalCegah step lebih rapat dari scrape
Max data pointsBatas jumlah titikTurunkan ke 300–500 untuk panel berat
Relative timeGeser rentang panel ini sajaPanel "minggu lalu" di dashboard hari ini
Time shiftMundurkan rentangPerbandingan minggu-ke-minggu
Cache timeoutWaktu cache hasilData 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.