Incident Response & Postmortems — DevOps

Incident Response Ketika production down, bukan saatnya panik. Incident response adalah proses terstruktur untuk menangani outage dengan cepat dan efektif…

Incident response adalah cara terstruktur menangani gangguan production: mendeteksi, menilai seberapa parah, memulihkan layanan secepatnya, lalu belajar darinya lewat postmortem. Bayangin regu pemadam kebakaran. Komandan regu gak ikut memegang selang: dia membagi tugas dan mengambil keputusan. Api dipadamkan dulu, penyebabnya diselidiki belakangan. Laporan sesudahnya membahas kenapa api bisa merambat (kabel tua, gak ada alat pemadam), bukan mencari siapa yang harus dihukum. Begitu juga insiden di catatan-api.

Pelajaran ini tentang insiden operasional: layanan down atau rusak. Insiden keamanan (kebocoran data, akun dibobol) punya langkah tambahan, dibahas di pelajaran Incident Response untuk Developer di track Security.

🧪 Tebakan cepat: alert error rate catatan-api firing pukul 19:06, enam menit setelah deploy v1.9.0. Belum ada yang tahu penyebabnya. Cari dulu bug-nya di kode, atau rollback dulu? Jawabannya ada di bagian "Mitigate dulu, root cause belakangan".

Severity: seberapa besar dampaknya

Langkah pertama setelah alert adalah menilai severity, karena severity menentukan siapa yang dipanggil dan seberapa cepat:

Level Artinya Contoh
SEV1 (critical) layanan down untuk semua atau hampir semua user, atau ada data hilang semua request catatan-api gagal
SEV2 (major) fungsi penting rusak atau lambat untuk sebagian user 30% user gak bisa login, sisanya normal
SEV3 (minor) mengganggu, tapi ada jalan lain ekspor PDF gagal untuk lampiran besar
SEV4 (low) kosmetik, dikerjakan di jam kerja biasa ikon bergeser 2 piksel

Kalau ragu, pilih yang lebih tinggi. Menurunkan severity itu murah, terlambat memanggil orang itu mahal.

Empat fase: detect, triage, mitigate, resolve

Ini insiden di Lab, Selasa 13 Oktober 2026 (WIB), dengan jalur tercepat:

Jam Fase Kejadian
19:00 deploy v1.9.0 (fitur tag catatan)
19:03 pool koneksi habis, 80% request gagal setelah menunggu 5 detik
19:06 detect alert CatatanApiErrorRateTinggi firing, on-call (Rani) dipanggil
19:08 triage Rani ack, membuka Grafana: error rate 80%
19:09 triage Rani menyatakan SEV1, jadi incident commander
19:10 mitigate keputusan: rollback ke v1.8.0
19:15 mitigate v1.8.0 jalan, error turun ke 0,2%
19:30 resolve stabil 15 menit, insiden ditutup

Dampaknya 12 menit (19:03 sampai 19:15). Dengan 1.000 request per menit dan 80% gagal, itu sekitar 9.600 request gagal: 22,2% dari error budget 30 hari (SLO 99,9% berarti 43.200 request boleh gagal per 30 hari, lihat pelajaran Site Reliability Engineering).

Peran: incident commander, comms, ops

Di insiden SEV1, satu orang yang mengerjakan semuanya pasti kewalahan. Perannya dibagi:

Salah satu dari mereka juga mencatat timeline dengan jam, karena ingatan di tengah insiden gak bisa dipercaya.

Status page: update yang jujur dan rutin

User yang aplikasinya error ingin tahu tiga hal: kalian tahu, kalian sedang menangani, dan kapan beres. Status page seperti status.catatan.example.com menjawabnya dengan empat status update yang umum dipakai:

Jam Status Isi
19:10 Investigating Kami sedang menyelidiki gangguan: catatan gagal dimuat dan disimpan untuk sebagian besar pengguna.
19:11 Identified Masalahnya berasal dari rilis pukul 19:00. Kami sedang mengembalikan versi sebelumnya.
19:16 Monitoring Perbaikan sudah diterapkan dan layanan kembali normal. Kami terus memantau.
19:30 Resolved Insiden selesai. Catatan bisa dimuat dan disimpan seperti biasa sejak 19:15 WIB.

Status komponennya mengikuti severity: SEV1 di sini berarti Major outage, bukan "Degraded performance". Menulis dampak lebih kecil dari kenyataannya membuat user makin kesal. Selama insiden berjalan, beri update tiap 30 menit walaupun isinya "masih diselidiki".

