Multi-region architectures exist for one reason: so a single region's failure doesn't take you down. AWS us-east-1 has a bad day, Cloudflare reroutes, your European users never notice. But there's an uncomfortable asymmetry in how most teams build this: they spend weeks on the failover architecture and then monitor it with a single uptime check against the global URL — from one location. That monitoring setup cannot see a region die. It can't tell you the failover misfired. And it definitely can't tell you the passive region rotted three weeks ago.

This guide covers how to monitor multi-region deployments properly — active-active and active-passive — so the architecture you paid for actually delivers when a region goes down. (If you're looking for CronAlert's multi-region checking feature — probing one URL from five regions at once — that's covered in the multi-region monitoring guide. This post is about the other side: your app being in multiple regions.)

The blind spot: geo-routing hides dead regions

The defining property of a multi-region deployment is that different users hit different infrastructure. GeoDNS, anycast, or a global load balancer sends each request to the nearest healthy region. That's great for latency and resilience — and terrible for naive monitoring, because:

  • A single-vantage monitor only ever sees one region. A checker in Virginia probing api.example.com exercises US-East on every single check. Your Frankfurt region can be hard down for hours while that monitor stays green.
  • In active-active, the router hides failures. When a region dies, the global load balancer shifts traffic to the survivors. Users see slightly higher latency; your global check sees 200s. You're now running with zero redundancy and no alert told you.
  • In active-passive, nothing exercises the standby. The passive region serves no traffic by design. No traffic means no errors, no errors means no signal. Standbys rot silently — an expired certificate, a migration that never ran, a security group change — and you find out during the failover, which is the worst possible time to learn anything.

The fix in all three cases is the same idea: stop monitoring only the abstraction (the global URL) and start monitoring the parts (each region, the routing layer, and the sync between them).

The three layers to monitor

1. The global endpoint — from multiple vantage points

The global URL is what users experience, so it stays your primary monitor — but it has to be checked from multiple regions, because with geo-routing each vantage point exercises a different backend. A check from North America validates your US region; a check from Europe validates Frankfurt; a check from Asia-Pacific validates Singapore. CronAlert's multi-region checks do this in a single monitor: every check probes from 5 regions simultaneously, and the per-region results tell you immediately whether a failure is global or localized to one geography.

Quorum matters here. A single probe region failing might be a transient network blip between that probe and your edge — noise, not outage. Configure the monitor to alert when N of M regions fail (CronAlert lets you choose "alert immediately" or "alert after N of M regions fail"), which is the same consecutive-verification philosophy that keeps false positives out of your alert channel.

2. Each region directly — bypass the router

This is the layer most teams skip, and it's the one that turns a confusing incident into a one-glance diagnosis. Expose a region-specific hostname for each deployment that bypasses the global routing layer entirely:

api.example.com           → global, geo-routed (what users hit)
us-east.api.example.com   → US-East region directly
eu-west.api.example.com   → EU-West region directly
ap-south.api.example.com  → AP-South region directly

Create one CronAlert monitor per regional hostname, pointed at a real health check endpoint — one that exercises the region's own database connection, cache, and critical dependencies, not just a static 200. Now the failure modes separate cleanly:

  • Global check fails, all regional checks healthy → the routing layer is the problem (DNS, load balancer, CDN config). Check your DNS monitoring next.
  • One regional check fails, global check healthy → a region died and failover worked. Users are fine, but you're running without redundancy — fix it now, calmly, instead of at 3am when the second region goes.
  • One regional check fails AND the global check degrades from that geography → the region died and failover didn't work. This is the page-someone-now scenario.

That middle case is the entire argument for per-region monitors. "A region is down but users are unaffected" is exactly the alert an active-active architecture should produce — urgent enough to act on, calm enough to act on well. Without direct regional checks, that state is invisible.

3. The sync between regions

Multi-region state is the hard part of multi-region anything. Whether you run async replication to a passive standby or multi-writer sync in active-active, the link between regions is itself a dependency that fails — and when it fails silently, a later failover quietly loses data. Expose replication health through a health endpoint (lag seconds, last-applied timestamp) and monitor it externally with thresholds. The Postgres replication lag guide walks through exactly this pattern, including the SQL and the endpoint code; the same shape applies to MySQL, DynamoDB global tables, or your own sync pipeline.

Active-passive: monitor the standby like it's live

Active-passive (a primary region serving everything, a standby waiting) concentrates all its risk into one question: will the standby actually work when called upon? Treat the standby as a production system that happens to have no users:

  • Monitor the standby's health endpoint directly on its regional hostname, at the same interval as the primary. It should exercise the standby's database (read-only is fine), its cache, and its config. A standby with an expired cert or a missing env var should page you today, not during the failover.
  • Monitor replication lag with a hard threshold. Your recovery point objective is your lag ceiling. If you promise customers at most five minutes of data loss, alert when lag passes two.
  • Monitor the failover mechanism itself. Route 53 health checks, load balancer failover rules, and DNS TTLs are config that drifts. After any infra change, verify the health check the failover decision depends on is still pointing at the right endpoint — a failover wired to a stale health check fails over at the wrong time, or never.
  • Drill it. Schedule periodic failover exercises inside a maintenance window so the checks keep running but no alerts fire. The drill validates the one path no amount of passive monitoring can: the promotion itself.

Active-active: capacity is the silent failure

Active-active inverts the problem. Failover is automatic and continuous, so dead regions hide easily (layer 2 above catches that). The subtler failure is degraded headroom: with three regions sharing load, losing one pushes 50% more traffic onto the survivors. If they can't absorb it, a single-region failure cascades into a global brownout — slow responses, then timeouts, then a real outage. Two monitoring habits help:

  • Watch response times per region, not just up/down. CronAlert records response time on every check from every probe region. A region whose direct check stays 200 but creeps from 80ms to 800ms is telling you it's saturating before it tips over.
  • Alert on regional failure even when users are unaffected. Running two-of-three regions is an incident with a deadline, not a curiosity. Route it to a high-priority channel — see incident response workflows for severity routing.

Setting it up in CronAlert

  1. One multi-region monitor on the global URL. Probes from 5 regions per check; set quorum alerting (alert after 2 of 5 regions fail) to filter transient noise.
  2. One monitor per regional hostname, pointed at a deep health endpoint that exercises that region's own dependencies. Name them so the alert reads instantly: API — EU-West (direct).
  3. One monitor on replication health per replicated datastore, with thresholds tied to your recovery point objective.
  4. For active-passive: monitor the standby at full cadence, and wrap failover drills in maintenance windows.
  5. Route by blast radius. Global-check failure → PagerDuty/Opsgenie. Single-region failure with healthy global → high-priority Slack. Replication lag warning → engineering channel.
  6. Put the global check on a status page — your customers care that the service is up, not which region served them. See status page setup.

Common pitfalls

  • Monitoring only the global URL. The router hides dead regions in active-active and exercises nothing in active-passive. You need the per-region layer.
  • Checking from one vantage point. With geo-routing, a single-location monitor permanently validates one region and never sees the others.
  • Shallow regional health checks. A static 200 from a region whose database connection is broken is worse than no check — it's false confidence. Make regional health endpoints exercise real dependencies, per the database health endpoint pattern.
  • Ignoring the standby because "it has no traffic." That's precisely why it needs monitoring — nothing else will ever complain about it.
  • No replication monitoring. Failover with stale data isn't recovery, it's silent data loss with extra steps.
  • Alerting on every single-probe blip. Cross-region checks traverse more network; use quorum so the alert means consensus, not coincidence.

Frequently asked questions

How do you monitor an active-active multi-region architecture?

Monitor three layers: the global endpoint from multiple geographic vantage points (each vantage exercises a different backend under geo-routing), each region's direct hostname bypassing the router (so a dead region can't hide behind successful failover), and the replication path between regions. Global = user experience, regional = diagnosis, replication = data safety.

