Worked Example: Assistant Timeouts at Peak
A fictional incident taken from raw evidence to a finished RCA, step by step, with the questions you'd ask at each stage.
About This Example
The incident is fictional, but realistic for a cross-device AI assistant running on Azure, with Grafana dashboards, PagerDuty paging, an offshore NOC, and a third-party model provider. It follows the eight steps in Running an RCA. Your questions at each step are in italics.
Step 1: Does It Need an RCA?
Yes. It was a Sev 2 with 83 minutes of customer-visible impact, and it was the second throttling-related incident in 60 days. The incident lead (Sam, SRE) writes the draft by Monday, and the review is booked for Wednesday.
You: "Sam, can you own the draft? Priya, can you join to cover the pod side? I've booked Wednesday at 10."
Step 2: Timeline From Evidence
| Time | Event | Source |
|---|---|---|
| 13:52 | New prompt template deployed to 100% of traffic. | Deploy history + Grafana annotation |
| 14:03 | Provider calls start returning "throttled" (HTTP 429). | Application Insights, dependency calls |
| 14:05 | Impact starts: failed and slow requests rise. | Grafana, assistant error-rate panel |
| 14:12 | Detected: "Assistant latency high" alert fires and goes to the NOC. | PagerDuty incident log |
| 14:12–14:31 | NOC follows its runbook: "monitor for 15 minutes before escalating." | NOC ticket notes |
| 14:34 | Acknowledged: SRE on-call acknowledges. | PagerDuty |
| 14:50 | Escalated: Assistant pod paged, after 16 minutes spent working out who owns provider quotas. | PagerDuty, incident channel |
| 15:05 | Throttling linked to the prompt change, using the Grafana annotation. | Incident channel |
| 15:20 | Mitigated: prompt template rolled back. | Deploy history |
| 15:28 | Resolved: error rate back to normal once the queued retries clear. | Grafana |
Time to detect: 7 minutes (good). Time from detection to mitigation: 68 minutes (the problem). Most of it was lost in NOC escalation (19 minutes) and in finding an owner (16 minutes).
// Application Insights / Log Analytics (KQL): throttled calls to the model provider, per minute
dependencies
| where timestamp between (datetime(2026-10-08 13:30) .. datetime(2026-10-08 15:45))
| where target has "model-provider"
| summarize throttled = countif(resultCode == "429"), total = count() by bin(timestamp, 1m)
| render timechartYou: "Where did 14:05 come from, the graph or someone's memory?" "Can we link the PagerDuty entry for the acknowledgement time?"
Step 3: Impact in User Terms
"From 14:05 to 15:28 (83 minutes), about 22% of assistant requests (about 180,000) failed or took over 30 seconds. Users saw 'Something went wrong. Try again.' All regions and device types were affected."
You: "Would support recognize this description from the tickets they got?"
Step 4: Trigger vs Conditions
- Trigger (why now): the new prompt template sends about 40% more tokens per request, and it shipped just before the afternoon peak.
- Contributing factors (why we were vulnerable):
- Prompt templates are treated as config and skip the canary.
- There's no alert on throttling or on token usage approaching the quota.
- Clients retry 3 times immediately, without backoff, which makes throttling worse.
- The NOC runbook says "monitor for 15 minutes."
- Nobody had written down who owns the provider quota.
You: "If someone else had shipped a different long prompt, would we have had the same outage?" (Yes. So the problem is the conditions, not the person.)
Step 5: The Four Defenses
| Defense | What failed | What held |
|---|---|---|
| Prevent | No canary for prompt changes. No token estimate before deploy. | Not applicable |
| Detect | No throttling or quota alert, so we only saw the symptom. | The latency alert fired within 7 minutes. |
| Mitigate | Retries without backoff amplified the problem and slowed recovery. | Rollback worked in minutes once it was decided. |
| Respond | The NOC waited 15 minutes. Ownership of the quota was unclear. | SRE acknowledged 3 minutes after the escalation. |
You: "Every defense except detection failed somewhere. Do we have an action for each one?"
Step 6: 5 Whys, With Two Branches
- Why did requests fail? Provider calls were throttled.
- Why? We exceeded the token-per-minute quota at peak.
- Why? The new prompt uses about 40% more tokens, and it went to 100% of traffic at once.
- Why at once? Prompt changes skip the canary. → Prevent branch
- Why didn't we see the quota coming? We don't alert on token usage or throttling. → Detect branch
A third branch, "Why did it take 68 minutes to mitigate?", leads to the NOC runbook rule and the unclear ownership. That's the respond branch.
Step 7: Actions (Ranked)
| # | Defense | Action | Owner | Due | Done means |
|---|---|---|---|---|---|
| 1 | Prevent | Prompt and template changes use the canary pipeline. | Priya (pod) | 3 weeks | The next prompt change rolls to 5% first, with automatic rollback on errors. |
| 2 | Detect | Alert when provider throttling exceeds 1% for 5 minutes, and when token usage passes 80% of quota, routed to the SRE PagerDuty service. | Sam (SRE) | 1 week | Tested by simulating throttling. The alert visibly reaches PagerDuty. |
| 3 | Respond | NOC runbook: if the slowest 5% of requests are over 8 seconds for 5 minutes, page SRE. Never wait 15. | NOC shift lead | 1 week | Runbook updated. Every shift passes a teach-back. |
| 4 | Mitigate | Retries use exponential backoff with jitter (small random delays), max 2. | Priya (pod) | 2 weeks | A load test with provider throttling shows no retry storm. |
| 5 | Respond | Ownership map: provider quota is owned by the Assistant pod, with a PagerDuty escalation path written down. | You and the pod manager | 1 week | Published, and linked from the NOC and SRE runbooks. |
You: "If we only did one, which? Is #2 really a week? What does Priya need to hit three weeks?"
Step 8: Review and Follow-Through
- Review: 45 minutes. The NOC analyst who took the first alert walked through the first 15 minutes, and they were thanked for following the runbook exactly as written.
- Shared: a 5-line summary went to leadership, support, and the NOC.
- Tracked: actions are on the monthly reliability review. Two weeks later, #2 and #3 are done. #2 was verified with a simulated throttle in staging.
- Verified: the next prompt change went through the canary, hit throttling at 5% of traffic, and rolled back automatically. Users never noticed. Log that as a win.
What the Weak Version Would Have Said
"Root cause: an engineer deployed a prompt change without testing. Action: test prompt changes more carefully." That fixes nothing on the list above, and the next long prompt, from anyone, causes the same outage.