Kodeloka
  1. Kodeloka
  2. Kelas Grafana
  3. Materi

Modul 9 ยท Modul 9 dari 15

Transformations: Mengolah Data Frame Sebelum Digambar

Menggabungkan hasil beberapa kueri, merapikan kolom, dan melakukan perhitungan tanpa menyentuh bahasa kueri sumber.

Kapan Transformation adalah Jawabannya

Transformation adalah rantai operasi pada data frame yang berjalan di browser, sesudah data diterima dan sebelum digambar. Ia menyelesaikan hal-hal yang tidak bisa dilakukan bahasa kueri.

๐ŸŽฏ Urutan berpikir yang benar
  1. Bisakah dilakukan di kueri? Kerjakan di sana โ€” lebih hemat dan bisa dipakai alerting.
  2. Perlu menggabungkan dua data source? Transformation (atau Expression).
  3. Hanya soal tampilan kolom? Transformation.
  4. Butuh dipakai untuk alert? Harus Expression, bukan transformation โ€” alerting tidak menjalankan transformation.

Transformation yang Paling Sering Dipakai

NamaFungsiKasus khas
Organize fieldsSembunyikan, urutkan, ganti nama kolomMerapikan tabel
Join by fieldGabung frame pada kolom kunciMetrik + metadata dari SQL
Add field from calculationKolom baru hasil hitunganRasio, selisih, kumulatif
ReduceDeret menjadi satu baris ringkasanTabel "rata-rata & maks per layanan"
Group byKelompokkan lalu agregasiTotal per region
Filter data by valuesBuang baris berdasarkan nilaiSembunyikan yang nol
Sort byUrutkan barisTerbesar di atas
Labels to fieldsLabel menjadi kolomMenyiapkan tabel dari Prometheus
Rows to fieldsBaris menjadi kolomMembentuk tabel ringkasan
Config from queryHasil kueri menjadi setelan panelThreshold dinamis dari basis data
Partition by valuesPecah satu frame per nilaiSeries terpisah dari kolom kategori

Contoh Nyata 1 โ€” Menyatukan Metrik dan Metadata Bisnis

Prometheus tahu merchant_id, tetapi tidak tahu nama merchant. Nama itu ada di PostgreSQL. Transformation menyatukannya.

alurtext
Kueri A (Prometheus):
  sum by (merchant_id) (rate(transaksi_total[$__rate_interval]))
  โ†’ | merchant_id | Value |

Kueri B (PostgreSQL):
  SELECT id AS merchant_id, nama, tier FROM merchant
  โ†’ | merchant_id | nama | tier |

Transformations:
  1. Join by field   โ†’ field: merchant_id, mode: outer
  2. Organize fields โ†’ sembunyikan merchant_id, urutkan: nama, tier, Value
  3. Sort by         โ†’ Value, desc

Hasil:
  | nama          | tier  | Value |
  | Toko Sinar    | gold  | 42.1  |
  | Warung Bu Ani | basic | 18.7  |

Contoh Nyata 2 โ€” Rasio dari Dua Kueri

add field from calculationtext
Kueri A: sum(rate(cache_hits_total[$__rate_interval]))
Kueri B: sum(rate(cache_requests_total[$__rate_interval]))

Transformation: Add field from calculation
  Mode       : Binary operation
  Operation  : A / B
  Alias      : hit ratio

Lalu override pada "hit ratio": unit = percentunit

Untuk kebutuhan yang sama tetapi hasilnya akan dipakai alerting, gunakan Expression Math โ€” alert rule tidak menjalankan transformation.

Contoh Nyata 3 โ€” Tabel Ringkasan SLO

reduce + organizetext
Kueri: histogram_quantile(0.95, sum by (layanan, le) (
         rate(http_request_duration_seconds_bucket[$__rate_interval])))

Transformations:
  1. Reduce
       Mode        : Series to rows
       Calculations: Mean, Max, Last
  2. Organize fields
       Rename: Field โ†’ Layanan, Mean โ†’ Rata-rata, Max โ†’ Puncak
  3. Sort by: Puncak, desc

Hasil:
  | Layanan | Rata-rata | Puncak | Last  |
  | ledger  | 0.412 s   | 2.81 s | 0.39s |
  | api     | 0.180 s   | 0.94 s | 0.17s |
โš ๏ธ Urutan transformation menentukan hasil

Rantai transformation dieksekusi berurutan dari atas ke bawah; keluaran satu langkah menjadi masukan langkah berikutnya.

text
Filter โ†’ Reduce   : membuang baris dulu, ringkasan dihitung dari sisa
Reduce โ†’ Filter   : meringkas semua dulu, baru menyaring hasilnya

Angka rata-ratanya berbeda. Keduanya valid โ€” pastikan Anda memilih
yang sesuai dengan pertanyaan yang ingin dijawab.

Join by Field: Bagian yang Paling Sering Gagal

ModePerilakuPakai ketika
outerSemua baris dari semua frameIngin melihat yang tidak berpasangan
innerHanya yang cocok di semua frameTabel bersih tanpa lubang
outer (tabular)Outer untuk data non-time-seriesMenggabungkan hasil SQL

Penyebab kegagalan paling umum: tipe kolom kunci berbeda. merchant_id berupa string di Prometheus (semua label Prometheus adalah string) tetapi integer di SQL. Perbaikannya: konversi di sisi SQL dengan id::text AS merchant_id, atau pakai transformation Convert field type lebih dulu.

โ›” Transformation tidak mengurangi beban apa pun

Menarik 200.000 baris lalu memfilternya menjadi 50 dengan transformation tetap berarti 200.000 baris melintasi jaringan dan diproses browser. Waktu muat tidak membaik sedikit pun.

Filter di kueri, rapikan dengan transformation. Bukan sebaliknya.

Debugging Transformation

Buka Panel Inspect โ†’ Data, lalu gunakan pilihan "Apply panel transformations" untuk melihat frame sebelum dan sesudah. Sembilan dari sepuluh masalah transformation adalah bentuk frame yang berbeda dari yang dibayangkan โ€” misalnya Anda mengira mendapat satu frame berisi tiga kolom, padahal yang datang adalah tiga frame terpisah.