Monitoring Reliably at Scale

Airbnb redesigned its observability stack to break the circular dependency between monitoring and the infrastructure it monitors. The solution comes in three layers: compute isolation via dedicated-but-managed Kubernetes clusters, network isolation via a custom Envoy L7 layer outside the shared service mesh, and a Dead Man's Switch that detects the absence of expected health signals rather than the presence of bad ones. The throughline: never let your safety mechanism depend on the thing it's protecting.

Interactive

Break each layer — in the old architecture and the new — and see who gets paged.

Open the visualization ↓

Problem

Airbnb's monitoring stack ran on the same Kubernetes clusters and Istio service mesh that it was supposed to observe. This created a textbook circular dependency: when the shared infrastructure failed, the monitoring of that infrastructure failed simultaneously, leaving the team blind at exactly the moment visibility mattered most.

The failure chain was concrete. App services ran on shared K8s clusters. The metrics pipeline also ran on those clusters. Metrics about K8s flowed through the Istio service mesh. And Istio itself ran on the shared K8s clusters. A degradation anywhere in the foundation propagated upward and silenced the alerting that should have notified the team about that very degradation.

Beyond the circular dependency, observability traffic is orders of magnitude larger than business traffic. Mixing them on the same Istio data plane meant telemetry spikes could starve application traffic, and application traffic could starve telemetry. The two had different priority classes and incompatible requirements, but the shared mesh treated them identically.

Solution

The fix comes in three architectural layers, each addressing a distinct failure surface.

Compute isolation: dedicated Kubernetes clusters for observability workloads, but still operated by the Cloud team. This is the Goldilocks choice between running everything on shared clusters (circular dependency) and running their own clusters (operational burden a small team can't sustain). Dedicated tenancy on a managed platform — isolation without operational ownership.

Network isolation: a custom Envoy-based L7 ingress layer that lives entirely outside the Istio service mesh. Observability traffic now has its own data plane, with strict prioritization, tenant-based header routing for over 1,000 services, traffic mirroring capabilities, and fine-grained access control. The shared mesh can fail without affecting metrics, and metrics traffic can't congest the mesh. The asymmetry — owning networking but not compute — is itself a deliberate choice: K8s was a mature managed platform that just needed dedicated clusters, while networking required telemetry-specific features the mesh couldn't provide.

Meta-monitoring via Dead Man's Switch: a separate Prometheus instance runs on isolated nodes across availability zones, with an alert rule that always fires while Prometheus is healthy. Alertmanager continuously pushes these heartbeats to AWS SNS. A CloudWatch alarm watches the SNS message rate — if heartbeats stop arriving (for any reason), CloudWatch pages on-call via PagerDuty. The recursive problem of monitoring the monitors collapses into a dead-simple absence-detection mechanism. Silence becomes the alarm.

1,000+
services routed by the dedicated Envoy L7 layer

Tradeoffs

  • Dedicated clusters introduce coordination overhead with the Cloud team — observability changes must align with broader platform changes — but the alternative (the small observability team running its own clusters end-to-end) is unsustainable for the available headcount.
  • Owning the network ingress while delegating compute creates a split operational model: the observability team owns Envoy configuration, the Cloud team owns the Kubernetes platform. This boundary needs continuous maintenance as both layers evolve, but each layer plays to the strengths of the team that owns it.
  • The Dead Man's Switch is intentionally simple — CloudWatch just counts messages — but that simplicity means it can only detect total silence, not subtle degradation. The first symptom is binary: heartbeats stopped. Finer-grained degradation requires separate monitoring on the observability stack itself.
  • Custom Envoy L7 routing requires the team to understand and maintain ingress infrastructure — knowledge that doesn't transfer directly from application engineering. The team accepts this expertise debt because the alternative (sharing the Istio data plane) creates worse failure modes.

Patterns in this article

  • Fault Isolation

    Every layer of Airbnb's redesign embodies fault isolation: dedicated compute clusters isolate the metrics pipeline from app workloads, a separate Envoy L7 plane isolates telemetry traffic from business traffic, and the Dead Man's Switch isolates failure detection from the failing system. The same principle applied at three different layers.

  • Dead Man's Switch

    The Prometheus + SNS + CloudWatch chain is the canonical implementation: a heartbeat that always fires when healthy, an external recipient that counts messages, and an alarm that fires when the count drops. The architecture detects absence of expected signal rather than presence of bad signal — which collapses what would otherwise be an infinite recursion of 'who monitors the monitor?' into a single dirt-simple absence detector.

  • Circular Dependency Avoidance

    The original monitoring architecture had overlapping circular dependencies, each invisible until activated. The redesign maps and severs each one: dedicated clusters break the compute dependency; dedicated network plane breaks the data-flow dependency; external SNS+CloudWatch breaks the alerting dependency. The article is a worked example of how circular dependencies hide in plain sight inside 'reasonable' shared-infrastructure choices.