Post

Belajar SRE #3: Pengantar Incident Response

Pelajari dasar incident response untuk SRE: proses, komunikasi, dan koordinasi tim saat incident. Fondasi untuk incident management.

Belajar SRE #3: Pengantar Incident Response

Incident response adalah salah satu kemampuan paling kritis yang harus dimiliki oleh setiap engineering team. Ketika production system mengalami masalah — downtime total, degradasi performa, atau data inconsistency — cara tim merespons menentukan seberapa besar dampak yang dirasakan user. Dalam konteks SRE, incident response bukan sekadar “fix the problem as fast as possible,” melainkan proses terstruktur yang mencakup deteksi, triase, komunikasi, mitigasi, dan pembelajaran.

Jika Anda belum membaca artikel sebelumnya, mulai dari Foundation SRE: Apa Itu Site Reliability Engineering.

Prerequisites

Apa Itu Incident?

Dalam konteks SRE, incident adalah event yang menyebabkan atau berpotensi menyebabkan degradasi atau gangguan pada service yang berdampak pada user. Incident bukan hanya “server down” — bisa juga berupa peningkatan latency yang signifikan, error rate yang melonjak, atau data corruption.

✅ Yang termasuk incident:

  • Service completely down (HTTP 500 untuk semua request)
  • Latency meningkat 10x dari normal (200ms → 2s)
  • Error rate melonjak dari 0.1% ke 5%
  • Data loss atau data corruption
  • Degradasi yang melanggar SLO

❌ Bukan incident (tapi perlu perhatian):

  • Planned maintenance window
  • Bug yang tidak mempengaruhi user experience
  • Performance issue di staging environment
  • Cosmetic issue yang tidak mempengaruhi functionality

Mengapa Incident Response Penting?

Incident response yang baik bukan hanya tentang memperbaiki masalah — ini tentang meminimalkan dampak, berkomunikasi dengan jelas, dan belajar dari setiap kejadian.

Tanpa Incident ResponseDengan Incident Response
Panic dan chaos saat incidentRespons terstruktur dan tenang
Tidak jelas siapa yang bertanggung jawabRoles dan responsibilities jelas
Komunikasi kacau, stakeholder tidak tahu statusUpdate regular ke semua pihak
Waktu pemulihan lama (MTTR tinggi)MTTR lebih rendah karena proses jelas
Masalah yang sama terulangPostmortem menghasilkan improvement
Blame culture setelah incidentBlameless culture, fokus pada learning

Konsep Kunci

TermDefinisiContoh
IncidentEvent yang menyebabkan degradasi serviceAPI return 500 errors untuk 30% requests
SeverityTingkat keparahan incidentSEV-1 (critical), SEV-2 (major), SEV-3 (minor)
Incident Commander (IC)Orang yang memimpin respons incidentSenior engineer yang koordinasi semua aktivitas
Comms LeadOrang yang mengelola komunikasiEngineer yang update stakeholders dan status page
MTTDMean Time to DetectAlert fire 5 menit setelah error rate naik
MTTRMean Time to RecoveryService recovered 30 menit setelah alert
RunbookDokumentasi langkah-langkah penanganan“Jika database connection timeout, lakukan X, Y, Z”
PostmortemAnalisis setelah incident untuk learningDokumen yang menjelaskan apa yang terjadi dan action items

Severity Levels

Tidak semua incidents sama. Severity levels membantu tim memprioritaskan respons dan mengalokasikan resources yang tepat.

Severity Matrix

 Semua UserMayoritas (>50%)Sebagian (10-50%)Sedikit (<10%)
Service DownSEV-1SEV-1SEV-2SEV-3
Major DegradationSEV-1SEV-2SEV-2SEV-3
Minor DegradationSEV-2SEV-3SEV-3SEV-4
Cosmetic/MinorSEV-3SEV-4SEV-4SEV-4

Response Requirements per Severity

