Cases3 cases
1 to 3 of 3
- Symptoms
At 3:38 PM EDT on 3 June 2026, alerts fired because both the xPRO production CMS and the main xPRO site at https://xpro.mit.edu were returning 503 errors. Fastly, in front of the site, could not connect to the Kubernetes/APISIX origin, because the origin certificate for xpro-web.odl.mit.edu had expired at 3:29 PM EDT.
- Trigger
The origin certificate xpro-cert for xpro-web.odl.mit.edu, issued on 2026-03-05 with a 90-day validity period, expired at 3:29 PM EDT on 3 June 2026.
- Root cause
- Component
- Contributing factor
- Detection
Alerts for the xPRO production CMS and the main xPRO site fired at 3:38 PM EDT on the 503 errors, and a Rootly incident was created at 4:08 PM EDT.
- Remediation
- Deleted and recreated the stale cert-manager certificate resources so that cert-manager issued a fresh origin certificate
- Action items
- Remove the backend origin domain from the non-OpenEdX xPRO Fastly TLS subscription, so Fastly manages only xpro.mit.edu
- Deploy the Pulumi update for the xPRO application in Production
- Trigger cert-manager renewal of the xPRO certificate after the conflicting Fastly validation CNAME is removed
- Consider tests or policy checks that keep cert-manager-managed origin domains out of Fastly TLS subscriptions
- Consider alerting earlier on failed cert-manager CertificateRequests and Orders, so stale ACME failures are found before the certificate expires
- Lessons
Reading the outage as a failed cert-manager ACME renewal was true but incomplete; the missing part was that Fastly had been set to manage validation for a backend origin domain that belonged to cert-manager. The team concluded that TLS certificates and DNS validation records need guardrails around ownership, and that public Fastly frontend domains and Kubernetes/APISIX origin domains must not be treated as interchangeable service domains in TLS automation.
- Symptoms
On 24 March 2026 learn.mit.edu went down shortly after a regular release. An engineer reported the outage with a linked Sentry issue, and Sentry soon showed many 504 responses from the site.
- Trigger
A regular release deployed a query pattern change to the learning resource APIs that put an aggregation inside the main query.
- Root cause
- Component
- Contributing factor
- Detection
An engineer reported the outage with a linked Sentry issue, and Sentry showed many 504 responses. The RDS FreeStorageSpace metric showed that the database had used up its storage.
- Remediation
- Rolled back the release's query pattern change
- Deleted the read replica so the database could flush its buffered WAL files
- Terminated all active queries running longer than 10 minutes with pg_terminate_backend, after the backup finished and with guidance from AWS Support
- Action items
- Explore enabling enhanced analytics on the production Learn database
- Document rollback steps on the platform engineering documentation site
- Make easy rollback part of the new release management framework
- Alert on DiskQueueDepth for production databases without making the alert too noisy
- Alert when API and site response times are more than 30% above normal
- Run a gameday on an example production database outage
- Adopt Rootly for incident management, with an automatic channel and an automatic incident transcript
- Write an outage runbook: start a call, have the on-call engineer watch metrics until they return to baseline, and give one person the communications
- Put the query that terminates long-running queries, and a version that finds them for selective termination, into a production Postgres runbook
- Open an issue on redesigning the Learn Resource View Event model, which is only used for counts
- Use anonymised production data generation tools to bring RC up to production data volume, on separate infrastructure for load testing
- Change the view count to use a precomputed column
- Lessons
The change was reviewed by senior engineers and showed no problems locally or on RC, but data scale and load in production are very different, and nothing in the system's health showed that adding a COUNT aggregation would make disk usage explode.
- Symptoms
On 30 October 2023 at 3:51PM, six minutes after a configuration update was deployed to the xPro production Heroku stack, Pingdom alerted the DevOps on-call engineer, who confirmed at 3:52PM that the site was not responding.
- Trigger
A configuration update applied through Salt at 3:45PM found that the Vault lease of the database credentials was about to expire and could not be renewed, so Vault generated new credentials.
- Root cause
- Component
- Contributing factor
- Detection
Pingdom alerted the DevOps on-call engineer at 3:51PM, and the alert went through OpsGenie; Pingdom closed it automatically at 4:25PM.
- Remediation
- Created a new database parameter group and applied it to the running RDS instance
- Cleared the cached credentials and re-applied the Heroku configuration through Salt
- Action items
- Move the management of xPro resources, including the RDS instance, into Pulumi, where AWS default parameter groups are not used
- Lessons
Almost none of the configuration for this stack, the RDS instance in particular, was managed as code, and that was one of the main reasons the fix took long. Under Pulumi the instance would not have used an AWS default parameter group, and the fix would have been a change to an attached group.
These 3 cases involve Database and CDN and edge network. 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
Configuration change2 cases
- Component
- Contributing factor
- Organisation
Faulty deployment1 case
- Component
- Contributing factor
- Organisation