36 — Disaster Recovery for the Observability Stack¶
When the platform fails during the outage you need it for, you discover whether you've planned for it. Most teams haven't. This chapter is about RPO/RTO for telemetry, cross-region replication, the "blind during incident" failure mode, and the discipline of treating the platform as a production service.
This chapter assumes doc 28 (telemetry pipeline reliability) and doc 33 (federated multi-region). DR builds on both.
Table of Contents¶
- Thesis
- Why telemetry DR is special
- RPO and RTO for telemetry
- The "blind during incident" failure mode
- Backup and restore patterns
- Cross-region replication
- Failover procedure
- Backfill from durable buffer
- Game day testing
- Recovery validation
- Anti-patterns
- Worked example: a regional failure with successful recovery
- Pitfalls
- Mental models
1. Thesis¶
Three claims:
- The observability stack must survive its consumers' worst day. When customer-facing services are down, the platform is needed more, not less. Architect for that.
- RPO ≠ 0 is acceptable for most telemetry. A 5-minute gap during a regional failure is recoverable; pretend otherwise and the architecture cost is not justified.
- Game days are mandatory. The DR plan that's never tested is the DR plan that fails. Quarterly minimum.
If your platform team can describe how things would fail but hasn't actually triggered a failover in production, your plan is theoretical. This chapter is about making it real.
2. Why Telemetry DR Is Special¶
| Dimension | Customer-facing service | Telemetry platform |
|---|---|---|
| Failure visibility | Customers complain | Service teams complain (slowly) |
| Pressure during incident | Lots of attention | Often forgotten until needed |
| Data loss tolerance | Often near-zero | Often 5-15 min acceptable |
| Failover speed | Minutes to hours | Hours acceptable for hot stack |
| Customer comms | External status page | Internal notification |
The constraints are different. Don't apply customer-facing-service DR rigor blindly.
2.1 The "needed during outage" property¶
When the customer-facing stack is down, the platform is the most important system in the org. Engineers can't debug without it. That's the failure mode that justifies investment.
2.2 The "platform is not customer-facing" advantage¶
Internal users have higher patience than customers. A 30-minute platform recovery is acceptable when external services would be measured in seconds.
3. RPO and RTO for Telemetry¶
The targets.
3.1 The definitions¶
- RPO (Recovery Point Objective): maximum acceptable data loss. "We lose at most X minutes of telemetry."
- RTO (Recovery Time Objective): maximum acceptable downtime. "Telemetry is restored within Y minutes."
3.2 The targets per signal¶
| Signal | RPO | RTO |
|---|---|---|
| Audit logs | 0 (no loss) | 1 hour |
| SLI metrics | 5 minutes | 30 minutes |
| Application metrics | 15 minutes | 2 hours |
| Application logs | 15 minutes | 2 hours |
| Traces | 30 minutes | 4 hours |
| Profiles | 1 hour | 12 hours |
Audit logs: zero data loss; compliance-critical. SLI metrics: tight RPO; SLO calculations depend. Profiles: lax; not load-bearing.
3.3 The RPO mechanism¶
RPO is achieved via: - Durable buffering (Kafka) before storage. - Replication of storage. - Backups of cold tier.
Without one of these, RPO = "whatever happens to be in flight when the failure hit."
3.4 The RTO mechanism¶
RTO is achieved via: - Hot standby (warm or active). - Documented failover procedure. - Tested recovery.
Without these, RTO = "however long it takes to set up a new cluster."
3.5 The cost trade-off¶
Tighter RPO/RTO = more cost. RPO=0 needs synchronous replication; RTO=0 needs hot active failover.
For most observability platforms: RPO 5-15 min, RTO 30-120 min is sufficient. Don't over-invest.
4. The "Blind During Incident" Failure Mode¶
The single most expensive observability failure.
4.1 The scenario¶
Production has a real outage. Engineers turn to dashboards. Dashboards are stale or fail. Engineers are blind. The outage extends.
4.2 The causes¶
- Platform broken before / during the incident.
- Pipeline backed up; recent data not yet queryable.
- Alerting evaluator failing; no pages.
- Cross-region failover broken.
4.3 The defenses¶
Cross-link to doc 28:
- Independent observation path (tier-0 alerts).
- Synthetic canaries.
- Internal status page.
- Separate paging for platform itself.
Plus DR-specific: - Hot replicas in another region. - Pre-tested failover. - Documented runbook.
4.4 The "platform incident" simulation¶
Once a quarter, simulate the platform itself going down. Verify: - Independent path triggers tier-0 alerts. - Synthetic canary fails. - Backup paging path works. - Engineers can find the runbook. - Failover procedure is up to date.
The first time you test this in production, you'll find it broken.
5. Backup and Restore Patterns¶
The mechanics.
5.1 What needs backing up¶
- Configuration. Tenant configs, alert rules, dashboards, recording rules, SLO definitions.
- Index state. TSDB blocks (Mimir / Cortex blocks in object storage are the backup).
- Audit logs (write-once is a backup).
- Catalog state (Iceberg metadata, Hive metastore).
5.2 What's recoverable from upstream¶
- Raw telemetry can be replayed from Kafka if retained long enough.
- Compacted data is in object storage; survives most cluster failures.
- Hot ingester state lost; rebuild from upstream.
5.3 The "config in Git" principle¶
Configuration as code: - Mimir / Loki / Tempo configs in Git. - Alert rules in Git. - Dashboards as JSON in Git. - SLO definitions in Git. - Tenant configs in Git.
Any cluster can be rebuilt from Git + the object store backups.
5.4 The runbook¶
The DR runbook lives in the platform-incident runbook (doc 28 §12.2). Specific steps:
- Provision new infrastructure in DR region.
- Apply config from Git.
- Connect to backup object store.
- Verify data accessibility.
- Redirect traffic.
- Monitor; validate.
Documented; tested; updated.
5.5 Object store for backup¶
Object storage (S3, GCS) is durable by design (11+ nines). For most telemetry, the active object store is the backup. No separate copy needed; cross-region replication for RPO.
For audit logs: separate immutable bucket (S3 Object Lock).
6. Cross-Region Replication¶
The continuous-recovery mechanism.
6.1 The replication options¶
| Method | RPO | RTO | Cost |
|---|---|---|---|
| Synchronous replication | 0 | Seconds | Highest (latency, network) |
| Asynchronous replication | minutes | minutes | Medium |
| Periodic backup + restore | hours | hours | Low |
For observability: usually async (RPO few minutes acceptable).
6.2 Cross-region object storage¶
S3 Cross-Region Replication: source bucket → dest bucket. Async; minutes lag.
If us-east-1 fails, telemetry data is in us-west-2. Spin up Mimir in us-west-2; point at the replica.
6.3 The Kafka mirror¶
For Kafka: Confluent's MirrorMaker 2 / Cluster Linking replicates topics across regions.
If primary fails, secondary has all messages. Resume ingestion from there.
6.4 The configuration replication¶
Config is in Git, which is replicated by the Git host (GitHub, GitLab) automatically. CI applies on demand.
6.5 The cost¶
Cross-region replication: usually \(0.01-\)0.02/GB transfer. For 1 TB/day of telemetry: ~$300/month. Cheap insurance.
7. Failover Procedure¶
The runbook.
7.1 The triggers¶
- Primary region down (multiple AZ failures).
- Sustained latency / error rate from primary.
- Disaster declared by leadership.
7.2 The procedure¶
1. Confirm primary is genuinely down (avoid false failover).
2. Page DR lead + platform team.
3. Activate DR runbook.
4. Spin up DR cluster (or scale up warm standby).
5. Apply config from Git.
6. Point DNS / load balancer to DR region.
7. Verify ingestion accepting (synthetic canary check).
8. Verify queries serving (Grafana check).
9. Notify users via status page.
10. Continuously verify until primary is restorable.
7.3 The decision threshold¶
Failover is not free: cost + risk of getting it wrong (data inconsistency, false alarm).
Threshold: primary down for > 30 minutes, no clear restoration path. Otherwise wait.
7.4 The fail-back¶
When primary is restored: 1. Backfill primary from secondary (replay). 2. Verify primary catches up. 3. Switch traffic back. 4. Decommission DR (back to standby state).
Fail-back is often harder than fail-over. Plan it explicitly.
7.5 Active-active alternative¶
Skip the failover entirely: both regions ingest and query continuously. One failing leaves the other operational without a switch.
Cross-link to doc 33 §3.3. More expensive; simpler operationally during failure.
8. Backfill From Durable Buffer¶
The recovery layer.
8.1 Kafka as the durability backbone¶
Kafka retains messages for N hours/days. If downstream storage failed for those hours, replay from Kafka:
1. Storage restored.
2. Reset consumer offsets to start of incident window.
3. Re-consume into storage.
4. Storage catches up to current.
A 4-hour outage with 24-hour Kafka retention: recoverable. Without Kafka, the data is lost.
8.2 The backfill SLO¶
This is the DR SLO for ingest. If you can't catch up within X hours after recovery, something is wrong with the system.
8.3 The capacity for backfill¶
Backfill rate must exceed normal ingestion rate; otherwise you never catch up. Typical: 2-5× capacity for backfill.
8.4 The "out of order" tolerance¶
Backfilled data may arrive out of order. Storage must accept it (idempotent or out-of-order-tolerant). Most modern TSDBs are.
8.5 The "missing data" report¶
Document gaps explicitly. SLO calculations during the gap window are estimates, not measurements. Postmortems reference the gap.
9. Game Day Testing¶
The discipline.
9.1 The cadence¶
Quarterly minimum. Variants:
| Type | What | When |
|---|---|---|
| Tabletop | Walk through the runbook in a meeting | Monthly |
| Limited drill | Failover one component (e.g., one ingester) | Quarterly |
| Regional drill | Simulate one region's failure | Bi-annually |
| Full disaster | Total platform failure simulation | Annually |
9.2 The format¶
- Schedule.
- Plan: what's the simulated failure?
- Inject (or simulate).
- Team responds per runbook.
- Observe what fails.
- Recover.
- Postmortem.
- Update runbooks; close gaps.
9.3 The "did the runbook work?" question¶
Most game days reveal: - Stale runbook steps. - Missing tooling. - Dependencies on the broken thing. - Unclear decision criteria. - Single-points-of-failure not previously known.
Each finding becomes a fix.
9.4 The learning value¶
Even when the game day "succeeds," the team learns: - Which steps are slow. - Where automation would help. - What runbook content is unclear. - Who knows what.
The exercise is the value.
10. Recovery Validation¶
How you know it worked.
10.1 The validation checklist¶
- Ingest accepting (write succeeds).
- Query returning (read succeeds).
- Recent data present (no gap beyond RPO).
- Older data accessible (object store reachable).
- Alerts evaluating (recording rules working).
- Dashboards loading.
- Tenants isolated correctly.
- Synthetic canaries passing.
10.2 The validation script¶
Automate the checks:
./validate-recovery.sh
- sends test metric, queries it, expects sub-30s appearance
- sends test log, queries, expects same
- sends test trace, queries, expects same
- calls each tenant's quota; expects enforcement
- runs a representative recording rule; expects success
- runs a representative dashboard query; expects success
Pass = recovery verified. Fail = continue investigation.
10.3 The communications¶
When validated, status-page-update: "Telemetry platform fully recovered. Backfill complete. SLO impact during the window: TBD; full report by end of week."
10.4 The followup¶
Recovery is the start, not the end: - Postmortem. - Action items. - Game day update. - Runbook update. - Capacity / config change if needed.
11. Anti-Patterns¶
- No DR plan. Hope-based recovery.
- DR plan untested. Theoretical only.
- No game day cadence. Plan rots.
- Single-region storage. No backup.
- No Kafka durability. Data lost during outage.
- No config in Git. Cluster rebuild slow.
- No backfill capacity. Catch-up impossible.
- No internal status page. Service teams confused.
- No tier-0 alerts on platform. Failures invisible.
- No active failover testing. Plan fails on first real use.
- Tight RPO/RTO without budget. Architecture under-funded.
- Loose RPO/RTO without explicit policy. SLO calculations diverge.
- No backup verification. Backups exist; can't restore.
- No fail-back plan. After failover, can't return.
- DR responsibility undefined. When trigger hits, no clear owner.
12. Worked Example: A Regional Failure With Successful Recovery¶
Concrete and complete.
12.1 The setup¶
- Active-active 3-region observability platform.
- Mimir + Loki + Tempo per region; cross-region replication via Kafka MirrorMaker.
- Object storage replicated (S3 CRR).
- 3-region paging path (independent).
12.2 The incident¶
us-east-1 has an AZ failure cascading to multiple AZs. Primary Mimir cluster degrades.
T+0 us-east-1 AZ-A fails T+5m Mimir us-east ingest error rate climbs to 30% T+8m Tier-0 alert fires (independent path): "us-east ingest unhealthy" T+10m Platform on-call investigates; identifies AZ failure T+15m Decision: failover us-east traffic to us-west-2 T+18m DNS updated; new ingest goes to us-west T+20m us-west catching up Kafka backlog T+30m Backlog cleared; full ingest at us-west T+45m us-east AZ-A recovers T+60m Backfill us-east from Kafka; verify data integrity T+90m us-east traffic restored; us-west reverts to standby T+120m Postmortem timeline written
12.3 The data integrity¶
- Audit logs: zero loss (multi-region replication; Kafka durable).
- SLI metrics: ~5 minutes gap during the failover (within RPO).
- Application logs: ~5 minutes gap.
- Traces: ~10 minutes (some in-flight lost; acceptable).
12.4 The customer impact¶
- Internal users: dashboards stale for ~10 minutes during failover.
- Service teams' SLO calculations: gap noted; recomputed for window.
- No customer-facing impact.
12.5 The lessons¶
- Tier-0 alerts triggered correctly.
- Failover took 18 min (target was 30; better than planned).
- Backfill took ~30 min (target was 60).
- Two minor runbook gaps surfaced; updated.
12.6 The postmortem¶
Standard postmortem (doc 15 §12). Action items:
- Automate failover decision (some steps still manual).
- Improve catch-up rate.
- Document the AZ-level resilience plan.
13. Pitfalls¶
- No DR plan. Hope-based.
- Untested. Theoretical.
- No game day. Drift.
- No durability buffer (Kafka). Data loss.
- No config in Git. Slow rebuild.
- Single-region. No backup.
- No tier-0 alerts. Failures invisible.
- No internal status page. Confusion.
- No fail-back plan. Stuck in DR.
- No backup verification. False confidence.
- Tight RPO/RTO under-funded. Architecture mismatch.
- Loose RPO without policy. Drift.
- No backfill capacity. Stuck behind.
- No data integrity check. Corruption undetected.
- No DR ownership. Confusion at trigger.
14. Mental Models¶
The platform is needed most during outages. Architect accordingly.
RPO ≠ 0 is fine for telemetry. Don't over-invest.
Config in Git + object-store backup = rebuildable cluster.
Kafka is the durability layer. Without it, in-flight loss is permanent.
Cross-region replication for RPO; warm standby for RTO.
Game days are mandatory. Untested plans fail.
The independent observation path tells you when the platform is failing.
Active-active beats failover for high-bar SLOs. More expensive but simpler operationally.
Backfill SLO is the recovery measure. "We caught up within X hours."
Validate recovery explicitly. Documented checklist; not just "looks ok."
Now go to doc 37 (vendor migration patterns).