Masalah yang Diselesaikan Templating
Tanpa variabel, Anda membuat dashboard terpisah untuk tiap lingkungan, tiap layanan, tiap region — lalu memperbaiki bug yang sama dua puluh kali. Variabel mengubahnya menjadi satu dashboard dengan dropdown.
Tujuh Tipe Variabel
| Tipe | Isinya | Kasus khas |
|---|---|---|
| Query | Hasil kueri ke data source | Daftar layanan, instance, namespace |
| Custom | Daftar statis yang Anda tulis | produksi, staging, dev |
| Textbox | Input bebas | Filter nama pengguna, ID pesanan |
| Constant | Nilai tetap tersembunyi | Prefix metrik, nama cluster |
| Data source | Daftar data source bertipe tertentu | Ganti cluster Prometheus |
| Interval | Pilihan rentang waktu | Kontrol granularitas manual |
| Ad hoc filters | Filter label dinamis | Eksplorasi bebas tanpa edit panel |
Variabel Query untuk Prometheus
// semua nilai label "job"
label_values(job)
// nilai label "instance" hanya dari metrik tertentu
label_values(node_cpu_seconds_total, instance)
// dengan penyaringan — inilah dasar variabel berantai
label_values(up{env="$env"}, layanan)
// daftar nama metrik dengan awalan tertentu
metrics(^bayarcepat_)
// hasil kueri penuh (jarang, tetapi kuat)
query_result(topk(10, sum by (route) (rate(http_requests_total[5m]))))Variabel boleh mereferensikan variabel lain. Grafana otomatis memuat ulang variabel anak saat induknya berubah.
$env : custom → produksi, staging
$cluster : label_values(up{env="$env"}, cluster)
$layanan : label_values(up{env="$env", cluster="$cluster"}, layanan)
$instance : label_values(up{env="$env", layanan="$layanan"}, instance)Hasilnya: memilih "produksi" langsung mempersempit seluruh dropdown di bawahnya. Ini pola paling berguna di seluruh Grafana.
Sintaks Referensi dan Format
$layanan bentuk umum
${layanan} bila menempel teks lain: ${layanan}_total
[[layanan]] sintaks lama, masih didukung
${layanan:regex} a|b|c → untuk =~ di PromQL
${layanan:pipe} a|b|c
${layanan:csv} a,b,c → untuk IN (...) di SQL
${layanan:singlequote} 'a','b','c' → untuk SQL
${layanan:doublequote} "a","b","c"
${layanan:json} ["a","b","c"]
${layanan:text} teks tampilan, bukan nilai
${layanan:queryparam} var-layanan=a&var-layanan=bVariabel multi-value $layanan = [api, ledger]
❌ up{layanan="$layanan"}
menjadi up{layanan="{api,ledger}"} → tidak cocok apa pun
✅ up{layanan=~"$layanan"}
menjadi up{layanan=~"api|ledger"} → benarAturannya: begitu sebuah variabel bisa multi-value, semua pemakaiannya di PromQL harus memakai =~, bukan =. Untuk SQL, gunakan IN (${layanan:singlequote}).
Opsi Penting pada Variabel
| Opsi | Efek | Catatan |
|---|---|---|
| Multi-value | Boleh pilih beberapa | Wajib ubah = menjadi =~ |
| Include All | Menambah opsi "All" | Nilai default All adalah .* |
| Custom all value | Ganti arti "All" | Pakai .+ agar tidak ikut menangkap label kosong |
| Refresh | Kapan daftar dimuat ulang | On time range change untuk label yang datang dan pergi |
| Sort | Urutan tampilan | Numerik alami untuk node-1, node-2, node-10 |
| Regex | Saring/ekstrak hasil | Grup bernama bisa memisahkan teks dan nilai |
| Hide | Sembunyikan label/variabel | Untuk constant dan variabel pembantu |
// hanya instance produksi
/^prod-.*/
// buang port dari instance: 10.0.0.5:9100 → 10.0.0.5
/([^:]+):\d+/
// teks tampilan berbeda dari nilai yang dipakai kueri
/(?<text>[^.]+)\..*(?<value>.*)/Repeat: Panel dan Baris yang Menggandakan Diri
Alih-alih membuat delapan panel identik untuk delapan layanan, buat satu panel dan setel Repeat by variable.
{
"title": "$layanan — Throughput",
"repeat": "layanan",
"repeatDirection": "h",
"maxPerRow": 4,
"targets": [{
"expr": "sum(rate(http_requests_total{layanan=\"$layanan\"}[$__rate_interval]))"
}]
}Repeat juga bisa diterapkan pada row, menghasilkan satu blok panel lengkap per nilai variabel — pola standar untuk dashboard multi-cluster.
Repeat dengan variabel berisi 50 nilai menghasilkan 50 panel, masing-masing menjalankan kuerinya sendiri. Satu klik "All" bisa mengirim ratusan kueri sekaligus.
Pengaman: batasi daftar dengan regex, hindari Include All pada variabel yang dipakai untuk repeat, dan pertimbangkan satu panel teragregasi sebagai gantinya.
Variabel Global Bawaan
| Variabel | Isi |
|---|---|
$__dashboard | Nama dashboard saat ini |
$__from, $__to | Batas rentang waktu (epoch ms) |
$__user.login, $__user.email | Identitas pengguna |
$__org.name | Nama organisasi |
$__timeFilter | Filter waktu untuk SQL |
$__name | Nama series (di dalam legend/override) |
Format waktu bisa disesuaikan: ${__from:date:YYYY-MM-DD} atau ${__from:date:seconds} — berguna saat membangun tautan ke sistem eksternal.