On-Call Practices and Runbook Design Questions
Running a sustainable on-call function: rotation design, production-readiness handoffs, and authoring runbooks that let responders act quickly. Covers runbook automation, on-call culture, escalation-ready documentation, and readiness reviews before a service takes production traffic. The operational-preparedness discipline that makes incidents survivable.
How would you structure an on-call rotation and escalation process for a team responsible for both ML model serving and the data pipelines feeding it, accounting for failure modes like data drift that a typical on-call process doesn't anticipate?
Sample Answer
An on-call structure spanning model serving and the data pipelines feeding it needs to route on failure type, not just service boundary, because the failure modes are genuinely different: serving incidents look like classic infrastructure problems (latency, errors, capacity) that standard SRE-style on-call handles well, while pipeline and model-quality incidents (drift, stale features, label pipeline failures) require ML-specific judgment that a generic infra on-call rotation won't have.
Structure
- Split the rotation by failure type, not by which system it originated in. Serving-infrastructure alerts (latency, error rate, resource exhaustion) route to whoever is on infra on-call, ML or not, since these are diagnosable with standard tooling. Data and model alerts (feature staleness, distribution drift, label pipeline failures, accuracy degradation) route specifically to ML on-call, because diagnosing whether a shift is real drift or noise requires model-specific context an infra generalist doesn't have.
- Add drift and staleness as first-class alert categories, not an afterthought. Most on-call processes alert on "is the service up" and stop there; a model can be fully up, fast, and returning garbage predictions because its input distribution shifted or its features are stale. Alert on input-feature distribution shift (statistical distance from a recent baseline window) and on feature age/freshness (time since last successful pipeline run) as distinct alert types with their own runbooks.
- Escalation path: primary ML on-call triages drift/data alerts first; if root cause is upstream in the data pipeline (an ingestion job failed, a schema changed), escalate to data-engineering on-call; if it's a genuine model-quality regression (the model itself needs rollback), the ML on-call owns the fix directly (rollback to a previous model version) rather than waiting on a retrain, since retraining is not a same-incident action.
- Runbooks per alert type, written for the specific failure, not generic "check the dashboard": a drift alert's runbook should specify which features to check, what the acceptable range looks like, and the decision tree between "roll back to previous model" versus "the shift is real and expected, update the baseline."
flowchart TD
A[Alert fires] --> B{Failure type?}
B -->|Serving infra: latency, errors, capacity| C[Infra on-call primary]
B -->|Data or model: drift, staleness, label issues| D[ML on-call primary]
D --> E{Root cause upstream in pipeline?}
E -->|Yes: ingestion or schema issue| F[Escalate to Data Engineering on-call]
E -->|No: model-quality regression| G[ML on-call rolls back model]
C --> H{Data or model cause suspected within 5 min?}
H -->|Yes| D
H -->|No| I[Infra on-call resolves]
Worked example
A distribution-shift alert fires on a fraud-model's input features. The ML on-call primary checks the specified feature (transaction amount distribution) against the runbook's documented baseline and confirms it's shifted meaningfully, roughly a threefold increase in the proportion of transactions above the model's previously typical range. Two hypotheses per the runbook: either the data pipeline changed (a currency conversion step was recently modified, genuinely changing the values) or user behavior changed (a real shift the model needs to adapt to). Checking the pipeline's recent deploy history shows a currency-conversion library was updated two days prior; this is a data pipeline bug, not real behavior change, so it escalates to data engineering to fix the conversion logic, while the ML on-call's immediate action is to roll the model back to a version trained before the affected window's data was ingested, since serving on top of incorrectly converted amounts risks bad fraud decisions. If instead the pipeline history showed no recent changes, the alternative path (real behavior shift) would have led to a different action: flag for expedited retraining rather than rollback, since there's no earlier clean model version to fall back to.
Trade-offs and pitfalls
Splitting by failure type instead of by service means an incident that starts as "serving latency is up" might turn out to be caused by an oversized feature payload from a drifted input distribution, crossing from infra on-call into ML on-call mid-investigation; the mitigation is a clear, fast handoff protocol (a 5-minute rule: if infra on-call can't rule out a data/model cause within 5 minutes, loop in ML on-call proactively rather than continuing to investigate alone) rather than treating the two rotations as fully separate silos. A common wrong turn is putting drift detection behind a single blunt threshold and treating every trigger as an incident; drift alerts need more calibration than uptime alerts because moderate drift is often expected and not actionable, and over-alerting on it burns out the ML on-call rotation with false pages faster than a normal infra rotation would burn out on flapping health checks.
Some runbook steps involve sensitive actions, like production database admin commands or rotating credentials. How do you control who can run those steps and keep it auditable, without slowing a responder down during a real P1?
Sample Answer
Don't gate sensitive steps behind standing credentials a responder already holds. Gate them behind short-lived, narrowly scoped credentials issued by the runbook orchestrator at the moment of use, with a pre-authorized fast path for the highest severities so speed during a real incident doesn't require quietly bypassing the audit trail.
Comparing access models
| Model | Speed during a P1 | Auditability | Blast radius if leaked |
|---|---|---|---|
| Shared static credential in a vault everyone can read | Fast | Poor, can't tell who actually used it | High, valid indefinitely until manually rotated |
| Manual per-use approval (ticket plus human sign-off) | Slow, adds minutes exactly when they're scarce | Good | Low, but the delay is itself a cost during a P1 |
| Just-in-time ephemeral credential (vault-issued, scoped, short TTL, auto-revoked) | Fast for pre-authorized P1 paths | Excellent, tied to identity, ticket, and TTL window | Low, expires on its own even if forgotten |
Worked example: sizing the credential TTL
If the median observed time to complete a given remediation step across past incidents is 12 minutes, a 15-minute TTL leaves almost no margin:
Margin=15−12=3 mina responder who hits a snag is interrupted 3 minutes short of done, exactly when stopping is most disruptive. A TTL of roughly 20 minutes, the median plus a working buffer rather than an open-ended grant, gives room to finish without leaving a long-lived credential outstanding. A 4-hour TTL "to be safe" instead means a credential compromised from a responder's terminal during that window stays valid for the rest of the shift; that's the trade being made for the extra convenience.
Keeping it auditable without slowing the responder down
- Runbooks reference secret IDs, never raw values, so the document itself is safe to read even if it leaks.
- The orchestrator executes the sensitive step server-side where practical, so the responder never sees the decrypted secret at all, only the outcome.
- Every credential issuance logs identity, ticket or incident ID, scope, and TTL to an immutable log, correlated automatically rather than reconstructed after the fact.
- The highest severities get pre-authorized issuance, no waiting on a human approver, precisely because the TTL and logging, not a manual gate, are what keep it auditable.
Trade-offs and pitfalls
A break-glass path needs more audit rigor than the normal path, not less; pair any emergency bypass with mandatory post-incident review and automatic rotation of whatever it touched. Auto-approval for the highest severities removes a human gate exactly during the highest-risk window (a real incident, adrenaline, and possibly an actor exploiting the chaos), so the TTL and logging have to carry that weight instead. Orchestrator-executed remediation is safer for the responder but adds its own risk surface; the automation itself now needs the same change-review rigor as production code, not less because "it's just a script."
How would you actually validate that your runbooks work before you need them in a real incident? Describe a program for testing them under realistic conditions.
Sample Answer
Direct answer
Validating runbooks before a real incident needs three ingredients: a way to safely exercise them, using sandboxes for non-destructive steps and canary execution for destructive ones; measurable acceptance criteria for what "verified" actually means; and a cadence that scales from cheap, frequent tabletop walkthroughs up to expensive, rare full game days. Treat validation as a graded ladder of increasing realism and cost, not a single all-or-nothing chaos exercise.
Structured elaboration
Ladder of validation
| Tier | What happens | Frequency | Blast radius |
|---|---|---|---|
| Tabletop read-through | Team reads the runbook aloud, checks it still matches current architecture | Monthly per critical runbook | None, discussion only |
| Sandboxed dry-run | Non-destructive or dry-run steps run against a synthetic or staging copy | Per runbook change, CI-gated | Isolated sandbox |
| Canary execution | The real, potentially destructive step runs against a single instance or shard in production | Quarterly for the highest-severity runbooks | One instance or shard |
| Full game day | The real trigger condition is simulated and the whole runbook runs end to end with the actual on-call rotation | Quarterly cross-team, and after major architecture changes | Scoped production traffic, with a kill switch |
Acceptance criteria for "verified"
- Every command in the runbook executed successfully against the environment matching its tier.
- Recovery met the documented RTO (recovery time objective: the maximum acceptable downtime) for that exercise.
- The person executing it was not the runbook's original author, which catches "only the author can actually run this" runbooks.
- No manual step was needed beyond what's written, which catches missing steps.
- The runbook's last-verified metadata is updated only after all of the above pass, tied to the specific commit that was tested.
Sandboxing and canary mechanics for destructive steps
- A dry-run flag on any script validates and logs without mutating anything; most cloud SDKs and infrastructure-as-code tools support this natively.
- Ephemeral, synthetic-data environments handle full destructive rehearsals safely, isolated by namespace or project and feature-flagged away from real customer traffic.
- Steps that can only be meaningfully tested in production, like a real failover, get a canary first: a single shard or instance, with an automated rollback path and a pre-agreed abort condition.
Error-budget gate before running in production
Before a production game day, confirm enough error budget remains to absorb the intended, and any accidental, impact. For a monthly SLO of 99.9 percent over a 30-day window, the allowed downtime is:
error budget=(1−SLO)×window minutes
(1−0.999)×43,200=0.001×43,200=43.2 minutes
If the remaining budget is close to that 43.2-minute figure, postpone the exercise rather than spend the safety margin on a drill.
Worked example
A cache-cluster failover runbook is canary-tested against a single shard. The failover command executes without manual intervention, recovery meets the documented RTO target, and the engineer running the drill is not the runbook's original author. All four acceptance criteria above pass, so the runbook's last-verified metadata is updated to the exact commit hash that was tested, and the result feeds into the quarterly decision of whether this runbook is due for a full game day next.
Trade-offs and pitfalls
- Relying only on tabletop reads because full game days are expensive means staleness in the actual commands never gets caught until a real incident does it for you.
- Letting the runbook's author be the only person who can successfully execute it means you've tested the author's tribal knowledge, not the documentation; a different operator running the drill is what actually validates the doc.
- Full production game days build the highest confidence but carry real risk and spend real error budget; the ladder exists so most validation stays cheap, and only the highest-severity runbooks earn a full game day.
How would you get a new engineer ready to join the on-call rotation? Walk through what you'd want them to do before their first solo shift.
Sample Answer
Readiness is a checklist, not a countdown: get access and tooling working first, have them study and sign off on the runbooks for their services, shadow several live pages, then run one supervised tabletop and one supervised live (or simulated) incident before they take a shift alone with a mentor reachable but not present.
A four-week ramp
| Week | Focus | Activities | Exit criteria |
|---|---|---|---|
| 1 | Access + orientation | Provision accounts/VPN/MFA/pager, architecture overview, assigned runbook study | All access verified, runbooks read |
| 2 | Guided practice | Shadow 3-4 live alerts with a mentor, pair on small remediation tickets | Runbook sign-offs for owned services |
| 3 | Increasing autonomy | Lead a staging fault-injection drill with mentor observing, handle 1-2 small solo operational tasks with review | Drill led successfully, gaps found in runbooks fixed |
| 4 | Supervised solo shift | First on-call shift with mentor reachable, pre-shift briefing and post-shift debrief | Mentor sign-off, at least one incident handled or correctly escalated |
Sign-off checklist before the first unsupervised shift
- Access confirmed end to end (paging tool, dashboards, deploy/rollback permissions) with a real test, not just "provisioned."
- Runbooks for their assigned services reviewed and any ambiguous steps flagged and fixed.
- At least one supervised tabletop and one supervised live or injected-fault incident completed.
- Mentor sign-off plus the engineer's own confidence self-assessment, not mentor judgment alone.
Extending the ramp for a complex or high-stakes service
Four weeks is often enough for a straightforward service, but for a complex hybrid-cloud system or one with many downstream dependents, add explicit competency checkpoints tied to named systems, for example certifying someone independently on the database failover path as a separate sign-off from general on-call readiness, rather than declaring them ready across the board at once. Longer term, treat the first 90 days as a structured mentorship arc rather than stopping at week four: scheduled 30/60/90-day check-ins, a second mentor pairing on a different service, and a distinct milestone for graduating from "supervised" to "primary" status rather than just a date on the calendar.
Trade-offs and pitfalls
Rushing readiness to fill a rotation gap is the most common failure mode, and it produces confident-sounding but wrong incident responses, which is worse than an obviously under-prepared response because it takes longer to catch. A checklist with no live-incident component only validates that someone can read, not that they can act under time pressure; keep at least one supervised live or simulated incident before signing off. Sign-off criteria should be service-specific rather than one generic "on-call ready" badge, since readiness on a well-instrumented service doesn't automatically transfer to a fragile legacy one with thin runbooks.
Before a new service goes live and starts taking on-call pages, what would you want to see in place? Walk through what a production-readiness review should check.
Sample Answer
A production-readiness review should verify four things before a service starts taking pages: it fails safely (degrades or rolls back instead of cascading), it's observable enough that on-call can diagnose without guessing, on-call actually knows how to respond to it, and someone specific owns it. Structure the review around those four, not a flat checklist, so gaps are obvious by category rather than buried in a long list.
What the review checks, by category
| Category | What to verify | Why it's a gate, not a nice-to-have |
|---|---|---|
| Failure containment | Circuit breakers or timeouts on every downstream call; load-testing evidence at expected peak plus a safety margin; tested rollback path | Without these, a dependency hiccup or a launch-day traffic spike becomes an on-call incident that a healthy service wouldn't have had |
| Observability | Dashboards for the service's key health signals; alerts tied to those signals with sane thresholds (not just "CPU high"); logs/traces sufficient to diagnose the top 3 failure modes without SSH-ing into a box | On-call can't respond to what they can't see; this is the difference between a 10-minute diagnosis and a 2-hour one |
| Runbook readiness | At least one runbook per alert that can actually fire, covering symptom, diagnosis steps, and remediation; runbook has been read (ideally walked through) by the people who'll be paged | An alert with no runbook just wakes someone up with no next step |
| Ownership and escalation | Named on-call rotation for the service, not "whoever's around"; a documented escalation path if the primary can't resolve it; the service is actually in the paging tool's routing, not just assumed to be | Ambiguous ownership is invisible until the first incident, when it costs the most |
Process for running the review
- The owning team self-certifies against the checklist first, providing evidence (load-test results, a link to the rollback runbook, a screenshot of the dashboard) rather than a checked box with no backing.
- A reviewer outside the owning team (SRE or a peer team) spot-checks the evidence, focusing on the failure-containment and observability rows, since those are the ones teams under launch pressure are most likely to overstate.
- Run one live-fire test before go-live: trigger the most likely failure mode in staging (or a controlled prod canary) and confirm the alert fires, the runbook's diagnosis steps actually find the cause, and the rollback works. A checklist that's never been exercised is a hypothesis, not a verified readiness state.
- Sign-off is explicit and time-bound, not a one-time gate that's forgotten: re-review triggers on major architecture changes, not just at initial launch.
flowchart TD
A[Owning team self-certifies checklist] --> B[Provide evidence: load tests, runbook links, dashboards]
B --> C[Outside reviewer spot-checks evidence]
C --> D{Gaps found?}
D -->|Yes| E[Team remediates gap]
E --> C
D -->|No| F[Live-fire test in staging or canary]
F --> G{Alert fires, runbook works, rollback succeeds?}
G -->|No| E
G -->|Yes| H[Sign-off: service takes pages]
Worked example
A new recommendations service is going live. Self-certification claims load testing was done "at expected traffic." The outside reviewer asks for the actual load-test report and finds it tested at the current expected peak (500 req/s) with no margin, while the service also sits behind a feature flag that product plans to ramp to three times that within a month. That's a real gap: the review isn't asking for perfection, but it should require either testing at the higher number now or an explicit, documented plan (with an owner and date) to re-test before the ramp, rather than letting "tested at expected traffic" silently mean "tested at today's traffic." The live-fire test then finds the circuit breaker on the downstream recommendation-model call has no timeout configured, so a slow model response would hang the request instead of failing fast; that's flagged as a blocking issue, not a follow-up ticket, because it directly causes cascading failure under exactly the load condition the service is meant to handle.
Trade-offs and pitfalls
The live-fire test step is the one teams most often skip under launch deadline pressure, and it's also the one that catches the gaps self-certification checklists miss (an alert that's configured but never actually fires, a runbook step that references a dashboard that doesn't exist); treat it as non-negotiable for anything customer-facing, and reserve a lighter self-certification-only path for low-risk internal services. A common wrong turn is treating the checklist as complete once every box is checked, without weighting which gaps are load-bearing; a missing rollback plan for a payments-adjacent service is not the same severity as a missing dashboard for an internal admin tool, and the review should say so explicitly rather than gating everything equally.
Unlock Full Question Bank
Get access to all 44 On-Call Practices and Runbook Design interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.