Incident Response — Levels, Roles, Runbooks
Tại sao incident response cần cấu trúc
Một incident là stressful. People panic. Communication breaks down. Multiple teams try to fix different things at once. Communication cascades upward without clear info flow.
Result: incident takes 2 hours to fix when actual recovery is 15 minutes.
Structured incident response with clear levels, roles, and runbooks turns chaos into coordinated action:
- Levels — How severe is this? How many people needed?
- Roles — Who does what? Who decides? Who communicates?
- Runbooks — Steps to take, not "figure it out" under pressure
Internal Model: Incident severity levels
Level definitions
Most organizations use 3–4 levels:
Level 1 (Critical)
- Customer-facing service completely down
- Revenue impact or SLO breach imminent
- Response time: < 5 minutes to engage
- Team size: 10–20 people (full war room)
Example:
- Primary database down (no API responses)
- Authentication service returning 5xx (no logins possible)
- Payment processing failing (transactions not completing)
Level 2 (Major)
- Service degraded but not down
- Customer experience affected (slow, errors)
- SLO may be breached soon
- Response time: < 30 minutes to engage
- Team size: 5–10 people
Example:
- API p99 latency doubled
- 20% of requests returning errors
- Search service slow but working
Level 3 (Minor)
- Customer experience slightly affected
- No SLO impact yet
- Response time: < 2 hours
- Team size: 1–3 people
Example:
- Internal dashboard slow
- Email alerting delayed by 5 minutes
- Logging pipeline backlogged
Level 4 (Informational) (optional)
- No customer impact
- Just an anomaly to investigate
- No page to on-call
- Team size: async (best effort)
How to determine level
During incident triage, ask:
- Customer impact — how many users affected?
- Service degradation — is service down or slow?
- SLO impact — will this breach SLO?
- Business impact — revenue at risk?
If (customers affected AND service down) → Level 1
Else if (customers affected AND degraded) → Level 2
Else if (internal only) → Level 3
Else → Level 4Level escalation
Incidents can escalate:
Level 3 investigation → "Oh, root cause is database issue"
→ Now upstream database team involved
→ Escalate to Level 2 (multiple teams needed)
Level 2 incident → "Can't recover automatically"
→ "Need human decision from VP"
→ Escalate to Level 1 (executive engagement)Rule: Level is determined by severity + scope, not by team. A widespread Level 3 can become Level 2 if it affects more users.
Internal Model: Roles during incident
Incident Commander (IC)
The single decision maker during incident. Not necessarily most senior person, but someone trained for this role.
Responsibilities:
- Declare incident level and invoke appropriate response
- Direct investigation ("SME, look at database logs")
- Authorize changes ("Deploy the hotfix")
- Decide escalation ("This needs VP approval")
- Set timeline ("We have 30 minutes to stabilize before we need to escalate")
Why single IC?
- Prevents multiple people issuing conflicting directions
- Clear accountability (if decision is wrong, IC owns it)
- Fast decision-making (no committee)
IC is NOT:
- The person who fixes the problem
- The person who knows the system best
- The CEO in crisis
IC IS:
- Someone who can coordinate teams
- Someone who can say "stop, let's try a different approach"
- Someone who can handle pressure
Subject Matter Expert (SME) / Incident Responder
People who actually diagnose and fix the issue.
For Level 1:
- Multiple SMEs from different areas (database, API, infrastructure, etc.)
- Each owns investigation of their component
For Level 2–3:
- Usually 1–3 people with knowledge of the service
Key behavior:
- SME reports status to IC frequently ("Found the issue, it's X")
- SME asks IC before deploying changes ("IC, I have a fix, should I deploy?")
- SME documents findings for postmortem
Communications Lead
Person who updates customers, status page, leadership.
Responsibilities:
- Write initial notification ("We are investigating an issue affecting...")
- Send periodic updates (every 15–30 minutes, or "status unchanged")
- Final post-incident update ("Issue resolved at 2:45 PM. Root cause was...")
- Answer customer inquiries
Why separate role?
- SMEs focused on fixing, not on communication
- Prevents SMEs from making conflicting public statements
- Ensures consistent messaging
On-call lead
For Level 1 incidents, on-call lead ensures escalation and resource coordination.
Responsibilities:
- Wake up the right people (page backend SMEs, database SMEs, etc.)
- Ensure IC has authority to make decisions (sometimes VP approval needed)
- Track whether incident is being resolved or escalating
- Escalate to higher management if needed
Example incident command for Level 1
13:45 - Issue detected
├─ Alert fired: "Database CPU at 95%"
├─ On-call engineer pages IC
└─ IC acknowledges, enters war room
13:50 - Incident declared
├─ IC: "Level 1 declared. Database issue."
├─ IC pages: Backend SME, Database SME, Infrastructure SME
└─ Communications lead starts status page: "Investigating issue"
13:55 - Investigation begins
├─ Database SME: "Queries running slow, 100K queries in queue"
├─ Backend SME: "Requests timing out waiting for DB"
├─ Infra SME: "No resource constraints, disk I/O not maxed"
└─ IC: "Database query performance is bottleneck. Let's focus there."
14:00 - Root cause found
├─ Database SME: "Slow query is analytics job running unplanned"
├─ IC: "Kill the analytics job?"
├─ Database SME: "Yes, safe to kill."
├─ IC: "Do it."
└─ Comms: "Issue root cause found, recovering"
14:05 - Recovery
├─ Analytics job killed
├─ Database CPU drops to 40%
├─ API response times return to normal
├─ SLO no longer breached
└─ IC: "Incident recovered."
14:10 - Incident closed
├─ Comms: Final update posted
├─ All teams stand down
├─ IC: "Postmortem in 24 hours"Key observations:
- Single IC directed whole response
- Clear roles (who investigates what)
- Fast communication (status updated every 5 minutes)
- Decision documented ("kill analytics job" authorized)
Internal Model: Runbooks
What is a runbook?
A runbook is a machine-readable sequence of steps to respond to a specific incident type.
NOT:
- A long narrative explaining the system
- An after-the-fact explanation
- A training document
IS:
- A checklist to follow during incident
- Executable under pressure
- Step by step with commands/queries to run
Runbook structure
Title: Database Slow Query Incident
Trigger: Database CPU > 90% for > 2 minutes
Level: 2 (escalate to Level 1 if can't recover in 30 min)
Steps:
1. Verify database is actually slow
$ gcloud sql instances describe <INSTANCE>
Look for: CPU_Utilization, current_connections
2. Check for long-running queries
$ gcloud sql operations list --instance=<INSTANCE> --limit=20
Filter: operations taking > 2 minutes
3. If found slow query:
a. Identify the query (check logs)
b. Determine if safe to kill
- Is it a user-facing query? (check service name in logs)
- Is it an analytical job? (check tags)
- Decision: User-facing = don't kill. Analytics = safe to kill.
c. Kill if safe
$ gcloud sql operations cancel <OPERATION_ID>
4. If no slow query found:
- Check disk I/O
- Check memory
- (If still stuck, escalate to Database team SME)
5. Verify recovery
$ gcloud sql instances describe <INSTANCE>
CPU should drop within 1 minute
6. If recovered, close incident
If not recovered after 30 minutes, escalate to Level 1
Escalation:
- Contact: database-sre-oncall@company.com
- Page: database-platform teamWhen to have a runbook
Not every possible incident needs a runbook. Prioritize:
- Incidents that happen > 2 times per year — worth documenting
- Incidents with time-sensitive steps — runbook prevents delay
- Incidents involving complex systems — runbook reduces errors
Don't create runbooks for:
- Very rare incidents (< 1 per year)
- Incidents requiring custom analysis
- Incidents involving unclear root causes
Keeping runbooks up to date
Common problem: runbooks become stale.
Year 1: Runbook created, useful
Year 2: System architecture changed, but runbook not updated
Year 3: Runbook has wrong commands, on-call follows it and wastes timeSolution:
- Every 6 months, review runbooks used in actual incidents
- If runbook was used but contained outdated info, fix it immediately
- Quarterly: SME audit to verify commands still work
Pro practice: Automated runbook testing.
Test: "Slow query runbook commands still work"
- Monday morning at 2 AM, test the runbook
- Run each command on non-production environment
- Alert if any command fails
- Fix failing commandsIncident roles on-call rotation
On-call for Level 1 incidents
Typically:
- IC on-call: 1 person, rotates weekly/biweekly (most stressful)
- Backend/Database/Infra SME on-call: 1 person per team, rotates
- Communications on-call: Optional, can be rotated or assigned
Coverage:
- 24/7 IC coverage (especially for critical services)
- SME coverage aligned with when service gets traffic
On-call schedule
Week of June 24:
┌─────────────────────────────────────────────┐
│ IC: Alex │
│ Backend SME: Bao │
│ Database SME: Carmen │
│ Infra SME: Diana │
│ Comms: Elena │
└─────────────────────────────────────────────┘
Each person on-call:
- Carries phone (or laptop if distributed)
- Responds to pages within 5 minutes
- Hands off to next person at week endPager rotation considerations
- Prevent burnout: Max 1 week on-call per month
- Distribute fairly: Track who was on-call when
- Skill development: Senior engineer mentors junior during on-call
- Compensation: Some organizations offer extra pay for on-call
Communication channels during incident
Incident war room setup
For Level 1, dedicated communication channel:
Slack channel: #incident-2025-06-24-db-issue
Timeline in channel:
13:50 [IC:Alex]: Level 1 declared - database issue
13:52 [DBE:Carmen]: DB CPU 95%, investigating query queue
13:55 [Backend:Bao]: API p99 latency 5s (normal <100ms)
13:58 [DBE:Carmen]: Found slow analytics job, safe to kill
14:00 [IC:Alex]: Kill analytics job now
14:02 [DBE:Carmen]: Killed. CPU dropping.
14:05 [IC:Alex]: Recovered. Incident closed. Postmortem tomorrow.Separate channels:
- #incident-response: War room channel (for people actively responding)
- #status-page: What to post publicly
- #engineering-all: Executive summary (separate from real-time tactical details)
Common mistakes in incident response
Mistake 1: IC authority unclear
Multiple people make decisions:
- Backend lead says "deploy hotfix"
- Database lead says "wait, let's investigate first"
- Result: contradictory actions, wasted time
Fix: Make IC authority crystal clear. Everyone defers to IC.
Mistake 2: Runbooks are narrative, not executable
Runbook says: "Check if database is slow"
But how? No commands provided. On-call has to figure out what tool to use. Wastes 10 minutes during incident.
Fix: Runbooks must have exact commands:
$ gcloud sql instances describe my-db --format=json | jq '.settings.backupConfiguration'Mistake 3: No postmortem scheduled immediately
Incident ends at 2:45 PM. On-call is exhausted.
PM: "Let's have postmortem Friday."
Friday: People don't remember details. Postmortem is vague. Nothing learned.
Fix: Schedule postmortem immediately after incident ("Postmortem at 4 PM, 1 hour from now while memory fresh").
Mistake 4: Runbooks never tested
Runbook says: "Deploy hotfix X"
During incident: "hotfix X not in repo" or "build command is wrong"
On-call scrambles, wastes time.
Fix: Regularly test runbooks (at least quarterly).
Summary
Structured incident response enables fast recovery under pressure:
□ Levels define severity and response scope
□ IC provides single decision authority (prevents thrashing)
□ Roles distribute responsibilities (investigation, communication, execution)
□ Runbooks encode knowledge in executable steps
□ On-call rotation ensures 24/7 coverage without burnout
□ Test runbooks regularly to verify they still work
□ Escalate promptly when incident exceeds scope