Kodeloka
  1. Kodeloka
  2. Kelas Prometheus
  3. Materi

Modul 12 ยท Modul 12 dari 15

Alerting Rules: Menulis Alert yang Layak Dibunyikan

Membuat alert yang benar-benar berarti, memakai for dan label dengan tepat, serta menghindari alert fatigue.

Alert yang Buruk Lebih Berbahaya daripada Tidak Ada Alert

Ketika tim menerima 200 notifikasi sehari, mereka berhenti membacanya. Insiden nyata pun lolos. Ini disebut alert fatigue, dan ia adalah penyebab utama gagalnya sistem monitoring yang secara teknis sempurna.

๐Ÿ“Œ Satu aturan penyaring: "apakah manusia harus bertindak sekarang?"

Bila jawabannya tidak, itu bukan alert โ€” itu dashboard. Setiap alert yang berbunyi harus punya tindakan jelas yang harus diambil seseorang. Bila tindakannya "lihat sebentar lalu abaikan", hapus alert itu.

Anatomi Alerting Rule

rules/alerts.ymlyaml
groups:
  - name: layanan-api
    rules:
      - alert: ErrorRateTinggi
        expr: job:http_error_ratio:rate5m{job="api"} > 0.05
        for: 10m                       # harus benar selama 10 menit berturut-turut
        keep_firing_for: 5m            # tetap firing 5 menit setelah kondisi hilang
        labels:
          severity: critical           # dipakai Alertmanager untuk routing
          tim: checkout
          layanan: api
        annotations:
          summary: "Error rate {{ $labels.job }} mencapai {{ $value | humanizePercentage }}"
          description: >-
            Job {{ $labels.job }} pada {{ $labels.instance }} mengembalikan
            error di atas 5% selama lebih dari 10 menit.
            Nilai saat ini: {{ $value | humanizePercentage }}.
          runbook_url: "https://wiki.internal/runbook/error-rate-tinggi"
          dashboard_url: "https://grafana.internal/d/api-overview"

for โ€” Peredam Kebisingan yang Paling Penting

Tanpa for, satu spike sesaat langsung membangunkan orang di tengah malam. Dengan for: 10m, alert baru berbunyi bila kondisinya bertahan.

Jenis alertfor yang disarankan
Target mati (up == 0)2mโ€“5m โ€” beri toleransi restart wajar
Error rate tinggi5mโ€“15m
Latency tinggi10mโ€“15m
Disk hampir penuh15mโ€“1h โ€” tidak mendesak
Sertifikat kedaluwarsa1h โ€” sangat tidak mendesak
Layanan pembayaran mati total0mโ€“1m โ€” memang harus segera

Template dalam Annotation

templateyaml
        annotations:
          # $labels โ€” semua label dari series yang memicu alert
          summary: "{{ $labels.instance }} di {{ $labels.region }} bermasalah"

          # $value โ€” nilai ekspresi saat alert aktif
          description: "Nilai saat ini: {{ $value }}"

          # Fungsi bantu pemformatan
          info: >-
            Persentase: {{ $value | humanizePercentage }}
            Byte:       {{ $value | humanize1024 }}B
            Durasi:     {{ $value | humanizeDuration }}
            Dibulatkan: {{ $value | printf "%.2f" }}

          # Kondisional
          catatan: '{{ if gt $value 0.5 }}KRITIS{{ else }}perhatian{{ end }}'

Pola Alert yang Terbukti Berguna

pola-alertyaml
      # 1. Target mati โ€” pasangkan SELALU dengan absent()
      - alert: TargetMati
        expr: up == 0
        for: 3m
        labels: { severity: critical }

      - alert: JobHilangDariKonfigurasi
        expr: absent(up{job="pembayaran"})
        for: 10m
        labels: { severity: critical }

      # 2. Kapasitas prediktif โ€” beri waktu untuk bertindak
      - alert: DiskAkanPenuh
        expr: |
          predict_linear(node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"}[6h], 4*3600) < 0
          and node_filesystem_avail_bytes / node_filesystem_size_bytes < 0.3
        for: 30m
        labels: { severity: warning }

      # 3. Aplikasi restart berulang (crash loop)
      - alert: AplikasiCrashLoop
        expr: changes(process_start_time_seconds[15m]) > 3
        for: 5m
        labels: { severity: critical }

      # 4. Metrik bisnis โ€” sering menangkap yang lolos alert teknis
      - alert: PesananAnjlok
        expr: |
          sum(rate(pesanan_dibuat_total[15m]))
            < 0.4 * sum(rate(pesanan_dibuat_total[15m] offset 7d))
        for: 20m
        labels: { severity: critical }
        annotations:
          summary: "Pesanan turun >60% dibanding minggu lalu jam yang sama"

Multi-Window Burn Rate โ€” Pola SLO Modern

Pola dari Google SRE Workbook: alert berbunyi cepat untuk masalah besar, dan lambat untuk masalah kecil yang berkepanjangan. Dua jendela waktu digabung agar tidak berbunyi karena spike sesaat.

burn-rateyaml
      # Cepat: budget 30 hari habis dalam ~2 jam -> bangunkan orang
      - alert: SLOBurnRateCepat
        expr: |
          slo:checkout_burn_rate:5m > 14.4
          and slo:checkout_burn_rate:1h > 14.4
        for: 2m
        labels: { severity: critical, tipe: slo }
        annotations:
          summary: "Error budget checkout habis dalam ~2 jam pada laju ini"

      # Lambat: budget habis dalam ~3 hari -> buat tiket, tidak perlu dibangunkan
      - alert: SLOBurnRateLambat
        expr: |
          slo:checkout_burn_rate:6h > 6
          and slo:checkout_burn_rate:1h > 6
        for: 15m
        labels: { severity: warning, tipe: slo }
๐Ÿ’ก Kenapa dua jendela sekaligus?

Jendela panjang (6h) memastikan masalahnya nyata dan berkelanjutan. Jendela pendek (1h) memastikan masalahnya masih berlangsung sekarang โ€” sehingga alert otomatis padam setelah insiden selesai, tanpa harus menunggu jendela panjang bergeser.