Graph
Cases2 cases
1 to 2 of 2
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-0285Clever Cloud's Pulsar brokers stalled in a minor upgrade, then hypervisors overloaded and crashed with kernel panicsClever Cloud2024- Symptoms
On 2 August 2024, two minutes after Clever Cloud's data team started a minor rolling upgrade of its Apache Pulsar messaging cluster to release 3.3.1, monitoring showed connection problems with the messaging platform. Producing data into the event bus failed, the backlog grew while no new producers or consumers succeeded, and agents on hypervisors, log forwarders on load balancers and deployments were affected. At 10:20 CEST the Pulsar cluster was declared defective.
- Trigger
At 10:06 CEST the data team began a minor rolling upgrade of Apache Pulsar to release 3.3.1 that also switched on a new balancer for bundle placement: the extensible load manager (loadManagerClassName=org.apache.pulsar.broker.loadbalance.extensions.ExtensibleLoadManagerImpl) with the TransferShedder load shedding strategy instead of the native OverloadShedder.
- Root cause
- Component
- Contributing factor
- Detection
Monitoring showed connection issues to the messaging platform at 10:08 CEST, two minutes after the upgrade began, and engineers confirmed at 10:09 that producing data into the event bus failed. Monitoring did not catch the first broker's failure to create the system topic, because that broker stayed up.
- Remediation
- Rolled back the new unload strategy while keeping Pulsar 3.3.1
- Shut down the client proxies to release the brokers
- Switched deployment notification events to RabbitMQ as a workaround
- Stopped all brokers and started only one, which loaded the conflicting system topic so it could be deleted, then started all brokers
- Restarted the messaging proxies, after which messages flowed again
- Stopped the watchdog so it would not reload every failed component, and started components one by one
- Disabled Metrics API ingestion to protect its storage cluster
- Stopped the long-term storage for observability metrics (the Warp10/FoundationDB cluster) to free resources
- Put all monitoring instances in all regions into maintenance so they stopped sending events to the orchestrator
- Killed the overloaded small VMs one by one
- Flagged 12 hypervisors to drain workload and shut down some load balancers to free CPU and memory
- Cleaned zombie VMs to speed up recovery
- Cleared the monitoring alert queue so queued events would not flood the orchestrator
- Added parked hypervisors to EU-FR-1 to relieve the overloaded ones
- Removed an overloaded RabbitMQ node from the cluster used by the orchestrator
- Rolling-restarted every regional L7 load balancer and every L4 load balancer
- Restarted all HV agents and the add-on provider APIs
- Destroyed all dangling VMs stuck in the stopping state
- Re-enabled Metrics API ingestion with a ramp-up QoS policy
- Action items
- Track KPIs for Pulsar broker and cluster health, hypervisor load, I/O and kernel panic reboots, zombie VMs, RabbitMQ broker and cluster health and deployment queue consumption, each by time of event, detection, decision and resolution
- Deal with too many monitoring alerts
- Look at a backup bastion, because a regional bastion is vulnerable
- Rework the control plane recovery process
- Rework the correlation between monitoring and orchestration
- Revisit fault domain separation against multi-tenancy
- Rethink runtime images and the role of the hypervisor
- Isolate waved release upgrades of Pulsar
- Redesign runtime images with better hypervisor integration
- Regionalise observability for redundancy
- Set Vector's buffer.max_events and buffer.max_size for small VMs
- Switch Vector's buffer.type from memory, the default, to disk
- Change Vector's buffer.when_full from block, the default, to drop_newest
- Tune journald verbosity and SystemMaxUse on small VMs
- Add cgroups restrictions for better process control
- Add I/O restrictions for the VM manager
- Detect zombie VMs better
- Lessons
The simulation process that validates non-minor releases was not applied to minor upgrades or to small configuration changes, and this one went straight to production. Running Clever Cloud on Clever Cloud turned into a chicken-and-egg situation: recovery needed the scheduler to carry out large actions while the control plane was itself slowed and the infrastructure had no free resources. Measuring each key indicator by time of event, detection, decision and resolution showed where the team had lacked visibility or reaction and challenged established rules.
These 2 cases involve Message broker and Automated capacity manager. 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
Configuration change1 case
- Contributing factor
- Organisation