Dua Tipe Data yang Wajib Anda Bedakan
Hampir semua error PromQL pemula berasal dari kebingungan ini.
| Tipe | Isi | Contoh | Dipakai oleh |
|---|---|---|---|
| Instant vector | Satu nilai per series, pada satu titik waktu | up | Agregasi, operator aritmatika |
| Range vector | Deretan nilai dalam rentang waktu | up[5m] | rate(), increase(), *_over_time() |
| Scalar | Satu angka biasa | 42 | Perbandingan, pengali |
| String | Teks | "produksi" | Jarang dipakai langsung |
❌ 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]) > 100Aturan 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
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"}Pola status=~"5" tidak cocok dengan "500". Prometheus secara otomatis membungkus pola Anda menjadi ^(?:5)$ — jadi harus cocok seluruhnya.
❌ {status=~"5"} # hanya cocok dengan status yang persis "5"
✅ {status=~"5.."} # cocok 500, 502, 503, …
✅ {status=~"5.*"} # cocok apa pun yang diawali 5Fungsi *_over_time — Agregasi Sepanjang Waktu
Fungsi agregasi biasa (sum, avg) menggabungkan antar-series. Fungsi _over_time menggabungkan sepanjang waktu untuk setiap series.
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 sekaliMenggeser Waktu: offset dan @
# 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 @ 1735689600Fungsi Bantu yang Sering Dibutuhkan
# 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 # uptimeabsent() 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.
absent(up{job="pembayaran"}) == 1Pasangkan kedua alert ini untuk setiap layanan kritis.