> ## 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.

# Prometheus Alertmanager & Integrasi Notifikasi

> Panduan lengkap Alertmanager: arsitektur deduplikasi & grouping, penulisan alert rules, dan integrasi notifikasi real-time ke Telegram Bot, Discord Webhook, Slack, dan Email.

Dasbor monitoring yang indah tidak ada gunanya jika tim insinyur harus menatap layar monitor selama 24 jam nonstop. Ketika server mengalami kegagalan, sistem harus secara proaktif **membangunkan tim yang sedang bertugas (*On-Call Engineer*)**.

**Prometheus Alertmanager** adalah komponen resmi yang menangani peringatan (*alerts*) yang dikirimkan oleh Prometheus server, melakukan deduplikasi, pengelompokan (*grouping*), peredaman (*silencing*), dan meneruskannya ke berbagai saluran komunikasi seperti Telegram, Discord, Slack, atau Email.

***

## Alur Kerja Alerting di Prometheus

```mermaid theme={null}
flowchart TD
    subgraph PrometheusServer["Prometheus Server"]
        Metric["CPU Server = 98%"] --> RuleCheck{"Evaluasi Aturan Alert\n(for: 2m)"}
        RuleCheck -->|Kondisi Terpenuhi| FiringState["Status: FIRING"]
    end

    FiringState -->|Kirim Alert Payload JSON| Alertmanager["Alertmanager Server\n- Deduplikasi Alert Duplikat\n- Grouping (Kumpulkan jadi 1 Pesan)\n- Routing (Pilih Saluran)"]

    Alertmanager --> ChTelegram["Telegram Bot"]
    Alertmanager --> ChDiscord["Discord Webhook"]
    Alertmanager --> ChSlack["Slack Channel"]
    Alertmanager --> ChEmail["Email / AWS SNS"]
```

1. **Prometheus:** Mengevaluasi ekspresi PromQL secara periodik. Jika nilai metrik melebihi batas batas ambang selama durasi tertentu (misal CPU > 90% selama 2 menit), Prometheus menandai statusnya menjadi `FIRING` dan mengirim data ke Alertmanager.
2. **Alertmanager:**
   * **Grouping:** Jika ada 10 server mati bersamaan di satu subnet, Alertmanager tidak mengirim 10 notifikasi terpisah yang membombardir HP admin (*alert fatigue*), melainkan merangkumnya menjadi **1 notifikasi terpadu**.
   * **Inhibition:** Jika server host utama mati, Alertmanager otomatis membisukan (*mute*) notifikasi dari kontainer-kontainer kecil di dalamnya.
   * **Silencing:** Mematikan sementara notifikasi tertentu saat tim sedang melakukan jadwal perawatan terencana (*maintenance window*).

***

## 1. Menulis Aturan Peringatan (`alert_rules.yml`)

Buat berkas aturan peringatan untuk Prometheus bernama `alert_rules.yml`:

```yaml theme={null}
groups:
  - name: server_infrastructure_alerts
    rules:
      # Peringatan 1: Server Down (Tidak dapat dihubungi)
      - alert: InstanceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Server Instance {{ $labels.instance }} Mengalami Kerusakan (DOWN)"
          description: "Target {{ $labels.instance }} dari job {{ $labels.job }} tidak merespons selama lebih dari 1 menit."

      # Peringatan 2: CPU Server Terlalu Tinggi
      - alert: HighCpuUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 85
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Utilisasi CPU Tinggi pada {{ $labels.instance }}"
          description: "Penggunaan CPU melebihi 85% (Nilai saat ini: {{ $value | printf \"%.2f\" }}%)."

      # Peringatan 3: Kapasitas Harddisk Kritis (< 10%)
      - alert: DiskSpaceLow
        expr: (node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Kapasitas Harddisk Menipis pada {{ $labels.instance }}"
          description: "Sisa ruang penyimpanan pada partisi root tersisa kurang dari 10%!"
```

***

## 2. Konfigurasi Alertmanager (`alertmanager.yml`)

Berikut contoh konfigurasi lengkap `alertmanager.yml` yang menghubungkan saluran **Telegram Bot**, **Discord Webhook**, **Slack**, dan **Email (SMTP)**:

