Kodeloka
  1. Kodeloka
  2. Kelas Grafana
  3. Materi

Modul 8 · Modul 8 dari 15

Variabel & Templating: Satu Dashboard untuk Semua Lingkungan

Mengganti dua puluh dashboard yang nyaris sama dengan satu dashboard yang bisa disaring, termasuk variabel berantai dan panel yang menggandakan diri.

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

TipeIsinyaKasus khas
QueryHasil kueri ke data sourceDaftar layanan, instance, namespace
CustomDaftar statis yang Anda tulisproduksi, staging, dev
TextboxInput bebasFilter nama pengguna, ID pesanan
ConstantNilai tetap tersembunyiPrefix metrik, nama cluster
Data sourceDaftar data source bertipe tertentuGanti cluster Prometheus
IntervalPilihan rentang waktuKontrol granularitas manual
Ad hoc filtersFilter label dinamisEksplorasi bebas tanpa edit panel

Variabel Query untuk Prometheus

kueri variabelpromql
// 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 berantai (chained)

Variabel boleh mereferensikan variabel lain. Grafana otomatis memuat ulang variabel anak saat induknya berubah.

text
$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

cara menulis variabeltext
$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=b
⛔ Multi-value tanpa format yang benar akan merusak kueri
promql
Variabel 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"}   → benar

Aturannya: begitu sebuah variabel bisa multi-value, semua pemakaiannya di PromQL harus memakai =~, bukan =. Untuk SQL, gunakan IN (${layanan:singlequote}).

Opsi Penting pada Variabel

OpsiEfekCatatan
Multi-valueBoleh pilih beberapaWajib ubah = menjadi =~
Include AllMenambah opsi "All"Nilai default All adalah .*
Custom all valueGanti arti "All"Pakai .+ agar tidak ikut menangkap label kosong
RefreshKapan daftar dimuat ulangOn time range change untuk label yang datang dan pergi
SortUrutan tampilanNumerik alami untuk node-1, node-2, node-10
RegexSaring/ekstrak hasilGrup bernama bisa memisahkan teks dan nilai
HideSembunyikan label/variabelUntuk constant dan variabel pembantu
regex pada variabeltext
// 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.

panel yang mengulangjson
{
  "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 bukan sihir gratis

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

VariabelIsi
$__dashboardNama dashboard saat ini
$__from, $__toBatas rentang waktu (epoch ms)
$__user.login, $__user.emailIdentitas pengguna
$__org.nameNama organisasi
$__timeFilterFilter waktu untuk SQL
$__nameNama 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.