AspekSEV-1SEV-2SEV-3SEV-4
Response Time< 15 menit< 30 menit< 4 jamNext business day
NotificationPage on-call + escalatePage on-callSlack notificationTicket/backlog
War RoomYa, dedicated channelYa, jika perluTidakTidak
Status Page UpdateYa, setiap 30 menitYa, setiap 1 jamTidakTidak
Postmortem RequiredYa, wajibYa, wajibOptionalTidak
Target MTTR< 1 jam< 4 jam< 24 jam< 1 minggu

Incident Lifecycle

Setiap incident melewati lifecycle yang terdiri dari beberapa fase. Memahami lifecycle ini membantu tim tahu apa yang harus dilakukan di setiap tahap.

flowchart LR
    A[1. DETECT<br/>Alert fires<br/>User report] --> B[2. TRIAGE<br/>Assess impact<br/>Assign severity]
    B --> C[3. RESPOND<br/>Mitigate<br/>Communicate]
    C --> D[4. RECOVER<br/>Verify fix<br/>Monitor closely]
    D --> E[5. LEARN<br/>Postmortem<br/>Action items]
    E -.->|Improve| A

Fase 1: Detection (Deteksi)

Semakin cepat mendeteksi incident, semakin kecil dampaknya.

Metode DeteksiKecepatanReliabilityContoh
Automated MonitoringTercepat (detik-menit)TinggiPrometheus alert: error rate > 1%
Synthetic MonitoringCepat (menit)TinggiHealth check endpoint gagal
Internal ReportSedang (menit-jam)SedangEngineer notice anomaly di dashboard
Customer ReportLambat (jam)RendahUser complain di social media
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# health-check-detector.sh — Simple backup monitoring via cron

ENDPOINT="http://api.example.com/health"
SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
THRESHOLD_MS=2000

RESPONSE=$(curl -s -o /dev/null -w "%{http_code}|%{time_total}" \
  --max-time 10 "$ENDPOINT" 2>/dev/null)

HTTP_CODE=$(echo "$RESPONSE" | cut -d'|' -f1)
RESPONSE_TIME=$(echo "$RESPONSE" | cut -d'|' -f2)
RESPONSE_MS=$(echo "$RESPONSE_TIME * 1000" | bc | cut -d'.' -f1)

if [ "$HTTP_CODE" != "200" ]; then
    curl -s -X POST "$SLACK_WEBHOOK" \
      -H 'Content-type: application/json' \
      -d "{\"text\":\"INCIDENT: Health check failed - HTTP $HTTP_CODE\"}"
elif [ "$RESPONSE_MS" -gt "$THRESHOLD_MS" ]; then
    curl -s -X POST "$SLACK_WEBHOOK" \
      -H 'Content-type: application/json' \
      -d "{\"text\":\"WARNING: Slow response - ${RESPONSE_MS}ms\"}"
fi

Fase 2: Triage (Triase)

Setelah incident terdeteksi, langkah selanjutnya adalah menilai severity, scope, dan menentukan siapa yang harus merespons.

flowchart TD
    A[Alert/Report Masuk] --> B{Service completely down?}
    B -->|Ya| C[SEV-1: Page semua on-call<br/>Buka war room]
    B -->|Tidak| D{>50% user terdampak?}
    D -->|Ya| E[SEV-2: Page on-call<br/>Dedicated responder]
    D -->|Tidak| F{Revenue impact?}
    F -->|Ya| G[SEV-3: On-call investigates<br/>Business hours]
    F -->|Tidak| H[SEV-4: Create ticket<br/>Next sprint]

Fase 3: Response (Respons)

Fase response adalah inti dari incident handling. Prinsip utama:

  1. Mitigate first, debug later — Prioritas pertama adalah mengurangi dampak ke user
  2. Communicate early and often — Stakeholders harus tahu apa yang terjadi
  3. Document as you go — Catat timeline dan actions secara real-time
  4. Escalate when needed — Jangan ragu untuk minta bantuan
