Kodeloka
  1. Kodeloka
  2. Kelas Grafana
  3. Materi

Modul 4 · Modul 4 dari 15

Anatomi Dashboard: JSON Model, Panel, dan Time Range

Membedah struktur dashboard dari dalam, karena setiap fitur lanjutan pada akhirnya adalah properti di JSON model.

Dashboard Hanyalah Sebuah Dokumen JSON

Semua yang Anda klik di UI berujung pada satu dokumen JSON. Membaca JSON model adalah keterampilan yang memisahkan pengguna Grafana dari orang yang benar-benar menguasainya: ia membuat Anda bisa mendiagnosis masalah, melakukan review lewat Git, dan mengedit 40 panel dengan satu perintah sed.

kerangka dashboardjson
{
  "uid": "bayarcepat-ikhtisar",
  "title": "BayarCepat — Ikhtisar Layanan",
  "tags": ["produksi", "bayarcepat"],
  "timezone": "browser",
  "editable": true,
  "schemaVersion": 39,
  "version": 12,
  "refresh": "30s",
  "time":     { "from": "now-6h", "to": "now" },
  "timepicker": {
    "refresh_intervals": ["10s","30s","1m","5m","15m","1h"],
    "hidden": false
  },
  "templating": { "list": [] },
  "annotations": { "list": [] },
  "links": [],
  "panels": []
}

Properti yang Sering Salah Dipahami

PropertiArtiJebakan
uidIdentitas permanen dashboard, dipakai di URLBerubah = seluruh tautan lama mati
idID numerik internal per instansiHarus null saat impor ke instansi lain
versionNomor revisiSalah versi saat simpan lewat API = konflik ditolak
schemaVersionVersi format JSONGrafana memigrasikan otomatis, tidak bisa turun versi
timezonebrowser / utc / Asia/Jakartabrowser membuat screenshot tim beda-beda

Anatomi Satu Panel

satu paneljson
{
  "id": 3,
  "type": "timeseries",
  "title": "Throughput per Layanan",
  "description": "Request per detik, dikelompokkan per layanan.",
  "datasource": { "type": "prometheus", "uid": "prom-utama" },
  "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 },
  "targets": [
    {
      "refId": "A",
      "expr": "sum by (layanan) (rate(http_requests_total{env=\"$env\"}[$__rate_interval]))",
      "legendFormat": "{{layanan}}",
      "interval": ""
    }
  ],
  "fieldConfig": {
    "defaults": {
      "unit": "reqps",
      "min": 0,
      "custom": { "lineWidth": 2, "fillOpacity": 10 },
      "thresholds": {
        "mode": "absolute",
        "steps": [
          { "color": "green", "value": null },
          { "color": "red",   "value": 500 }
        ]
      }
    },
    "overrides": []
  },
  "options": {
    "legend":  { "displayMode": "table", "placement": "bottom", "calcs": ["mean","max"] },
    "tooltip": { "mode": "multi", "sort": "desc" }
  },
  "transformations": []
}
💡 Empat blok yang perlu Anda kenali
  • targets — kueri. Satu panel boleh punya banyak kueri (refId A, B, C…).
  • fieldConfig — bagaimana nilai ditampilkan: unit, desimal, threshold, warna. Berlaku untuk semua tipe panel.
  • options — pengaturan khas tipe panel: legenda, tooltip, orientasi.
  • transformations — pengolahan data frame sebelum digambar.

Sistem Grid

Kanvas dashboard selalu selebar 24 unit, apa pun ukuran layar. Tinggi satu unit ±30 piksel.

tata letaktext
┌──────────────── 24 unit ─────────────────┐
│  w:6      w:6      w:6      w:6          │  baris stat, h:4
├──────────────────┬───────────────────────┤
│  w:12  h:8       │  w:12  h:8            │  dua grafik
├──────────────────┴───────────────────────┤
│  w:24  h:10                              │  tabel lebar penuh
└──────────────────────────────────────────┘

gridPos: { x: kolom mulai (0-23), y: baris, w: lebar, h: tinggi }

Lebar yang enak dipakai: 24 (penuh), 12 (setengah), 8 (sepertiga), 6 (seperempat). Hindari lebar ganjil seperti 7 atau 11 — barisnya jadi tidak rata.

Time Range dan Refresh

Time range dashboard diteruskan ke setiap kueri sebagai from dan to. Ada tiga cara ia ditentukan, dengan prioritas dari atas:

  1. Parameter URL: ?from=now-24h&to=now — menang atas segalanya.
  2. Pilihan pengguna di time picker (tersimpan sementara di sesi).
  3. Properti time di JSON dashboard.
⚠️ Refresh cepat itu mahal

Dashboard dengan 20 panel dan refresh 5s yang dibuka 10 orang menghasilkan 240 kueri per detik ke data source Anda. Prometheus akan sibuk melayani dashboard alih-alih melakukan scrape.

Batasi di sisi server agar tidak bergantung pada disiplin pengguna:

ini
[dashboards]
min_refresh_interval = 10s

URL Dashboard yang Perlu Anda Kuasai

pola URLtext
/d/<uid>/<slug>                      buka dashboard
   ?from=now-24h&to=now              time range absolut/relatif
   &var-env=produksi&var-layanan=api  isi variabel
   &viewPanel=3                       satu panel layar penuh
   &editPanel=3                       langsung ke editor panel
   &kiosk                             mode kios (tanpa menu) untuk TV
   &refresh=1m                        paksa interval refresh
   &theme=light                       tema, berguna untuk screenshot

slug hanya kosmetik — yang mengikat adalah uid. Karena itu mengganti judul dashboard aman, mengganti UID tidak.