Kodeloka
  1. Kodeloka
  2. Kelas Prometheus
  3. Materi

Modul 6 · Modul 6 dari 15

PromQL Dasar: Selector, Matcher & Tipe Vektor

Fondasi bahasa query Prometheus: cara memilih data, empat jenis matcher, dan perbedaan krusial instant vector dan range vector.

Dua Tipe Data yang Wajib Anda Bedakan

Hampir semua error PromQL pemula berasal dari kebingungan ini.

TipeIsiContohDipakai oleh
Instant vectorSatu nilai per series, pada satu titik waktuupAgregasi, operator aritmatika
Range vectorDeretan nilai dalam rentang waktuup[5m]rate(), increase(), *_over_time()
ScalarSatu angka biasa42Perbandingan, pengali
StringTeks"produksi"Jarang dipakai langsung
⛔ Error paling sering: salah tipe vektor
promql
❌ rate(http_requests_total)          # error: butuh range vector
✅ rate(http_requests_total[5m])

❌ sum(http_requests_total[5m])       # error: sum butuh instant vector
✅ sum(rate(http_requests_total[5m]))

❌ http_requests_total[5m] > 100      # error: tidak bisa membandingkan range vector
✅ rate(http_requests_total[5m]) > 100

Aturan sederhana: fungsi yang namanya mengandung rate, increase, delta, atau _over_time butuh [durasi]. Fungsi agregasi (sum, avg, max) tidak boleh diberi [durasi].

Empat Jenis Label Matcher

matcherpromql
http_requests_total{job="api"}            # =   sama persis
http_requests_total{job!="api"}           # !=  tidak sama
http_requests_total{status=~"5.."}        # =~  cocok regex  (500-599)
http_requests_total{status!~"2..|3.."}    # !~  tidak cocok regex

# Beberapa matcher digabung dengan koma = operator DAN
http_requests_total{job="api", status=~"5..", lingkungan="produksi"}

# Memilih berdasarkan nama metrik dengan regex
{__name__=~"http_.*_total", job="api"}
⚠️ Regex di PromQL selalu fully anchored

Pola status=~"5" tidak cocok dengan "500". Prometheus secara otomatis membungkus pola Anda menjadi ^(?:5)$ — jadi harus cocok seluruhnya.

promql
❌ {status=~"5"}       # hanya cocok dengan status yang persis "5"
✅ {status=~"5.."}     # cocok 500, 502, 503, …
✅ {status=~"5.*"}     # cocok apa pun yang diawali 5

Fungsi *_over_time — Agregasi Sepanjang Waktu

Fungsi agregasi biasa (sum, avg) menggabungkan antar-series. Fungsi _over_time menggabungkan sepanjang waktu untuk setiap series.

over-timepromql
avg_over_time(node_load1[1h])        # rata-rata load 1 jam terakhir
max_over_time(node_load1[24h])       # puncak dalam 24 jam
min_over_time(node_load1[24h])
sum_over_time(antrean_panjang[1h])
count_over_time(up[1h])              # berapa sampel terkumpul (deteksi scrape bolong)
last_over_time(harga_terakhir[1h])
stddev_over_time(latency_seconds[1h])
quantile_over_time(0.95, node_load1[1h])
present_over_time(up[5m])            # apakah series ini ada sama sekali

Menggeser Waktu: offset dan @

pergeseran-waktupromql
# Nilai satu minggu lalu — untuk membandingkan pola mingguan
sum(rate(http_requests_total[5m] offset 7d))

# Perbandingan minggu ini vs minggu lalu (dalam persen)
100 * (
  sum(rate(http_requests_total[5m]))
  / sum(rate(http_requests_total[5m] offset 7d))
  - 1
)

# Nilai pada timestamp absolut (Unix epoch)
node_memory_MemAvailable_bytes @ 1735689600

Fungsi Bantu yang Sering Dibutuhkan

utilitaspromql
# Deteksi metrik yang HILANG — sangat penting untuk alert
absent(up{job="pembayaran"})              # bernilai 1 bila series tidak ada
absent_over_time(up{job="pembayaran"}[10m])

# Pembulatan & pembatasan
round(node_load1, 0.1)
clamp_max(persen_cpu, 100)
clamp_min(sisa_saldo, 0)

# Manipulasi label
label_replace(up, "host", "$1", "instance", "([^:]+):.*")
label_join(up, "alamat", "-", "job", "instance")

# Waktu
time()                    # timestamp query saat ini
timestamp(up)             # timestamp sampel
node_time_seconds - node_boot_time_seconds   # uptime
💡 absent() menyelamatkan Anda dari "alert yang tidak pernah berbunyi"

Alert up{job="pembayaran"} == 0 hanya berbunyi bila series up itu ada. Bila seluruh job hilang dari konfigurasi (misalnya seseorang salah edit YAML), tidak ada series sama sekali — dan alert Anda diam sempurna sementara layanan pembayaran tidak terpantau.

promql
absent(up{job="pembayaran"}) == 1

Pasangkan kedua alert ini untuk setiap layanan kritis.