1
2
3
4
5
6
7
8
9
10
11
12
13
# Quick mitigation actions — "Stop the bleeding first"

# 1. Rollback deployment terakhir (jika deployment-related)
kubectl rollout undo deployment/api-server -n production

# 2. Scale up jika traffic-related
kubectl scale deployment/api-server --replicas=5 -n production

# 3. Restart service jika stuck/hung
kubectl rollout restart deployment/api-server -n production

# 4. Enable maintenance mode jika perlu waktu lebih lama
kubectl apply -f maintenance-mode.yaml

Fase 4: Recovery (Pemulihan)

StepActionVerification
1Apply fix/mitigationDeployment berhasil tanpa error
2Verify service healthHealth check endpoint return 200
3Check error rateError rate kembali ke baseline
4Check latencyResponse time kembali normal
5Monitor closely (30 min)Tidak ada re-occurrence
6Confirm with stakeholdersUser experience kembali normal
7Close incidentUpdate status page, notify team

Fase 5: Learning (Pembelajaran)

Fase terakhir — dan sering kali yang paling diabaikan — adalah learning melalui postmortem:

  • Timeline: Apa yang terjadi, kapan, dan oleh siapa?
  • Root Cause: Mengapa ini terjadi? (5 Whys analysis)
  • Impact: Berapa user terdampak? Berapa lama?
  • What Went Well: Apa yang berjalan baik dalam response?
  • What Went Wrong: Apa yang bisa diperbaiki?
  • Action Items: Langkah konkret untuk mencegah recurrence

Prinsip Blameless: Fokus pada SISTEM, bukan INDIVIDU. “X yang deploy code buggy” menjadi “Deployment process tidak memiliki automated testing”

Komunikasi Selama Incident

Komunikasi yang kurang baik selama incident bisa memperpanjang downtime secara signifikan. SRE menekankan bahwa komunikasi adalah skill yang sama pentingnya dengan debugging.

flowchart TD
    IC[Incident Commander] --> TR[Technical Responders<br/>Debug, Fix, Test]
    IC --> CL[Comms Lead<br/>Slack, Status Page, Exec]
    IC --> SME[Subject Matter Experts<br/>Database, Network, App]

Template Komunikasi

Initial Notification

INCIDENT DECLARED — [Severity Level]

What: [Deskripsi singkat masalah]
Impact: [Siapa yang terdampak dan bagaimana]
Status: Investigating
IC: [Nama Incident Commander]
War Room: #incident-YYYY-MM-DD
Next Update: [Waktu update berikutnya]

Status Update (setiap 30 menit SEV-1, 1 jam SEV-2)

INCIDENT UPDATE — [Severity Level]

Current Status: [Investigating/Identified/Mitigating/Monitoring]
What We Know: [Findings terbaru]
What We're Doing: [Actions yang sedang dilakukan]
ETA to Resolution: [Estimasi jika ada]
Next Update: [Waktu update berikutnya]

Resolution Notification

INCIDENT RESOLVED — [Severity Level]

Duration: [Total waktu incident]
Root Cause: [Ringkasan singkat]
Resolution: [Apa yang dilakukan untuk fix]
Impact Summary: [Ringkasan dampak]
Postmortem: [Jadwal postmortem]

Communication Anti-Patterns

Anti-PatternAlternatif yang Benar
“Sedang di-fix” tanpa detailJelaskan apa yang sedang dilakukan
Tidak ada update selama 1+ jamUpdate regular meskipun belum ada progress
Blame dalam komunikasiFokus pada fakta dan timeline
Terlalu teknis untuk stakeholderGunakan bahasa bisnis untuk non-technical audience
Panic language (“EVERYTHING IS DOWN!!!”)Tenang, faktual, dan terstruktur

Pengenalan Runbook

