Kodeloka
  1. Kodeloka
  2. Kelas Prometheus
  3. Materi

Modul 2 · Modul 2 dari 15

Instalasi Prometheus: Docker, Binary, systemd & Windows

Memasang Prometheus dari nol sampai berhasil men-scrape target pertama, dengan konfigurasi yang aman untuk produksi.

Yang Berubah di Prometheus 3.x

Prometheus 3.0 adalah rilis mayor pertama setelah tujuh tahun di jalur 2.x. Materi ini memakai 3.x sebagai acuan. Bila Anda mengikuti tutorial lama berbasis 2.x, ini yang perlu Anda tahu:

PerubahanDampak praktis
UI web baruTampilan query & target ditulis ulang. UI lama masih bisa dipanggil sementara lewat flag, tetapi akan dihapus.
Nama label & metrik boleh UTF-8Karakter di luar [a-zA-Z0-9_] kini legal. Dalam PromQL, nama seperti itu ditulis dengan tanda kutip: {"http.status.code"="200"}. Ini mempermulus interoperabilitas dengan OpenTelemetry.
Endpoint ingest OTLPPrometheus bisa menerima kiriman metrik OpenTelemetry lewat /api/v1/otlp/v1/metrics — bukan hanya menarik (pull). Harus diaktifkan eksplisit lewat --web.enable-otlp-receiver.
Remote Write 2.0Format wire baru yang lebih hemat dan membawa metadata sekaligus, penting untuk pengiriman ke Mimir/Thanos/Cortex.
Native histogramKeluar dari status eksperimental awal dan makin matang — resolusi jauh lebih tinggi daripada histogram klasik berbasis bucket tetap.
Rentang range kini eksklusif di batas kiriPerubahan halus tapi nyata pada semantik query rentang. Periksa ulang recording rule yang sensitif terhadap batas waktu setelah upgrade.
⚠️ Sudah tidak berlaku lagi
  • Flag lama --storage.tsdb.retention (tanpa .time) sudah dihapus. Gunakan --storage.tsdb.retention.time.
  • Dukungan PromQL @ dan subquery eksperimental serta beberapa feature flag 2.x kini menjadi perilaku default — hapus flag tersebut dari unit systemd Anda saat upgrade, karena flag yang tak dikenal membuat Prometheus gagal start.
  • Protokol remote read v1 lama serta beberapa mekanisme service discovery usang telah dibuang.

Pilih Cara Instalasi Sesuai Kebutuhan

CaraCocok untukCatatan
Docker ComposeBelajar & lingkungan devTercepat, mudah dibuang
Binary + systemdServer produksi (VM)Kontrol penuh, perlu setup manual
Helm chart kube-prometheus-stackKubernetesStandar industri, sekaligus Grafana & Alertmanager
Paket OS (apt install prometheus)—Hindari: versinya biasanya sangat tertinggal

1. Docker Compose (paling cepat untuk belajar)

docker-compose.ymlyaml
services:
  prometheus:
    image: prom/prometheus:v3.5.0
    container_name: prometheus
    ports: ["9090:9090"]
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --storage.tsdb.retention.time=30d
      - --storage.tsdb.retention.size=20GB
      - --web.enable-lifecycle          # izinkan reload lewat HTTP POST
      - --web.enable-remote-write-receiver
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./rules:/etc/prometheus/rules:ro
      - prom-data:/prometheus           # WAJIB: tanpa ini data hilang saat restart
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:v1.8.2
    container_name: node-exporter
    ports: ["9100:9100"]
    pid: host
    volumes: ["/:/host:ro,rslave"]
    command: ["--path.rootfs=/host"]
    restart: unless-stopped

volumes:
  prom-data:

2. Konfigurasi Minimum yang Benar

prometheus.ymlyaml
global:
  scrape_interval:     15s    # seberapa sering mengambil metrik
  evaluation_interval: 15s    # seberapa sering rule dievaluasi
  scrape_timeout:      10s    # HARUS lebih kecil dari scrape_interval
  external_labels:
    cluster: produksi-jkt     # penting saat ada beberapa Prometheus
    replica: prom-01

rule_files:
  - /etc/prometheus/rules/*.yml

alerting:
  alertmanagers:
    - static_configs:
        - targets: ["alertmanager:9093"]

scrape_configs:
  # Prometheus memantau dirinya sendiri
  - job_name: prometheus
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: node
    static_configs:
      - targets: ["node-exporter:9100"]
        labels:
          lingkungan: produksi

  - job_name: api
    metrics_path: /metrics       # default sudah /metrics
    scheme: http
    static_configs:
      - targets: ["api-1:8080", "api-2:8080"]

3. Binary + systemd (produksi di VM)

Terminalbash
# Unduh (sesuaikan versi terbaru dari prometheus.io/download)
VERSI=3.1.0
curl -LO https://github.com/prometheus/prometheus/releases/download/v${VERSI}/prometheus-${VERSI}.linux-amd64.tar.gz
tar xzf prometheus-${VERSI}.linux-amd64.tar.gz
cd prometheus-${VERSI}.linux-amd64

# Pengguna khusus tanpa shell — jangan jalankan sebagai root
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo cp prometheus promtool /usr/local/bin/
sudo cp prometheus.yml /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
/etc/systemd/system/prometheus.serviceini
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --storage.tsdb.retention.time=30d \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --web.listen-address=0.0.0.0:9090 \
  --web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID

# Pengetatan keamanan
NoNewPrivileges=true
ProtectHome=true
ProtectSystem=full
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
Terminalbash
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus
sudo journalctl -u prometheus -f

4. Windows

Unduh prometheus-*.windows-amd64.zip dari halaman rilis, ekstrak, lalu jalankan prometheus.exe --config.file=prometheus.yml. Untuk menjalankannya sebagai service Windows, gunakan NSSM atau WinSW. Sebagai exporter metrik sistem, pakai windows_exporter (bukan node_exporter).

5. Verifikasi Instalasi

Terminalbash
# 1. Validasi konfigurasi SEBELUM reload — wajib
promtool check config prometheus.yml

# 2. Muat ulang konfigurasi tanpa restart (butuh --web.enable-lifecycle)
curl -X POST http://localhost:9090/-/reload

# 3. Cek kesehatan
curl http://localhost:9090/-/healthy
curl http://localhost:9090/-/ready

# 4. Lihat target yang sedang di-scrape
curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | {job:.labels.job, health:.health, lastError:.lastError}'
⛔ Kesalahan instalasi yang paling sering & paling mahal
  • Lupa volume untuk data. Tanpa prom-data:/prometheus, seluruh riwayat metrik hilang setiap container di-restart.
  • Membiarkan port 9090 terbuka ke internet. Prometheus tidak punya autentikasi bawaan. Siapa pun yang bisa mengaksesnya bisa membaca seluruh metrik infrastruktur Anda — termasuk topologi, versi software, dan pola trafik. Lindungi dengan reverse proxy, firewall, atau VPN.
  • scrape_timeout lebih besar dari scrape_interval. Prometheus akan menolak konfigurasi ini.
  • Reload tanpa validasi. Konfigurasi yang salah membuat reload gagal diam-diam, dan Anda mengira perubahannya sudah aktif.