Belajar Observability dengan LGTM Stack - PromQL - Prometheus Query Language
Episode 7 of 36

Belajar Observability dengan LGTM Stack - PromQL - Prometheus Query Language

PromQL adalah bahasa query untuk membaca metrik dari Mimir. Episode ini membahas instant vector dan range vector, operator dan agregasi, pola query umum seperti rate dan histogram_quantile, fungsi-fungsi penting, serta best practices untuk performa query.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Semua metrik di Mimir tidak ada artinya tanpa bahasa untuk membacanya. PromQL (Prometheus Query Language) adalah bahasa query yang memungkinkan kalian memilih deret waktu, menghitung rate, mengagregasi lintas label, dan menghitung persentil latency.

Episode ini membangun pemahaman PromQL dari nol: konsep vector, selector label, operator, pola query umum, fungsi-fungsi penting, dan best practices performa. Ini adalah skill yang paling sering kalian pakai di Grafana, dashboard, dan alert rule.

PromQL Basics

Instant Vector vs Range Vector

PromQL bekerja dengan dua tipe data utama:

  • Instant vector: kumpulan deret waktu dengan nilai tunggal pada satu titik waktu — contoh: http_requests_total.
  • Range vector: kumpulan deret waktu dengan nilai selama rentang waktu — contoh: http_requests_total[5m].

Fungsi seperti rate dan increase membutuhkan range vector sebagai input, sedangkan query pada dashboard membutuhkan instant vector sebagai output.

Selectors dan Operator

Selector memilih deret berdasarkan nama dan label:

Contoh selector PromQL
http_requests_total{status="500"}
http_requests_total{status=~"5.."}
http_requests_total{job!="cron"}

Operator di PromQL terbagi tiga jenis:

  • Arithmetic: +, -, *, /, %.
  • Comparison: ==, !=, >, <, >=, <=.
  • Logical: and, or, unless.
Agregasi umum PromQL
sum | avg | max | min | count

Agregator seperti sum menggabungkan beberapa deret menjadi satu berdasarkan label.

Common Query Patterns

Rate dan Increase

rate menghitung rata-rata kenaikan counter per detik — output paling umum untuk metrik RED. Sedangkan increase menghitung total kenaikan selama rentang waktu.

Menghitung request rate
rate(http_requests_total[5m])
increase(http_requests_total[5m])

Query rate(http_requests_total[5m]) memberi tahu berapa request per detik rata-rata dalam 5 menit terakhir. Ini adalah pola dasar dashboard RED method.

Persentil Latency dengan histogram_quantile

Histogram menyimpan distribusi latency dalam bucket. Untuk menghitung persentil ke-95:

Persentil ke-95 latency
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

Fungsi histogram_quantile(0.95, ...) menginterpolasi nilai persentil dari bucket histogram. Konsep ini wajib dipahami karena hampir semua SLO latency di episode 20 memakai persentil.

Fungsi Prediksi dan Lainnya

  • predict_linear(http_requests_total[1h], 3600): memprediksi nilai 1 jam ke depan untuk capacity planning.
  • irate(http_requests_total[5m]): rate instan yang sensitif terhadap lonjakan.
  • delta(counter[5m]): perubahan nilai gauge.
  • avg_over_time(metric[5m]): rata-rata nilai selama rentang waktu.

Advanced PromQL

Subqueries

Subquery memungkinkan query berisi rentang waktu yang dihitung dari hasil query lain, berguna untuk agregasi berlapis. Contoh menghitung rata-rata rate per menit:

Contoh subquery
avg_over_time(rate(http_requests_total[1m])[15m:1m])

Recording Rules

Recording rules menyimpan hasil query yang mahal menjadi metrik baru bernama, sehingga dashboard tinggal membaca hasil yang sudah jadi. Aturan ditulis dalam bentuk YAML:

Contoh recording rule
groups:
  - name: checkout.rules
    rules:
      - record: job:http_requests:rate5m
        expr: sum(rate(http_requests_total[5m])) by (job)

Aturan job:http_requests:rate5m akan menghasilkan metrik turunan yang bisa langsung diquery tanpa menghitung rate setiap kali. Metrik hasil recording rule biasanya mengikuti konvensi level:metric:operation.

Alerting Rules dan Label Manipulation

Alerting rules adalah aturan yang mengevaluasi kondisi tertentu dan menghasilkan alert — detail lengkap di episode 19. Untuk manipulasi label, PromQL menyediakan fungsi label_replace dan label_join untuk menulis ulang atau menggabungkan label.

Best Practices

  • Optimasi performa: mulai query dengan selector label yang membatasi, gunakan recording rules untuk query berat, dan hindari subquery berlapis tanpa kebutuhan.
  • Hindari high cardinality: jangan pernah menambah label bernilai tinggi pada metrik; ini memperlambat query dan menghabiskan memori.
  • Pilih time range yang tepat: range vector terlalu panjang memperlambat query; cukup untuk kebutuhan dashboard.
  • Desain alert query dengan hati-hati: gunakan for dan kondisi yang stabil agar alert tidak flapping — dibahas detail di episode 19.

Tip

Di Grafana, gunakan Query inspector untuk melihat durasi setiap query. Jika satu query memakan waktu lama, pertimbangkan memecahnya atau memindahkan ke recording rule.

Penutup

Di episode 7 ini kalian menguasai dasar-dasar PromQL: perbedaan instant vector dan range vector, operator dan agregasi, pola umum rate, increase, dan histogram_quantile, fungsi-fungsi lanjutan seperti predict_linear, serta best practices untuk performa query.

Inti yang harus dibawa pulang:

  • Instant vector untuk nilai saat ini, range vector untuk rentang waktu.
  • rate adalah pola utama untuk metrik RED.
  • histogram_quantile menghitung persentil dari bucket histogram.
  • Recording rules menyimpan query mahal menjadi metrik turunan.
  • Selector label membatasi data sejak awal query.
  • Hindari high cardinality demi performa dan biaya.

Di episode 8 selanjutnya kita akan membahas instrumenting applications untuk metrics — memakai library Prometheus dan OpenTelemetry SDK untuk membuat counter, gauge, dan histogram, pola manual dan auto-instrumentation, serta mengekspos metrik lewat endpoint metrics dan OTLP. Waktunya membuat aplikasi kalian sendiri berbicara.

Belajar Observability dengan LGTM Stack - PromQL - Prometheus Query Language | Belajar Observability dengan LGTM Stack