Cases2 cases
1 to 2 of 2
IL-0286An exercise cleanup destroyed Honeycomb's Kafka brokers, leaving partitions leaderless and ingest crash-loopingHoneycomb2025- Symptoms
On 5 December, during the cleanup after a zonal failover exercise in production, Honeycomb destroyed Kafka brokers on purpose as a runbook step, and several topic partitions lost every broker that held them and became fully leaderless. Any Honeycomb team or environment whose assigned partitions were all unavailable could no longer have its data ingested.
- Trigger
During the cleanup that rebalances workloads after a successful zonal failover exercise, Honeycomb followed its runbook and destroyed Kafka brokers on purpose. Older, in-sync brokers were killed by accident, so some topic partitions lost every broker that held them.
- Root cause
- Component
- Contributing factor
- Detection
Responders noticed through the alerting noise that the ingest service Shepherd had gone into a crash loop more than an hour earlier. On Saturday morning they saw that the Kafka balancing jobs were not progressing and disk usage had not improved, and once the metadata topics were repaired, SLO processing triggers fired about ~18h of late data.
- Remediation
- Marked the impacted partitions read-only on the producer side, which stopped Shepherd's crash loop
- Ran partition reassignments to bring customers back to normal
- Turned off the Kafka autobalancer and left a manual reassignment plan running overnight
- Reduced local retention on Kafka to rely on S3 tiered storage for longer retention
- Repaired the broken _confluent-tier-state and __consumer_offsets partitions, which unblocked SLO processing
- Turned off ingest to stop the brokers from running out of disk
- Turned off tiered storage, which freed the broker disk space at once
- Reopened ingest, which ended the customer impact
- Truncated the fully damaged Retriever partitions and left them read-only
- Extended the binlog retention of the MySQL read-only replica because Activity Log could not publish to Kafka
- Patched Retriever so its nodes could idle live and serve old data despite broken offsets
- Made a one-time offset reset work in Retriever
- Evacuated to a new Kafka cluster with new topics and partitions
- Booted an Activity Log database instance from 9 December and replicated from it to limit data loss
- Cleaned up the older Kafka clusters
- Action items
- Consolidate internal documentation better as the company grows
- Lessons
Many elements of this outage were already known: similar outages, workaround plans, RFCs, migrations and procedures for running such exercises safely existed, but the documents were unknown outside their authors or hard to find. Flexible, locally controlled work is easy to defer again and again in favour of urgent work, and Honeycomb wants to notice when deferring becomes a reflex. Many key interventions came from people who no longer owned the components, which shows drift between team boundaries and the coupling inside the system. The pre-production clusters were too small to reproduce the flaw, and tests on a cluster closer to production would have made catching it much more likely. Coordination and public communication were also hard: senior engineers tended to take the lead automatically, and customers said the updates gave too much detail about minor beta features.
IL-0217Honeycomb's main MySQL database locked up under cache-miss reads and ran out of connections, a 68-minute total outageHoneycomb2023- Symptoms
Hours after a routine switch between two clusters of Retriever, Honeycomb's storage and query engine, late on 24 July 2023, the internal SLO for Shepherd, the ingest service, began to burn slowly. The performance was only marginally slow and inconsistent, with no good explanation, so engineers treated it as minor and left it for the morning.
- Trigger
Late on 24 July Honeycomb switched between two Retriever clusters to avoid a subtle bug, and the new cluster stopped writing the last-written timestamps the schema cache depends on. On the morning of 25 July a feature flag flip meant to move those writes back stopped the remaining writes entirely.
- Root cause
- Component
- Contributing factor
- Detection
Hours after the cluster switch, the internal SLO for the ingest service Shepherd started burning slowly. Engineers left it for the morning, when a chart showed that Retriever's database calls updating the last-written records had stopped.
- Remediation
- Flipped only the writes back to the other Retriever cluster with a feature flag, which did not fix the problem
- Set up circuit breakers that denied all Shepherd traffic with a 5xx error to protect the database
- Failed the hard-locked database over to a replica
- Restarted all Retriever hosts so they could provide data for the cache
- Set the last-written timestamp of every schema with traffic in the last day to now, so the schema store reloaded the cache
- Removed the circuit breaker and restarted the query hosts that failed internal checks
- Action items
- Finish the Retriever cluster migration and remove all code that could disable writes behind the cache
- Explore ways to strengthen the cache further
- Lower the contention put on the database during update storms from new schemas
- Stabilise the performance costs of some operations in the system
- Study instrumentation and experimentation that detect and handle such edge cases better
- Lessons
Locally good decisions combined into the outage: the query engine wrote the timestamps because it already saw all the data, the shared cache helped scale ingest and untangle the main database, the cluster switch was done to avoid a bug, frequent deploys hid the feature flag bug, pausing deploys during the investigation kept hosts from restarting, and past near-misses made the team expect a slow failover. Feature flags, frequent deploys, pausing deploys during incidents and learning from near-misses all contributed, although they are among the practices Honeycomb trusts most. For a rare lockup of this kind a database failover is the fastest recovery. Several recent Honeycomb incidents started from trying to avoid a subtle bug.
These 2 cases involve In-memory cache 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
Operator error1 case
- Component
- Contributing factor
- Organisation
Software defect1 case
- Component
- Contributing factor
- Organisation