Incident Library
Applied filters ComponentMessage brokerFactorMonitoring blind spotOrganisationPostHogClear allEvery case under the filters, with no sentence; newest first.
Suggested filters Search, and the values found in your words appear here.

Graph

  • Root cause
  • Component
  • Symptom
  • Contributing factor
  • Case

Cases1 case

1 to 1 of 1

  1. 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.

Check your cluster for this

This case involves Database and Message broker. 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