Cases4 cases
1 to 4 of 4
IL-0572About 10 million Pub/Sub messages backed up and Merpay accounting data was not written to Cloud Spanner for over a dayMercari2026- Symptoms
From about 6:00 on the last business day of a month, Cloud Pub/Sub messages of the Merpay accounting event pipeline began to back up, new accounting data stopped being registered in Cloud Spanner, and the accounting system intermittently could not accept new data. The backlog grew to about 10 million messages.
- Trigger
More than a month earlier the Cloud Functions of the pipeline had been moved from 1st gen to 2nd gen (based on Cloud Run) without setting --max-instances in the deploy command, which lowered the scale limit from effectively unlimited, the 1st gen default, to 100, the 2nd gen default. The month-end peak, which on that day continued for about 40 minutes, reached that limit.
- Root cause
- Component
- Contributing factor
- Remediation
- Re-ingested the messages saved to GCS by the Dataflow subscription, avoiding data loss
- Action items
- Set max-instances and the other scaling parameters of Cloud Run explicitly in the deploy definition, raising max-instances from 100 to 1000 in steps
- Set min-instances to 1 to avoid cold starts, raise concurrency from 1 to 10, and set CPU to 1 and memory from 512MB to 1Gi
- Use the dual CPU scaling mode of spanner-autoscaler v0.8.0 with a new Total CPU threshold of 70%
- Lower the High priority CPU threshold from 60% to 55% so scale-up starts earlier
- Forbid Spanner scale-down between 5:00 and 7:00
- Reserve Spanner processing units on a schedule for periods with predictable load
- Alert in Datadog when the Cloud Run instance count reaches 40% and 60% of its limit
- Alert in Datadog when undelivered Pub/Sub messages exceed a threshold, lowering it step by step
- Lessons
When moving to a new generation of a managed service, defaults that the team never changed can surface as problems under load, so parameters that only matter at peak, such as scale limits, concurrency and timeouts, should be set explicitly at every migration. An outage rarely has one cause; the fact that the previous month passed under the same conditions pointed to traffic continuity, and prevention needs to look at the trigger, the amplification and what turned it into damage. Capacity settings and the monitoring that shows when they are approached have to be designed together, and teams that run systems they inherited should review these settings and assumptions regularly.
IL-0390PostHog US Cloud event ingestion slowed to delays of up to 2 days as writes to the Persons Postgres table stalledPostHog2025- Symptoms
From 11 November 2025 at 16:02 UTC, PostHog's event ingestion pipeline for US Cloud became severely degraded, and events for all customers in the US region were processed with delays from 10 minutes up to 2 days. Writes to the Postgres database that stores Person information could take multiple seconds per update, and the pipeline slowed until no standard scaling option helped.
- Trigger
The 32-bit OID space used to track TOASTed values of the Persons table's properties column, a JSONb field that often exceeds the 2KB threshold for out-of-line storage, was nearly exhausted.
- Root cause
- Component
- Contributing factor
- Remediation
- Created a new partitioned Persons table with a fresh TOAST table and OID space
- Added database triggers to keep the old and new Persons tables in sync for live writes
- Copied the existing Person data from the old table to the new one with a backfill script
- Changed ingestion and application code to write to the new table and read from it first, with fallback to the old table
- Deployed the web app changes to production under manual control rather than a fully automated rollout
- Scaled ingestion workers to process the accumulated backlog
- Paused ingestion when the MSK local disk reached about 85%
- Reduced the local retention of the affected Kafka topic
- Resumed ingestion after confirming there was enough disk headroom
- Moved the backfill into Dagster to finish it over the weekend
- Action items
- Add metrics and alerts for heavy disk read amplification per write
- Add metrics and alerts for TOAST table statistics
- Add metrics and alerts for other Postgres engine limits that matter at large scale
- Write runbooks for engine-level Postgres limits, with decision trees for migrating versus repairing in place
- Create customer communication runbooks with a clear escalation path and redundancies
- Evaluate other data stores for the persons database
- Complete the reconsolidation on the new Persons tables
- Improve the backfill tooling and the safeguards for Kafka tiered storage
- Design and operate Person-like tables so they avoid similar limits
- Lessons
TOAST OID exhaustion degrades writes long before the hard limit of about 4 billion OIDs, it is rare even at large scale, and standard dashboards for CPU, memory, IOPS and lock contention did not immediately point at it, so diagnosis took a day and a half without monitoring of TOAST growth, OID usage or disk reads per write. Many core features depended on timely updates to the persons table, so its slowdown reached a wide part of the product. The first backfill approach lacked visibility for a long migration, the Kafka tiered storage settings and alerts were not tuned for a large backlog, and the people who normally handle customer communications were all unavailable.
- Symptoms
At 5:15 AM PST on 25 November 2020, alarms fired for errors on putting and getting Amazon Kinesis records in the Northern Virginia (US-EAST-1) Region. From the same time CloudWatch, which processes metric and log data through Kinesis Data Streams, and CloudWatch Events and EventBridge returned more errors.
- Trigger
A relatively small addition of capacity to the Kinesis front-end fleet, made between 2:44 AM and 3:47 AM PST.
- Root cause
- Component
- Contributing factor
- Detection
Alarms for errors on putting and getting Kinesis records fired at 5:15 AM PST, and the teams began reviewing logs.
- Remediation
- Removed the newly added front-end capacity
- Added a configuration so front-end servers load bootstrap data from the authoritative metadata store instead of neighbouring servers
- Restarted the front-end fleet gradually, a few hundred servers per hour from 10:07 AM PST
- Added Cognito capacity to buffer more calls to Kinesis
- Deployed a change that reduced Cognito's dependency on Kinesis
- Mitigated the memory contention on the Lambda invocation hosts
- Informed customers through the backup Service Health Dashboard tool, the Personal Health Dashboard and a global banner
- Action items
- Move the Kinesis front-end to larger CPU and memory servers so fewer servers, and fewer threads per server, are needed
- Add fine-grained alarming for thread consumption
- Finish testing a higher operating system thread count limit
- Greatly improve the cold-start time of the front-end fleet
- Move the front-end server cache to a dedicated fleet
- Move a few large AWS services such as CloudWatch to a separate, partitioned front-end fleet
- Accelerate the cellularization of the front-end fleet to match the back-end
- Change the Cognito webservers so they sustain Kinesis API errors without exhausting their buffers
- Keep 3 hours of metric data in the CloudWatch local metrics data store, first in US-EAST-1 and then globally
- Train support engineers regularly on the backup tool for posting to the Service Health Dashboard
- Lessons
In the Kinesis front-end, the number of threads each server keeps grows directly with the number of servers in the fleet, so adding servers can push every server past an operating system limit at the same time. AWS sees cellularization of the front-end, already done for the back-end, as the way to keep the shard-map cache within a tested and operated range and to guard against unknown scaling limits.
IL-0275Parse.ly's Kafka brokers hit network limits and failed one after another, stopping the analytics pipeline for hoursParse.ly2015- Symptoms
On Thursday night, 26 March 2015, and again on Friday, 27 March, Parse.ly's data processing backend stopped. Monitoring tools such as Munin, Sentry and Pingdom reported failures widely, PagerDuty woke the on-call engineer, and no new analytics data appeared in the dashboards at dash.parsely.com and preview.parsely.com for several hours.
- Trigger
Data volume reached a point where the Kafka brokers, running on modest Amazon EC2 nodes without high network capacity, hit operating system network limits under the outbound read traffic and became unavailable.
- Root cause
- Component
- Contributing factor
- Detection
Munin, Sentry and Pingdom reported the failures widely, Graphite graphs showed them, and PagerDuty woke the on-call engineer when the first outages started in the night.
- Remediation
- Added new brokers to expand the Kafka cluster
- Corrected the configuration of the new brokers and deployed them to the cluster, after which network utilization per node dropped and processing resumed
- Turned the downstream consumer systems back on slowly through Apache Storm and reprocessed the backlog
- Began restoring the data to customer accounts from the raw data archived in Amazon S3
- Lessons
CPU and disk I/O are good signs of machine health, but creeping network utilization is harder to monitor, because 100% of network capacity is not well defined on cloud VMs that share host machines. When every node of a cluster runs close to the same limit, losing one node can take down the whole cluster, so failure planning should cover an entire subsystem going offline, not just one or two machines. Keeping raw data archival in simple files and S3 uploads, separate from the Kafka stream, meant there was no risk of permanent data loss.
These 4 cases involve Message broker and Database. 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 cause2
Breaking change in an upgrade1 case
- Contributing factor
- Organisation
Capacity exhaustion3 cases
- Contributing factor
- Organisation
IL-0390PostHog US Cloud event ingestion slowed to delays of up to 2 days as writes to the Persons Postgres table stalledPostHog2025IL-0384Amazon Kinesis front-end servers in US-EAST-1 could not route requests, so Kinesis and services built on it failedIL-0275Parse.ly's Kafka brokers hit network limits and failed one after another, stopping the analytics pipeline for hoursParse.ly2015