Category: [category]
Severity: [P1-Critical / P2-High / P3-Medium / P4-Low]
Last Updated: YYYY-MM-DD
Owner: [team/on-call rotation]
Review Cycle: Quarterly
What does this incident look like? What alerts fire? What do users report?
| Condition | Severity |
|---|---|
| [condition requiring P1] | P1 - Critical |
| [condition requiring P2] | P2 - High |
| [condition requiring P3] | P3 - Medium |
| Alert Name | Source | Threshold | Dashboard |
|---|---|---|---|
| [alert_name] | [Prometheus/Datadog/etc] | [threshold] | [link] |
# Command to runExpected output: [what you should see]
If abnormal: [what it means]
# Command to runExpected output: [what you should see]
If abnormal: [what it means]
# Command to runImmediate actions to reduce customer impact before root cause is resolved.
# Command to runRisk: [side effects of this mitigation]
Rollback: [how to undo if it makes things worse]
# Command to runSteps to fully resolve the underlying issue.
# Command to run# Command to runHow to confirm the issue is truly resolved and not just masked.
# Verification commandExpected: [what success looks like]
| Condition | Escalate To | Contact |
|---|---|---|
| [not resolved in X min] | [team/person] | [channel/phone] |
| [customer impact > threshold] | [incident commander] | [channel] |
| [data loss suspected] | [VP Engineering] | [channel] |
Long-term actions to prevent recurrence.
| Date | Author | Change |
|---|---|---|
| YYYY-MM-DD | [name] | Initial version |
A runbook is only as good as its last use under pressure. When an engineer is paged at 3 AM with elevated cortisol and reduced cognitive function, they need clear, unambiguous instructions that eliminate guesswork.
This guide covers how to write runbooks that actually work when it counts.
Assume the reader:
Bad:
Check the database replication status and verify it's healthy.
Good:
# Check replication lag in seconds (should be < 5)
psql -h replica.internal -U monitoring -c "SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::int AS lag_seconds;"Every command should include what "normal" looks like. If the responder doesn't know what healthy looks like, they can't distinguish broken from normal.
Never embed multiple decisions in one step. Use clear if/then branching:
Step 3: Check connection count
→ If connections > 90% of max: Go to Mitigation Option A
→ If connections < 50% but queries slow: Go to Step 4
→ If connections normal: This runbook may not apply, check INDEX.md
Every mitigation step should include how to undo it. Mitigations that can't be rolled back need explicit warnings.
Every runbook in this library follows a consistent 9-section structure:
| Section | Purpose | Key Question |
|---|---|---|
| Symptoms | Pattern recognition | "How do I know this is happening?" |
| Severity | Prioritization | "How bad is this?" |
| Detection & Alerts | Alert context | "What fired to bring me here?" |
| Diagnosis | Root cause identification | "What exactly is wrong?" |
| Mitigation | Stop the bleeding | "How do I reduce impact NOW?" |
| Resolution | Fix the root cause | "How do I actually fix it?" |
| Verification | Confirm success | "How do I know it's really fixed?" |
| Escalation | Get help | "Who do I call when I'm stuck?" |
| Prevention | Avoid recurrence | "How do we stop this from happening again?" |
| Anti-Pattern | Why It's Bad | Fix |
|---|---|---|
| "Check the logs" | Which logs? Where? What for? | Specific log path + grep pattern |
| "Restart the service" | Which service? How? What if it doesn't come back? | Exact restart command + health check |
| "Contact the DBA" | What if they're unavailable? | Provide self-service steps first, then escalation |
| "See Confluence page" | Links rot. Pages move. | Inline the critical info, link as supplementary |
| "Use your judgment" | Judgment is impaired at 3 AM | Provide a decision tree with thresholds |
| Outdated commands | False confidence, wasted time | Date all runbooks, review quarterly |
Runbooks are living documents. They rot if not maintained.
Update a runbook immediately when:
Track these to measure whether your runbooks are actually useful:
| Metric | Target | How to Measure |
|---|---|---|
| Time-to-mitigate with runbook | < 15 min for P2+ | Incident timeline analysis |
| Runbook accuracy rate | > 95% of steps work as written | Post-incident survey |
| Coverage | > 80% of incidents have a matching runbook | Incident categorization |
| Freshness | All runbooks reviewed in last 90 days | Git blame / review dates |
| Self-service resolution rate | > 60% resolved without escalation | Escalation tracking |
If you're building a runbook library from zero:
1. Mine your incident history — Find your top 10 most common incidents from the last 6 months
2. Write runbooks for the top 5 — Focus on the incidents that happen most frequently
3. Validate immediately — Next time one of those incidents occurs, have the responder follow the runbook literally and note gaps
4. Iterate rapidly — Update the runbook after every use
5. Expand coverage — Add 2-3 new runbooks per sprint until you hit 80% coverage
This library uses the following conventions:
connection-pool-exhaustion.mddatabase/, compute/, network/, etc.slow-queries.md (symptom-based, easy to find)missing-index.md (root-cause-based, requires diagnosis first)*Remember: A runbook that's 80% complete and available NOW is infinitely more valuable than a perfect runbook that's "still being drafted."*
Get the full Runbook Template Library and unlock everything.
Get the complete guide with every chapter unlocked, including code samples, diagrams, and best practices.
Access all interactive tools with complete data, all workload profiles, and the full scenario library.
Downloadable source code, configuration files, and working examples from every chapter.
Free updates for life. Every new chapter, tool, and improvement included.