Graph
Cases5 cases
1 to 5 of 5
IL-0281PostHog's Logs ClickHouse cluster silently deleted almost all its S3 data, losing US logs older than 3 daysPostHog2026- Symptoms
On 19 February 2026, a node of the ClickHouse cluster behind PostHog's Logs product crashed, restarted and could not start again because it could not find a large amount of its data. Engineers then found that almost all of the Logs data stored on S3 was gone, so logs collected in the US region more than 3 days earlier were lost. Only the Logs product was affected.
- Trigger
At 10:54 UTC a routine mutation was run to materialise an index. When it finished at 11:02, it set off a bug in ClickHouse's zero-copy replication.
- Root cause
- Component
- Contributing factor
- Detection
No automated alarm fired. At 19:40 UTC a node in the cluster crashed, restarted and failed to start because of the missing data, and the engineers who investigated found that most of the S3-backed data was gone.
- Remediation
- Switched Logs to a new table without zero-copy replication and caught up on recent messages
- Backfilled the Logs data from the 3 days of Kafka history
- Action items
- Disable zero-copy replication on all clusters
- Audit the whole Logs ClickHouse configuration and keep experimental features out of production
- Enable S3 versioning on the storage buckets so objects deleted by a database bug can be recovered
- Spot-check configurations and data integrity strategies for single points of failure before a product becomes generally available
- Lessons
Running Logs in its own cluster kept every other product unaffected, and 3 days of Kafka retention saved the recent data. An experimental setting chosen for an early internal stage was allowed to stay in production. Monitoring covered only incoming and recent data, so petabytes were deleted over 8 hours without an alarm. Relying on database replication alone over shared storage was a single point of failure, and S3 versioning would have let the deleted files be recovered.
IL-0373Heroku Postgres Essential-tier databases in the EU region ran out of memory and refused connections, twice in four daysHeroku2024- Symptoms
From 22:31 UTC on 27 July 2024, 33 Heroku Postgres clusters in the EU (Dublin) region could not serve requests and ran into memory problems, and some Essential-tier customers could not connect to their databases. Customers trying to reach an affected database received out of memory errors.
- Trigger
A third-party vendor deployed a change to a monitoring agent that runs on Heroku's Postgres database clusters.
- Root cause
- Component
- Contributing factor
- Detection
Heroku Support paged the technology team at 07:50 UTC on 28 July based on customer support tickets. The second occurrence also reached the technology team as an escalation from Heroku Support.
- Remediation
- Allocated more resources and restarted the Postgres clusters, which fixed the first outage temporarily
- Provisioned the previous version of the third-party monitoring software, which did not leak memory
- The vendor applied an interim mitigation
- Action items
- Add enhanced metrics collection for the third-party monitoring software
- Evaluate the vendor's fixed release of the monitoring software and roll it out if acceptable
IL-0330Requests timed out for two weeks waiting on Go's database/sql connection pool, one for almost 20 secondsincident.io2023- Symptoms
Over two weeks in early 2023, incident.io's Go application intermittently timed out on requests that used its Postgres database. A customer reported the problem, Sentry showed a burst of context canceled errors, and the first episode was over within a minute.
- Root cause
- Component
- Contributing factor
- Detection
A customer report and a flurry of context canceled errors in Sentry; the on-call engineer opened an incident and checked the Grafana API dashboard. In the second episode an incident was opened automatically and the on-call engineer was pulled into it.
- Remediation
- Moved the policy violations calculation to a materialised view
- Added database indices for slow queries
- Rewrote queries to filter on an indexed column already present in the join
- Added a one second lock timeout to all transactions
- Forwarded incoming Slack webhooks to PubSub and processed them asynchronously
- Added a middleware that logs how long each operation holds a database connection
- Removed the unnecessary transaction from most Slack modal submissions, keeping it only where needed
- Lessons
The cause was not one slow operation but many short transactions that, added together, caused the problem. The investigation left incident.io with a way to filter logs and traces by how long each operation holds a database connection, and with real performance improvements. Separate databases for separate parts of the application would probably have made the cause easier to find, but would bring distributed transactions and less convenient development environments, a trade-off incident.io chose not to make for now.
IL-0241A database shard could not elect a new primary, and the Stripe API failed most requests in two periods on one dayStripe2019- Symptoms
On 10 July 2019 the Stripe API failed a substantial majority of requests twice, from 16:35 to 17:02 UTC and from 21:14 to 22:47 UTC. In the first period automated monitoring detected within a minute that a database cluster had failed to elect a new primary.
- Trigger
The primary node of a database cluster failed at 16:35 UTC while one shard had several stalled nodes. The second period was set off by rolling the election protocol back to the previous minor version at 20:42 UTC.
- Root cause
- Component
- Contributing factor
- Detection
Automated monitoring detected the failed election within a minute, and the team was alerted at 16:36 UTC. The second period was announced at 21:14 UTC by automated alerts that some shards in the cluster were unavailable.
- Remediation
- Restarted all nodes of the database cluster, which forced a successful primary election
- Updated the production configuration and restarted the database cluster's nodes
- Ramped traffic back up, putting services for user-initiated API requests first
- Action items
- Alert when nodes stop reporting their replication lag
- Alert when a shard enters a state that could trigger the election fault
- Work with the database maintainers on a fix for the underlying fault
- Add circuit breaking on failed operations to particular database clusters
- Use fault isolation to contain the impact of a single failed shard
- Limit the resources used by clients that keep retrying failed requests
- Add procedures and tooling that make rapid configuration changes during incident response safer
IL-0388A Google Cloud live migration took a Discord Redis primary offline, and the failover broke API instances and then guildsDiscord2017- Symptoms
At about 14:01 PDT on 13 October 2017, Discord engineers were alerted to anomalies by real-time metrics and monitoring. A Redis instance that was the primary of a highly available cluster used by the API services had dropped offline after Google Cloud Platform migrated it automatically, and some API instances did not handle the failover to the secondary node correctly.
- Trigger
Google Cloud Platform automatically migrated the Redis instance that was the primary of a highly available cluster used by the API services, and the node incorrectly dropped offline.
- Root cause
- Component
- Contributing factor
- Detection
Real-time metrics and monitoring alerted engineers at 14:01 PDT. The second phase was seen at 15:41 as another anomaly in monitoring, and end user reports of servers appearing offline were escalated at 15:42.
- Remediation
- Ran a rolling restart of all API instances to clear the Redis connection issues
- Corrected the misconfigured edge caching rule for the expensive API route
- Disabled the problem API endpoint on the edge network
- Recovered the Cassandra cluster
- Ran a second rolling restart of all API instances for the latency left by the Cassandra issues
- Removed the misbehaving guilds node from the service hashring
- Forcefully restarted the misbehaving guilds node
- Restarted the whole service, forcing all users to reconnect
- Blocked traffic that relied on the failing push component to reduce its load
- Corrected the API setting that lets users reconnect quickly and safely
- Action items
- Fix the known issues with Redis failover within the coming weeks
- Change the cached route so this type of error does not degrade other services
- Monitor the signals that would have warned of the cascading failure
- Improve the reliability and failure handling of the affected services
- Roll out an update of the library with the suspected flaws
These 5 cases involve Database and In-memory cache. kubegap audits a Kubernetes cluster for gaps like these, read-only, from Claude Code or Codex; its checks cite public reports like the ones in this library.
By root cause1
Software defect5 cases
- Component
- Contributing factor
- Organisation
IL-0281PostHog's Logs ClickHouse cluster silently deleted almost all its S3 data, losing US logs older than 3 daysPostHog2026IL-0373Heroku Postgres Essential-tier databases in the EU region ran out of memory and refused connections, twice in four daysHeroku2024IL-0330Requests timed out for two weeks waiting on Go's database/sql connection pool, one for almost 20 secondsincident.io2023IL-0241A database shard could not elect a new primary, and the Stripe API failed most requests in two periods on one dayStripe2019IL-0388A Google Cloud live migration took a Discord Redis primary offline, and the failover broke API instances and then guildsDiscord2017