Kodeloka
  1. Kodeloka
  2. Kelas Prometheus
  3. Materi

Modul 1 · Modul 1 dari 15

Konsep Prometheus: Model Pull, Time Series & Label

Memahami cara Prometheus menyimpan data, kenapa memakai model pull, dan apa yang sebenarnya dimaksud "satu metrik".

Masalah yang Diselesaikan Prometheus

Ketika sistem Anda hanya satu server, htop sudah cukup. Ketika menjadi 40 container yang datang dan pergi otomatis, Anda butuh sesuatu yang: mengumpulkan angka dari semua tempat, menyimpannya berurut waktu, dan bisa ditanyai "apa yang terjadi pada pukul 14:32 kemarin?".

Prometheus adalah sistem monitoring dan basis data time-series yang lahir di SoundCloud (2012), kini menjadi proyek CNCF dan standar de facto untuk monitoring infrastruktur modern — terutama di ekosistem Kubernetes.

Anatomi Satu Time Series

Ini konsep paling mendasar. Satu time series di Prometheus adalah kombinasi unik dari nama metrik dan seluruh labelnya.

satu deret waktupromql
http_requests_total{method="POST", handler="/api/pesanan", status="200", instance="10.0.0.5:8080", job="api"}
 └────── nama metrik ──────┘└─────────────────── label ───────────────────┘

  Nilai:  1523 @ 14:30:00
          1547 @ 14:30:15
          1571 @ 14:30:30   ← counter, terus naik
⛔ Setiap kombinasi label unik = satu time series baru

Bila handler punya 20 nilai, method 5 nilai, status 8 nilai, dan Anda punya 30 instance, maka dari satu nama metrik lahir 20 × 5 × 8 × 30 = 24.000 time series.

Tambahkan satu label user_id dengan 100.000 nilai, dan angkanya menjadi 2,4 miliar — Prometheus Anda akan mati. Fenomena ini disebut cardinality explosion, dan merupakan penyebab nomor satu kegagalan Prometheus di produksi.

Model Pull, Bukan Push

Prometheus mendatangi aplikasi Anda dan membaca endpoint /metrics secara berkala (default tiap 15 detik). Aplikasi tidak mengirim apa pun.

AspekPull (Prometheus)Push (StatsD, Graphite)
Siapa yang inisiatifServer monitoringAplikasi
Deteksi target matiOtomatis — metrik up=0Sulit: diam bisa berarti mati atau memang idle
KonfigurasiTerpusat di PrometheusTersebar di setiap aplikasi
Uji manualCukup curl /metricsHarus menunggu aplikasi mengirim
Job berumur pendekSulit — butuh PushgatewayMudah
Melalui NAT/firewallSulit — Prometheus harus bisa menjangkau targetMudah
💡 Keuntungan pull yang sering diremehkan

Karena Prometheus yang mendatangi, ia otomatis tahu daftar lengkap yang seharusnya ada. Bila sebuah instance tidak merespons, metrik up untuk instance itu bernilai 0 — dan Anda bisa langsung membuat alert dari situ. Pada sistem push, aplikasi yang mati hanya berhenti mengirim, dan diam itu ambigu.

Arsitektur Ekosistem

arsitekturtext
┌──────────────┐  scrape   ┌──────────────────┐
│ Aplikasi     │◀──────────│                  │
│ /metrics     │           │                  │   ┌─────────────┐
└──────────────┘           │   PROMETHEUS     │──▶│  Grafana    │
┌──────────────┐  scrape   │                  │   │ (visualisasi)│
│ node_exporter│◀──────────│  - scrape        │   └─────────────┘
│ :9100        │           │  - TSDB lokal    │
└──────────────┘           │  - PromQL        │   ┌─────────────┐
┌──────────────┐  scrape   │  - rule eval     │──▶│Alertmanager │
│ postgres_exp │◀──────────│                  │   │ (notifikasi)│
│ :9187        │           └──────────────────┘   └──────┬──────┘
└──────────────┘                    │                    │
                                    │ remote_write       ▼
                                    ▼              Slack / Email
                          Thanos / Mimir / Cortex   PagerDuty / WA
                          (penyimpanan jangka panjang)

Format Teks Exposition

Endpoint /metrics hanyalah teks biasa. Anda bisa membacanya dengan curl.

GET /metricstext
# HELP http_requests_total Jumlah total request HTTP yang diterima.
# TYPE http_requests_total counter
http_requests_total{method="GET",status="200"} 18493
http_requests_total{method="POST",status="201"} 2841
http_requests_total{method="POST",status="500"} 17

# HELP process_resident_memory_bytes Memori residen proses dalam byte.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 8.4152e+07
⚠️ Prometheus BUKAN untuk semua hal
  • Bukan untuk logging. Gunakan Loki, Elasticsearch, atau OpenSearch.
  • Bukan untuk tracing. Gunakan Tempo, Jaeger, atau Zipkin.
  • Bukan untuk data yang harus 100% akurat seperti penagihan. Prometheus mengambil sampel berkala dan bisa kehilangan data saat scrape gagal — ia dirancang untuk keandalan operasional, bukan akuntansi.
  • Bukan untuk event individual. Prometheus menyimpan agregat, bukan "request nomor 12345 dari user Budi".