> ## Documentation Index
> Fetch the complete documentation index at: https://docs.skanesgalab.my.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Panduan Lengkap Prometheus & Grafana

> Arsitektur mendalam Prometheus time-series database, exporter (Node Exporter), bahasa kueri PromQL lengkap, visualisasi dasbor Grafana profesional, dan setup docker-compose.

Kombinasi **Prometheus & Grafana** adalah standar industri nomor satu di dunia open-source untuk pemantauan metrik infrastruktur, kontainer Docker, dan kluster Kubernetes.

***

## 1. Arsitektur Prometheus

Prometheus adalah sistem pemantauan dan basis data deret waktu (*Time-Series Database - TSDB*) yang dirancang khusus untuk metrik numerik.

```mermaid theme={null}
flowchart TD
    subgraph Targets["Target Server / Aplikasi"]
        NodeExp["Node Exporter\n(Port 9100 - OS Metrics)"]
        cAdvisor["cAdvisor\n(Port 8080 - Docker Metrics)"]
        App["Aplikasi Web\n(/metrics endpoint)"]
    end

    subgraph CorePrometheus["Prometheus Core Server"]
        ScrapeEngine["Retrieval Engine (Pull Model via HTTP)"]
        TSDB["Time-Series Storage (TSDB Local Disk)"]
        PromQL["PromQL Engine & HTTP API"]
    end

    subgraph VisualizationAndAlert["Visualisasi & Alert"]
        Grafana["Grafana Dashboard\n(Port 3000)"]
        Alertmanager["Prometheus Alertmanager\n(Port 9093)"]
    end

    ScrapeEngine -->|Scrape HTTP GET /metrics| NodeExp
    ScrapeEngine -->|Scrape HTTP GET /metrics| cAdvisor
    ScrapeEngine -->|Scrape HTTP GET /metrics| App
    ScrapeEngine --> TSDB
    TSDB --> PromQL
    PromQL --> Grafana
    PromQL --> Alertmanager
```

### Mengapa Prometheus Menggunakan Model "Pull", Bukan "Push"?

Mayoritas sistem monitoring lama menggunakan agen yang "mendorong" (*push*) data ke server pusat. Prometheus secara unik menggunakan model **PULL (Tarik Data)**:

1. **Target Menyediakan Endpoint:** Aplikasi atau server target hanya bertugas membuka port HTTP dan menyajikan data metrik dalam format teks biasa di endpoint `/metrics`.
2. **Prometheus Menarik Data Secara Terjadwal:** Prometheus server mendatangi (*scrape*) target setiap 15 detik sekali via HTTP GET.
3. **Keuntungan:**
   * Server target tidak akan membebani server monitoring saat terjadi lonjakan trafik (*overwhelming*).
   * Prometheus dapat langsung mendeteksi jika sebuah target mati (jika scrape HTTP gagal, target otomatis ditandai `down`).
   * Kemudahan pengujian: kamu bisa membuka URL `http://target-ip:9100/metrics` di browser untuk membaca metrik secara langsung tanpa software khusus!

***

## 2. 4 Jenis Tipe Data Metrik di Prometheus

1. **Counter:** Nilai angka yang **hanya bisa naik atau di-reset ke 0** saat server restart (contoh: total jumlah pengunjung, total jumlah error HTTP, total byte jaringan terkirim).
2. **Gauge:** Nilai angka yang **bisa naik dan turun** secara bebas sewaktu-waktu (contoh: persentase penggunaan CPU, suhu prosesor, pemakaian RAM, sisa kapasitas harddisk).
3. **Histogram:** Menghitung jumlah sampel dan mengelompokkannya ke dalam rentang keranjang (*buckets*) tertentu (contoh: menghitung latensi request HTTP di bawah 100ms, 500ms, 1000ms).
4. **Summary:** Mirip dengan histogram, namun langsung menghitung persentil dinamis di sisi klien (contoh: latensi p50, p90, p99).

***

## 3. Format Data Metrik Prometheus

Setiap baris metrik memiliki struktur label key-value yang sangat kaya:

```text theme={null}
# HELP node_cpu_seconds_total Total seconds spent by CPU in various states.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 128934.52
node_cpu_seconds_total{cpu="0",mode="system"} 1204.18
node_cpu_seconds_total{cpu="0",mode="user"} 4521.89

# HELP http_requests_total Total number of HTTP requests processed
# TYPE http_requests_total counter
http_requests_total{method="POST",handler="/api/login",status="200"} 4520
http_requests_total{method="POST",handler="/api/login",status="500"} 12
```

***

## 4. Panduan Lengkap Bahasa Kueri PromQL (Prometheus Query Language)

PromQL adalah bahasa kueri yang sangat kuat untuk memfilter, memotong, dan menghitung statistik metrik:

### 1. Seleksi dan Filter Label