Mitigate dulu, root cause belakangan

Di fase mitigate, prioritasnya memulihkan layanan, bukan mencari root cause. Masalah muncul tepat setelah deploy, jadi cara tercepat adalah rollback ke v1.8.0, dan penyebabnya diselidiki setelah layanan pulih. Itu jawaban tebakannya. Lab menghitung tiga pilihan dari jam 19:10:

Pilihan Pulih Dampak Request gagal Error budget
rollback ke v1.8.0 19:15 12 menit 9.600 22,2%
restart container, lalu rollback 19:20 14 menit 11.200 25,9%
cari root cause dulu, lalu hotfix 19:51 48 menit 38.400 88,9%

Restart cuma menunda: bug-nya masih ada, jadi pool habis lagi 3 menit kemudian. Pilihan mitigasi lain yang umum: mematikan fitur lewat feature flag (pelajaran Feature Flags), menambah kapasitas (scale up), atau pindah ke server cadangan (failover). Rollback gak menghapus bug dari repo, jadi perbaikannya tetap bisa dikerjakan dengan tenang besoknya. Dan kalau ack-nya menunggu laporan user (19:21, bukan 19:08), dampaknya jadi 25 menit walaupun rollback-nya sama.

Postmortem yang blameless

Dalam beberapa hari kerja, selagi ingatan masih segar (di sini Kamis, 15 Oktober), tim menulis postmortem. Templatenya:

# Postmortem: catatan gagal dimuat dan disimpan
Tanggal: Selasa, 13 Oktober 2026
Severity: SEV1, dampak 12 menit (19:03 sampai 19:15 WIB), ~9.600 request gagal
Incident commander: Rani · Comms: Dimas · Ops: Bayu

## Timeline
- 19:00 Deploy v1.9.0 lewat pipeline
- 19:03 Pool koneksi habis, 80% request gagal
- ... (jam per jam, dari timeline yang dicatat)

## Root cause
Handler POST /catatan/:id/tag mengembalikan 400 tanpa melepas koneksi ke pool.
Tiap tag yang ditolak membocorkan satu koneksi sampai pool (max 10) habis,
lalu semua query menunggu 5 detik dan gagal.

## Faktor pendukung
- Tes cuma menguji jalur sukses: jalur validasi gagal gak pernah dites
- v1.9.0 langsung melayani 100% traffic, tanpa canary
- Belum ada alert untuk pool koneksi yang hampir penuh

## Action items
- [ ] Pakai pool.query() atau try/finally client.release() di semua handler (Bayu, 16 Okt)
- [ ] Tes integrasi: 100 tag ditolak, pool tetap tanpa koneksi bocor (Sari, 20 Okt)
- [ ] Canary 5% selama 10 menit untuk tiap rilis (Dimas, 27 Okt)

Blameless artinya fokus ke sistem dan proses, bukan ke orangnya. "Bayu lupa client.release()" benar secara fakta, tapi gak mengubah apa-apa: besok orang lain bisa lupa hal yang sama. Yang ditanyakan adalah kenapa tes, review, dan rollout membiarkannya lolos. Kalau orang takut disalahkan, mereka berhenti melaporkan kesalahan, dan tim kehilangan bahan belajarnya.

⚠️ Jebakan yang sering ketemu

TL;DR: Incident response punya empat fase: detect (idealnya lewat alert), triage (tentukan severity dan tunjuk incident commander), mitigate (pulihkan layanan secepatnya, misalnya rollback, bukan mencari root cause dulu), dan resolve (pastikan pulih, pantau, tutup). SEV1 untuk layanan down bagi semua user atau data hilang, SEV2 untuk fungsi penting yang rusak bagi sebagian user (30% gagal login itu SEV2), SEV3 untuk gangguan dengan jalan lain, SEV4 untuk kosmetik. Perannya incident commander (memimpin, gak ikut debug), comms (status page dan kabar rutin), dan ops (eksekusi). Status page bergerak dari Investigating, Identified, Monitoring, sampai Resolved, dengan dampak yang jujur. Postmortem ditulis dalam beberapa hari kerja dan blameless: fokus ke sistem dan proses, bukan orang, berisi timeline, root cause yang terbukti, faktor pendukung, dan action items dengan pemilik dan tenggat.

Yang akan kamu pelajari