Runbook adalah dokumentasi langkah-demi-langkah untuk menangani incident atau operational task tertentu. Runbook mengurangi ketergantungan pada “tribal knowledge” — pengetahuan yang hanya ada di kepala satu atau dua orang.

Anatomi Runbook yang Baik

KomponenDeskripsiContoh
TitleNama yang jelas dan deskriptif“Database Connection Pool Exhausted”
SeverityDefault severitySEV-2 (Major)
SymptomsBagaimana masalah terdeteksiAlert: db_connections > 90%
PrerequisitesAkses dan tools yang dibutuhkanSSH access ke DB server, psql client
StepsLangkah-langkah penanganan1. Verify, 2. Check, 3. Fix, 4. Verify
VerificationCara memastikan fix berhasilConnection count < 80%, response time normal
EscalationSiapa yang dihubungi jika gagalDBA Team → VP Engineering

Contoh Runbook: High Error Rate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# runbook-high-error-rate.yaml
runbook:
  title: "API High Error Rate"
  id: "RB-001"
  severity: "SEV-2"
  owner: "Platform Team"
  
  symptoms:
    - "Alert: api_error_rate > 1% for 5 minutes"
    - "Grafana dashboard menunjukkan spike di error panel"
  
  steps:
    - step: 1
      title: "Verify the issue"
      commands:
        - "kubectl get pods -n production -l app=api-server"
        - "curl -s 'http://prometheus:9090/api/v1/query?query=rate(http_requests_total{status=~\"5..\"}[5m])'"
    
    - step: 2
      title: "Check recent deployments"
      commands:
        - "kubectl rollout history deployment/api-server -n production"
      decision: "Jika ada deployment dalam 30 menit  Rollback. Jika tidak  Investigate"
    
    - step: 3
      title: "Rollback atau investigate"
      commands:
        - "kubectl rollout undo deployment/api-server -n production"
        - "kubectl logs -l app=api-server -n production --tail=100 | grep ERROR"
    
    - step: 4
      title: "Verify recovery"
      commands:
        - "curl -s http://api.example.com/health | jq ."
      expected: "Error rate < 0.1%, health check returns 200"
  
  escalation:
    - level: 1
      contact: "On-call DevOps Engineer"
      method: "PagerDuty / Grafana OnCall"
    - level: 2
      contact: "DevOps Team Lead"
      method: "Phone call"
    - level: 3
      contact: "VP Engineering"
      method: "Phone call + Slack DM"

On-Call Rotation

Catatan: Tools seperti Grafana OnCall (open source), PagerDuty (enterprise-grade dengan AIOps), dan incident.io (developer-friendly) menyediakan fitur rotation, escalation, dan notification yang jauh lebih baik dari manual scheduling.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# grafana-oncall-rotation-example.yaml
oncall_schedule:
  name: "Platform Team On-Call"
  timezone: "Asia/Jakarta"
  rotation_type: "weekly"
  
  members:
    - name: "Andi"
      slack: "@andi"
    - name: "Budi"
      slack: "@budi"
    - name: "Citra"
      slack: "@citra"
  
  escalation_policy:
    - level: 1
      target: "current_oncall"
      timeout_minutes: 10
      notification: ["push", "sms"]
    - level: 2
      target: "next_oncall"
      timeout_minutes: 15
      notification: ["push", "sms", "phone"]
    - level: 3
      target: "team_lead"
      timeout_minutes: 5
      notification: ["phone"]
  
  handoff:
    day: "Monday"
    time: "09:00"
    handoff_channel: "#on-call"

Studi Kasus: TechStartup Indonesia

Konteks

TSI di awal 2020 menghadapi major outage pertama mereka — “Valentine’s Day Outage” — yang berlangsung 6 jam.

Kondisi saat itu:

  • 50K DAU dengan arsitektur monolith
  • Promo Valentine’s Day menarik traffic 3x lipat
  • Database connection pool exhausted
  • Tidak ada proses incident response sama sekali

