Live demo · the Whyfire screens as on-call sees them · read-only← The guided demoJoin the waitlist
Whyfire AI write-up on · Claude
← Incidents
criticalinc_20261012_7e4bc483 · 2026-10-12 20:31 UTC

HostDown on 2 servers

shop-web-02 is not answering scrapes

Point of origin
shop-db-01: TCP connections up
2 → 302, started 6 min before the alarm · on a different server from the one that alarmed

What changed, earliest first

#ServerWhat changedBefore → afterStartedStrength
1shop-db-01 not alarmedTCP connections 2 → 3026 min before the alarm z 24
2shop-db-01 not alarmederror-like log lines per minute 2/min → 122/min5 min before the alarm z 96
3shop-db-01 not alarmeddatabase connection limit hit
“FATAL: sorry, too many clients already”
0/min → 60/min5 min before the alarm z 60
4shop-db-01 not alarmedlog lines per minute 4/min → 124/min5 min before the alarm z 16
5shop-web-01timeouts to another service
“ERROR: database timeout after 30000ms in CheckoutService.placeOrder”
0/min → 32/min3 min before the alarm z 32
6shop-web-02timeouts to another service
“ERROR: database timeout after 30000ms in CheckoutService.placeOrder”
0/min → 32/min3 min before the alarm z 32
7shop-web-01error-like log lines per minute 2/min → 34/min3 min before the alarm z 25.6
8shop-web-02error-like log lines per minute 2/min → 34/min3 min before the alarm z 25.6
9shop-lb-01 not alarmedtimeouts to another service
“upstream timed out (110: Connection timed out) while reading response header from upstream shop-web-01, 502”
0/min → 61/min2 min before the alarm z 61
10shop-lb-01 not alarmederror-like log lines per minute 2/min → 63/min2 min before the alarm z 48.8
11shop-lb-01 not alarmedlog lines per minute 32/min → 93/min2 min before the alarm z 8.1
12shop-web-01CPU busy 1.2% → 60.3%1 min before the alarm z 15.7

Investigation

Cause: shop-db-01 ran out of database connections at about 20:24 UTC and started refusing queries. The checkout app servers then timed out, the load balancer returned 502s, and both app servers stopped answering. The database is where this began; the app servers are only where it surfaced.

Evidence:

  • shop-db-01: TCP connections 2 → 302 from 20:24, then "FATAL: sorry, too many clients already" and lock timeouts, 2 → 122 error lines a minute from 20:25
  • shop-web-01 and shop-web-02: "database timeout after 30000ms in CheckoutService.placeOrder" from 20:27; shop-lb-01: upstream timeouts and 502s from 20:28
  • both app servers stopped answering at about 20:29; HostDown fired for both at 20:30

Action: On shop-db-01, find what is holding the connections (pg_stat_activity), end it, and cap that client's connections. The app servers should recover once the database accepts connections again; restart them only if they don't.

Origin check: Agree with the pre-pass: shop-db-01's connections climbed 6 minutes before the alarm, ahead of every app-server and load-balancer symptom, on a server that never alarmed. This alert was silenced before against OPS-412 ("raised the app pool size"): that treated the symptom, not this cause.

Written by Claude from the evidence above for this demo. On an appliance with an API key, Whyfire runs this investigation automatically for every incident.

Alerts in this incident

  • HostDown on shop-web-02 20:30 UTC
  • HostDown on shop-web-01 20:30 UTC

Runbook

Is the server itself up? Try to reach it (ping, SSH, the hypervisor or cloud console).

  • If it is up, the agent stopped: systemctl status node_exporter, then systemctl restart node_exporter.
  • If it is not, check the hypervisor or cloud console before rebooting, and look at Whyfire's point of origin: if another server changed first, the outage may have started there.

Whyfire's starter runbook

Happened before

Silenced before

  • 2026-10-12: silenced against OPS-412. "OPS-412 checkout app servers restarting under load; raised the app pool size"

Also started nearby

  • None