```yaml theme={null}
global:
  resolve_timeout: 5m
  # Konfigurasi SMTP Email (Gmail / AWS SES)
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alert-system@perusahaan.com'
  smtp_auth_username: 'emailkamu@gmail.com'
  smtp_auth_password: 'app-password-rahasia'
  smtp_require_tls: true

# Rute Penerusan Alert
route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s        # Waktu tunggu pengumpulan batch alert pertama
  group_interval: 5m     # Jeda waktu pengiriman pembaruan grup
  repeat_interval: 4h    # Ulangi notifikasi setelah 4 jam jika masalah belum diperbaiki
  receiver: 'telegram-and-discord' # Default receiver

receivers:
  # Saluran 1: Telegram Bot & Discord Webhook
  - name: 'telegram-and-discord'
    telegram_configs:
      - bot_token: '123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ' # Dapatkan dari @BotFather
        chat_id: -1001234567890                         # ID Grup Telegram Tim Ops
        parse_mode: 'HTML'
        send_resolved: true # Kirim pesan hijau saat server sudah pulih normal!
        message: |
          {{ if eq .Status "firing" }}🔥 <b>[ALERT - MASALAH TERDETEKSI]</b> 🔥{{ else }}✅ <b>[RESOLVED - MASALAH PULIH]</b> ✅{{ end }}
          <b>Peringatan:</b> {{ .CommonAnnotations.summary }}
          <b>Tingkat:</b> {{ .CommonLabels.severity }}
          <b>Deskripsi:</b> {{ .CommonAnnotations.description }}
          <b>Waktu:</b> {{ .StartsAt.Format "2006-01-02 15:04:05" }}

    discord_configs:
      - webhook_url: 'https://discord.com/api/webhooks/1234567890/token-rahasia'
        send_resolved: true
        title: '{{ if eq .Status "firing" }}:rotating_light: [ALERTING]{{ else }}:white_check_mark: [RESOLVED]{{ end }} {{ .CommonAnnotations.summary }}'
        message: '{{ .CommonAnnotations.description }}'

  # Saluran 2: Slack Webhook
  - name: 'slack-ops'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/T00/B00/XXXXX'
        channel: '#ops-alerts'
        send_resolved: true
        title: '[{{ .Status | toUpper }}] {{ .CommonAnnotations.summary }}'
        text: '{{ .CommonAnnotations.description }}'

  # Saluran 3: Email Notifikasi Tim Lead
  - name: 'email-admin'
    email_configs:
      - to: 'lead-devops@perusahaan.com'
        send_resolved: true
```

***

## 3. Langkah Mendapatkan Kredensial Notifikasi

### Cara Membuat Telegram Bot & Chat ID:

1. Buka aplikasi Telegram, cari akun resmi **`@BotFather`**.
2. Ketik `/newbot`, ikuti petunjuk hingga kamu mendapatkan **Bot Token HTTP API** (contoh: `678910:AAH...`).
3. Buat grup Telegram baru untuk tim DevOps kamu, lalu masukkan bot tersebut ke dalam grup.
4. Jadikan bot sebagai admin grup.
5. Kirim satu pesan sembarang di grup tersebut (misal: "Halo bot").
6. Buka URL ini di browser untuk mendapatkan Chat ID grup:
   `https://api.telegram.org/bot<TOKEN_KAMU>/getUpdates`
7. Cari nilai `"chat":{"id": -100xxxxxxx}`. Angka minus tersebut adalah **`chat_id`** grupmu.

### Cara Mendapatkan Discord Webhook URL:

1. Buka aplikasi Discord pada server milikmu.
2. Klik ikon gerigi (Settings) pada channel teks yang diinginkan (misal `#alerts-devops`).
3. Pilih menu **Integrations** $\to$ klik **Webhooks** $\to$ klik **New Webhook**.
4. Beri nama (misal: `Prometheus Bot`), lalu klik **Copy Webhook URL**.

***

## 4. Pengujian Nyata: Memastikan Pesan Terkirim

Untuk membuktikan bahwa sistem peringatan bekerja sempurna dan notifikasi masuk ke Telegram/Discord:

1. Daftarkan target dummy di `prometheus.yml` yang mengarah ke port mati:
   ```yaml theme={null}
   - job_name: "test_dummy"
     static_configs:
       - targets: ["127.0.0.1:9999"] # Port yang sengaja tidak ada aplikasi
   ```
2. Reload konfigurasi Prometheus (`curl -X POST http://localhost:9090/-/reload`).
3. Dalam waktu 1 menit, Prometheus mendeteksi target `up == 0`.
4. Buka dasbor web Alertmanager di `http://ip-server:9093`, kamu akan melihat alert berstatus **`Firing (InstanceDown)`**.
5. **Bukti Terkirim:** Ponselmu akan bergetar dan grup Telegram/Discord akan menerima pesan:
   > 🔥 **\[ALERT - MASALAH TERDETEKSI]** 🔥\
   > **Peringatan:** Server Instance 127.0.0.1:9999 Mengalami Kerusakan (DOWN)\
   > **Tingkat:** critical\
   > **Deskripsi:** Target 127.0.0.1:9999 dari job test\_dummy tidak merespons selama lebih dari 1 menit.
6. Hapus target dummy tersebut, lalu reload Prometheus. Dalam waktu singkat, Alertmanager secara otomatis mengirim pesan pemulihan berwarna hijau:
   > ✅ **\[RESOLVED - MASALAH PULIH]** ✅


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