{
  "meta": {
    "version": "v1",
    "pricing": {
      "public": {
        "label": "Public",
        "description": "Read-only API access for lightweight status checks and public integrations."
      },
      "premium": {
        "label": "Premium",
        "description": "API keys with higher hourly quotas, plus Slack, Teams, Discord, webhook, and email outage alerts across your vendor stack."
      }
    },
    "generatedAt": "2026-09-12T13:40:12.455Z"
  },
  "data": {
    "id": "incident_statuspage_buildkite_7nc7xd7zkxjx",
    "slug": "buildkite-buildkite-service-disruption-2026-09-09",
    "title": "Buildkite service disruption",
    "summary": "Buildkite service disruption",
    "status": "resolved",
    "stale": false,
    "severity": "major",
    "startedAt": "2026-09-09T19:07:24.941+00:00",
    "updatedAt": "2026-09-11T06:31:09.053+00:00",
    "resolvedAt": "2026-09-10T01:54:23+00:00",
    "provider": {
      "slug": "buildkite",
      "name": "Buildkite"
    },
    "affectedServices": [
      {
        "slug": "buildkite-pipelines",
        "name": "Pipelines & job queue"
      },
      {
        "slug": "buildkite-api",
        "name": "REST API"
      }
    ],
    "links": {
      "html": "/incidents/buildkite-buildkite-service-disruption-2026-09-09",
      "api": "/api/v1/incidents/buildkite-buildkite-service-disruption-2026-09-09",
      "providerHtml": "/providers/buildkite",
      "alerts": "https://outagedeck.com/account?stack=buildkite&utm_source=api&utm_medium=response&utm_campaign=api_alerts&utm_content=incident"
    },
    "impactSummary": "Buildkite reported a major event for the affected tracked services.",
    "source": {
      "id": "source_buildkite_status",
      "kind": "official_api",
      "name": "Buildkite Status",
      "checkedAt": "2026-09-12T13:35:11.237+00:00",
      "stale": false,
      "officialUrl": "https://www.buildkitestatus.com",
      "statusPageUrl": "https://www.buildkitestatus.com"
    },
    "updates": [
      {
        "id": "update_statuspage_buildkite_7nc7xd7zkxjx_851n5jgjs09t",
        "status": "investigating",
        "body": "We've spotted that something has gone wrong. We're currently investigating the issue, and will provide an update soon.",
        "createdAt": "2026-09-09T19:07:24.987+00:00"
      },
      {
        "id": "update_statuspage_buildkite_7nc7xd7zkxjx_kndc6yylqmg2",
        "status": "investigating",
        "body": "We are continuing to investigate this issue. We are seeing impact on the Agent API which will affect job scheduling, artifact uploads, and an increase in 5xx responses from the Agent API endpoints.",
        "createdAt": "2026-09-09T19:41:13.281+00:00"
      },
      {
        "id": "update_statuspage_buildkite_7nc7xd7zkxjx_s3j52qg0c8q3",
        "status": "investigating",
        "body": "We are continuing to investigate elevated error rates across multiple services, and are working to determine the cause.",
        "createdAt": "2026-09-09T20:28:55.957+00:00"
      },
      {
        "id": "update_statuspage_buildkite_7nc7xd7zkxjx_p24y3vptm6zn",
        "status": "monitoring",
        "body": "We are seeing improvements across the affected services, and are seeing services return to normal functionality. We are continuing to monitor and are determining the root cause.",
        "createdAt": "2026-09-09T20:53:15.478+00:00"
      },
      {
        "id": "update_statuspage_buildkite_7nc7xd7zkxjx_fd62mqdfjq1p",
        "status": "resolved",
        "body": "We have seen full recovery for customers since 20:28 UTC. \nWe experienced an autoscaling feedback loop which increased the number of connections to our redis cluster above its ability to respond. This had widespread impact for all of our customers with Web UI, Agent API, REST API and job queue impact between 18:43-19:21 UTC, and again between 20:02-20:28 UTC. A full post incident review will be available later this week.",
        "createdAt": "2026-09-10T01:54:23.117+00:00"
      },
      {
        "id": "update_statuspage_buildkite_7nc7xd7zkxjx_gn2b9jrdn16p",
        "status": "resolved",
        "body": "## Service Impact\n\n_All times UTC unless stated otherwise._\n\nCustomers experienced elevated errors and latency across the Buildkite web interface, REST API, Agent API, and job queue during two periods: 18:43:00–19:21:00 and 20:02:00–20:28:00 on September 9, 2026.\n\nDuring these periods, customers encountered failed API requests, delayed job dispatch, and errors in agent operations including authentication, job acceptance, and artifact uploads. Some jobs impacted by the incident did not recover automatically. These jobs had to be manually cancelled and retried to complete successfully.\n\nBetween 18:43:00–19:21:00: Agent API had an error rate up to 11.2% with no latency impact. REST API had a 9.7% error rate with no latency impact. Web request had a 2.6% error rate with no latency impact. Job queues were delayed by up to 3 minutes.\n\nBetween 20:02:00–20:28:00: Agent API had an error rate up to 24.7% with no latency impact. REST API had a 4.9% error rate with no latency impact. Web requests had a 0.8% error rate with no latency impact. Job queues were delayed by up to 10 minutes. During this window, notifications were also delayed up to 1 minute.\n\nCore services fully recovered by 20:28:00.\n\n## Incident Summary\n\n### Background\n\nSeveral Buildkite services use a shared Redis cluster for coordination, caching, and agent-facing operations. This is one of the last pieces of non-shard aligned shared infrastructure, and is on our roadmap to address. AWS enforces a connection limit of 65,000 connections per node on this Redis cluster.\n\nAs part of our ongoing migration from Amazon ECS to Amazon EKS, we reduced the number of Ruby threads in each Puma and Sidekiq process to their framework defaults. In ECS, we historically configured high thread counts, which caused resource contention and increased latency without a corresponding increase in throughput.\n\nWe’d intentionally timed this work as part of the EKS migration because the migration already required us to redesign how these services are sized and scaled: EKS can respond directly to request queues and worker utilization, allowing us to run more, smaller application containers while preserving total capacity. This gives customers faster, more predictable API responses and background-job processing, particularly during periods of high load.\n\n### What happened\n\nWe began testing Puma Agent services on EKS in July and migrated traffic incrementally from late July, completing the migration earlier this week. Running more, smaller processes increased total Redis connection demand—a trade-off we had modeled, but not adequately accounted for before completing the migration.\n\nBefore the incident, our shared services were already using much of the available connection capacity on the impacted Redis cluster, around 60-80% throughout a 24 hour window.\n\nAt 18:43:10 we started seeing elevated HTTP request errors. At this time, our application reported a burst of Redis connection timeouts, all targeting a single replica in the cluster. Clients with active Redis connections then attempted to reconnect. Failed connections were retried, causing a surge in connection attempts that exhausted that same Redis host’s connection-tracking allowance. This caused the host to reject new connections from the Agent API’s application pods, which led to increased request latency for our Puma Agent service.\n\nAt 18:43:30, the increased request latency from this network failure caused our application platform to rapidly start more Puma Agent containers to respond to the increase in request latency. Within a minute, we’d doubled our running pod count. Each additional container opened its own pool of Redis connections.\n\nAt 18:44:00, several Redis nodes hit their limit of 65,000 connections, and latency of requests slowed further triggering more Puma Agent autoscaling.\n\nOnce the Redis connection limits were reached, applications could no longer reliably connect to Redis. This caused failures across agent authentication, job assignment, artifact uploads, and other API operations.\n\nThe failures then created a feedback loop: slower requests caused our shard aligned Puma Agent services to autoscale, and those additional containers opened more Redis connections, placing further pressure on Redis.\n\nBy 18:50:00, our system stabilized at max, running about five times the number of pods we’d started with. This stable state allowed the autoscaling to start bringing pod counts back down.\n\nBy 19:10:00 the error rate had returned to 0 and and services were no longer degraded.\n\nBy 19:20:00 our pod counts had autoscaled down to more reasonable but still high numbers, and the Redis cluster was functioning again. At this point customers saw recovery.\n\nAt 20:02:00, a routine application deployment temporarily introduced additional containers. Since the Redis cluster was already under strain, this quickly increased request latency which added autoscaling on top of the regular deployment surge numbers. This amplified the connection growth again and caused the second period of degraded service, lasting until 20:28:00.\n\nThe influx of new pods resulted in a very large number of Envoy Gateway configuration updates, which in turn caused some network throttling of the underlying node. This caused packet drops and delays updating our Cilium Operator, which controls configuration for the cluster’s overlay network. This caused resulted some Buildkite Jobs to remain in a stuck state for some customers, requiring manual retries.\n\n### How we responded\n\nWhen we saw that the Redis cluster had reached its capacity to handle incoming connections, we immediately began adding more nodes to the cluster, increasing incoming connection capacity by 33%.\n\nWhen we saw the impact of deployments, we immediately paused further application deployments while we investigated the connection growth.\n\nWe increased the Puma Agent utilization autoscaling threshold, reducing the rate at which workloads scale in response to brief load increases. We also increased our scale up stabilization window to prevent future runaway autoscaling of our workloads.\n\nWe reduced the configured maximum surge of our workloads during application deployments, to reduce pod churn impact on connections.\n\nSince Redis connections and latency remained stable, we then resumed deployments while continuing to monitor the cluster.\n\n## Changes we're making\n\n**Reduce autoscaling sensitivity.**\n\n* We increased the utilization threshold that triggers the Puma Agent autoscaling, so short-lived latency increases do not cause rapid increases in application and Redis connection demand.\n* We increased our scale up stabilization window so that we only add more pods in response to scaling triggers in incremental bursts. This will throttle scaling up based on downstream latency and runaway scaling.\n\n**Reduce deployment-related load.**\n\n* We reduced the maximum deployment surge for Puma and Sidekiq workloads, limiting the additional capacity and downstream connections introduced during deployments.\n\n**Increase immediate Redis capacity by 33%.**\n\n* We added more nodes to the Redis cluster to handle more connections, given the shape of our connection load has shifted with our different thread counts in EKS\n\n**Reduce connection pressure from high-traffic workloads.**\n\n* We moved the two largest Puma Agent sharded deployments back to ECS while we evaluate how the threading changes impact Redis connections and our autoscaling sensitivity.\n\n**Bound aggregate Redis connection demand.**\n\n* We are reviewing Redis connection-pool sizing, application thread counts, and workload scaling limits so that application growth cannot exceed the available Redis connection capacity.",
        "createdAt": "2026-09-11T06:03:26.199+00:00"
      }
    ],
    "access": {
      "plan": "public",
      "keyed": false
    }
  }
}