```promql theme={null}
# Menampilkan metrik hanya untuk method POST dan status error 500
http_requests_total{method="POST", status="500"}

# Filter menggunakan Regular Expression (semua error status 5xx)
http_requests_total{status=~"^5.."}

# Filter semua method KECUALI GET
http_requests_total{method!="GET"}
```

### 2. Rentang Waktu (Range Vector) & Fungsi `rate()`

Karena Counter nilainya selalu naik, melihat angka mentah `http_requests_total` tidak berguna (hanya menunjukkan total sejak server nyala). Kita ingin tahu **kecepatan request per detik dalam 5 menit terakhir**:

```promql theme={null}
# Menghitung laju request per detik (RPS)
rate(http_requests_total[5m])

# Menghitung total request per detik dikelompokkan per handler/endpoint
sum by (handler) (rate(http_requests_total[5m]))
```

### 3. Menghitung Persentase Utilisasi CPU Server:

```promql theme={null}
# Menghitung persentase penggunaan CPU non-idle (100% - idle)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
```

### 4. Menghitung Persentase Pemakaian RAM Server:

```promql theme={null}
# (Total RAM - RAM Bebas) / Total RAM * 100
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
```

### 5. Menghitung Sisa Kapasitas Harddisk (Disk Space):

```promql theme={null}
# Menghitung sisa harddisk root (/) dalam Gigabyte
node_filesystem_free_bytes{mountpoint="/"} / (1024 * 1024 * 1024)
```

***

## 5. Hands-On: Setup Prometheus + Node Exporter + Grafana (Docker Compose)

Kita akan menyalakan ekosistem monitoring lengkap dalam 1 berkas `docker-compose.yml`.

### 1. Buat Berkas Konfigurasi `prometheus.yml`:

```yaml theme={null}
global:
  scrape_interval: 15s     # Tarik data setiap 15 detik
  evaluation_interval: 15s # Evaluasi aturan alert setiap 15 detik

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node_exporter"
    static_configs:
      - targets: ["node-exporter:9100"]
```

### 2. Buat Berkas `docker-compose.yml`:

```yaml theme={null}
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v2.48.0
    container_name: prometheus
    restart: unless-stopped
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=15d' # Simpan riwayat 15 hari
      - '--web.enable-lifecycle'             # Reload config tanpa restart via API
    ports:
      - "9090:9090"

  node-exporter:
    image: prom/node-exporter:v1.7.0
    container_name: node-exporter
    restart: unless-stopped
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    ports:
      - "9100:9100"

  grafana:
    image: grafana/grafana:10.2.2
    container_name: grafana
    restart: unless-stopped
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=adminrahasia
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    depends_on:
      - prometheus

volumes:
  prometheus_data:
  grafana_data:
```

### 3. Menjalankan Kluster Monitoring

```bash theme={null}
docker compose up -d
```

Verifikasi bahwa ketiga container berjalan:

```bash theme={null}
docker compose ps
```

***

## 6. Visualisasi Grafana: Menghubungkan & Mengimpor Dasbor

Grafana adalah lapisan presentasi visual yang mengubah baris PromQL menjadi grafik, gauge, heatmap, dan tabel yang indah.

### Langkah 1: Login ke Grafana

1. Buka peramban ke `http://ip-server-kamu:3000`.
2. Masukkan Username: `admin` dan Password: `adminrahasia`.

### Langkah 2: Menambahkan Prometheus sebagai Data Source

1. Klik menu **Connections** $\to$ pilih **Data sources**.
2. Klik tombol **Add data source** $\to$ pilih **Prometheus**.
3. Pada kolom **Prometheus server URL**, isi: `http://prometheus:9090` (menggunakan nama DNS service docker compose).
4. Gulir ke bawah dan klik tombol hijau **Save & test**. (Akan muncul pesan *"Successfully queried the Prometheus API"*).

### Langkah 3: Mengimpor Dasbor Profesional Komunitas (ID: 1860)

Kamu tidak perlu merancang ratusan panel grafik CPU, RAM, Disk, dan Network dari nol. Komunitas Grafana menyediakan ribuan template dasbor siap pakai:

1. Di menu sidebar Grafana, klik **Dashboards** $\to$ klik tombol **New** $\to$ pilih **Import**.
2. Pada kolom *Import via grafana.com*, masukkan ID template populer: **`1860`** (*Node Exporter Full Dashboard*).
3. Klik tombol **Load**.
4. Pada pilihan sumber data Prometheus, pilih koneksi Prometheus yang tadi dibuat.
5. Klik **Import**.

**Hasil:** Kamu langsung disajikan dasbor kelas dunia yang menampilkan CPU usage per core, saturasi RAM, I/O disk harddisk, suhu server, hingga grafik lalu lintas bandwidth jaringan secara *real-time*!


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.