How do you monitor an active-passive (failover) architecture?

Focus on the standby: monitor its health endpoint directly at full cadence (standbys rot silently because nothing exercises them), monitor replication lag against your recovery point objective, and verify the failover mechanism's own health checks after infra changes. Drill the actual failover periodically inside a maintenance window.

Why isn't a single uptime check enough for multi-region deployments?

Geo-routing means one vantage point only ever sees the region nearest to it. A Virginia-based monitor on a geo-routed URL checks US-East forever; Europe can be down for hours without that monitor noticing. Checks must come from multiple regions to exercise the paths real users take.

Should I monitor regional endpoints directly or just the global URL?

Both. The global URL proves users are being served; direct regional hostnames prove each region is individually healthy and tell you instantly which one broke. The most valuable alert a multi-region setup can produce — "a region died, failover worked, fix it before the next one dies" — only exists if you monitor regions directly.

How do I avoid false positives when monitoring across regions?

Quorum alerting. Require N of M probe regions to fail before the alert fires — one region's transient network blip stays out of your pager, while genuine multi-region consensus pages immediately. CronAlert's multi-region checks have this built in.

Monitor your multi-region architecture with CronAlert

You built multiple regions so failure in one place wouldn't become failure everywhere. Make the monitoring match the architecture: create a free account (25 monitors, no credit card), point a multi-region check at your global URL, add a direct monitor per regional hostname, and put a threshold on replication lag. The next time a region goes down, you'll know which one, whether failover worked, and whether your data is safe — while your users are still happily being served by the survivors.

Related reading: how to set up multi-region uptime monitoring, monitoring Postgres replication lag, DNS monitoring, the complete guide to HTTP health check endpoints, and how CronAlert's edge network reduces false positives.