Masalah selama outage:

  • Deteksi memakan waktu 45 menit (dari marketing, bukan monitoring)
  • 5 DevOps engineers SSH bersamaan tanpa koordinasi
  • Trial-and-error selama 3 jam sebelum fix ditemukan
  • Komunikasi kacau, stakeholder tidak tahu status

Apa yang Dilakukan

Setelah outage, CTO memberikan 3 minggu untuk membangun fondasi incident response:

  1. Minggu 1: Severity Levels — Definisikan SEV-1 sampai SEV-4 dengan response requirements yang jelas
  2. Minggu 2: Runbooks & Communication Templates — Dokumentasi langkah penanganan dan template notifikasi
  3. Minggu 3: On-call Rotation & Alerting Rules — Setup jadwal on-call dan konfigurasi alert di Prometheus

Hasilnya diuji saat incident serupa terjadi di bulan Maret — flash sale yang menyebabkan DB connection pool issue yang sama.

Metrics Improvement

MetricSebelum (Feb 2020)Sesudah (Mar 2020)Perubahan
MTTD (Mean Time to Detect)45 menit3 menit-93%
MTTR (Mean Time to Recovery)5 jam43 menit-86%
Revenue loss per incidentRp 50 jutaRp 7 juta-86%
Incidents tanpa postmortem100%0% (SEV-1/2)-100%

Perbedaan utama saat incident Maret:

  • Alert fired dalam 3 menit (bukan 45 menit dari marketing)
  • On-call yang sedang jaga merespon dalam 5 menit
  • Langsung buka runbook RB-001 dan ikuti langkah yang sudah terdokumentasi
  • Total investasi: ~Rp 2 juta/bulan (on-call compensation) vs Rp 50 juta revenue loss per incident sebelumnya

Lessons Learned

Yang Berhasil:

  • Runbooks save lives (and revenue) — Engineer on-call bisa handle incident sendiri karena runbook sudah ada
  • Alerting yang tepat = detection yang cepat — 3 menit vs 45 menit detection time
  • Clear roles prevent chaos — satu IC, satu responder, tidak ada 5 orang SSH bersamaan
  • Communication templates reduce cognitive load — saat stress, template membantu tetap terstruktur

Yang Perlu Dihindari:

  • Notification masih manual — perlu automated paging (Grafana OnCall atau PagerDuty)
  • Runbook masih sedikit (baru 3) — perlu lebih banyak untuk common scenarios
  • Postmortem process masih informal — perlu template dan tracking system

Best Practices

  • Definisikan severity levels sebelum incident terjadi — saat incident bukan waktu yang tepat untuk debat severity
  • Buat runbook untuk top 3 incidents — mulai dari yang paling sering terjadi, tambahkan gradually
  • Assign Incident Commander (IC) di awal — satu orang yang koordinasi, bukan semua orang coba fix
  • Komunikasikan early and often — update stakeholders meskipun belum ada progress
  • Mitigate first, debug later — kurangi impact ke user dulu, cari root cause setelah service pulih
  • Lakukan postmortem untuk SEV-1 dan SEV-2 — tanpa postmortem, masalah yang sama akan terulang
  • Test runbooks secara berkala — runbook yang tidak pernah ditest mungkin sudah outdated

Selanjutnya

Artikel berikutnya: Intermediate SRE: Incident Management — setelah memahami fondasi incident response, langkah selanjutnya adalah membangun incident management yang lebih terstruktur dengan roles formal, war room procedures, dan escalation policies.

Topik terkait yang bisa Anda eksplorasi:

  • Alerting Strategy — mengurangi alert fatigue dan membangun actionable alerts
  • Service Ownership — siapa yang bertanggung jawab ketika alert berbunyi?
  • Postmortem Culture — membangun budaya blameless learning dari incidents

References


⬅️ Sebelumnya: Foundation SRE: Monitoring Basics

➡️ Selanjutnya: Intermediate SRE: Incident Management

This post is licensed under CC BY 4.0 by the author.