Real-user monitoring tells you what happened. Synthetic monitoring tells you what will happen — before your users do. For CDN-reliant applications, a well-designed synthetic layer is the difference between catching a PoP failure in 45 seconds and learning about it from Twitter.
This guide covers the production setup we use for high-traffic edge deployments: probe types and assertions, checkpoint topology, and alert policies that detect real incidents without waking your on-call for transient blips. If you already have CDN monitoring and observability pipelines in place, synthetic checks are the active complement that validates them continuously.
1. Why Synthetic Monitoring Is Non-Negotiable for CDNs
CDNs abstract away origin complexity, but they introduce new failure modes: stale cache, failed tiered shielding, TLS certificate rotation errors, Anycast routing anomalies, and PoP-specific latency regressions. Passive logs and RUM will eventually surface these, but by then the impact has spread.
Synthetic probes solve three problems that passive monitoring cannot:
- Proactive validation of cache behavior. A probe can assert that
x-cache: HITis returned for static assets and thatageincrements correctly. RUM cannot reliably distinguish a HIT from a MISS. - Geographic coverage independent of traffic. Low-traffic regions like Johannesburg or Santiago may have no RUM samples for minutes at a time, yet serve critical users. Synthetics guarantee coverage.
- Consistent baselines for performance budgets. By running the same request from the same checkpoint every 60 seconds, you can track CDN performance metrics like TTFB, TLS handshake, and download time with statistical rigor.
Design principle: Treat synthetic checks as unit tests for your edge. Each probe should have a single, explicit assertion. Avoid monolithic “health check” probes that test 10 things at once — they are impossible to alert on cleanly.
2. Probe Types: What to Measure and How
Not all probes are equal. Choosing the right probe type determines cost, frequency, and signal quality. Most mature setups use a layered combination:
| Metric | Edge Processing | Origin Processing | Improvement |
|---|---|---|---|
| Latency (p50) | 8–15 ms | 120–300 ms | 15–20x faster |
| Cache Hit Ratio | 85–95% | N/A | Reduces origin load |
| TLS Handshake | 1–5 ms (nearby PoP) | 50–150 ms | 10–30x faster |
| Bandwidth Cost | $0.01–0.04/GB | $0.05–0.12/GB | 3–5x cheaper |
| Availability | 99.99% (multi-PoP) | 99.9% (single DC) | 10x fewer outages |
HTTP / API Probes (High Frequency)
These are lightweight, headless HTTP clients that execute every 30-60 seconds. They are ideal for availability, cache validation, and header correctness. Configure them to follow redirects, validate certificates, and capture detailed timing phases: DNS, TCP, TLS, TTFB, and content transfer.
Key assertions for CDN probes:
- Status code is 200 (or 304 for revalidation)
- Response header
cf-cache-statusorx-cachematches expected HIT/MISS pattern - TLS certificate expires in >14 days and CN/SAN matches
- TTFB < p95 baseline + 30% (per checkpoint)
- Body contains expected string or checksum for cache poisoning detection
Browser Probes (Hourly or On-Demand)
Browser probes run a full Chromium instance via Playwright or WebDriver. They load the page, execute JavaScript, and collect Web Vitals, filmstrip, and waterfall data. Use them at 5-15 minute intervals for critical user journeys — homepage, product detail, checkout API — not for every asset.
For a deeper look at how these probes interact with origin shielding and edge logic, see our CDN security guide on validating WAF and bot rules without triggering them in synthetics.
Multi-Step and Transaction Probes
For dynamic acceleration and CDN SSL/TLS configuration validation, chain probes: resolve DNS → establish TLS 1.3 → fetch HTML → fetch 3 static assets with cache-busted URLs. This exposes failures in HTTP/3 negotiation or 0-RTT replay that single-request probes miss.
3. Checkpoint Strategy: Where and How Many
A checkpoint is a vantage point — a city, cloud region, or ISP network — from which probes originate. The goal is not maximum coverage, but representative coverage that maps to your traffic and PoP topology.
Mapping Checkpoints to PoPs
Start by exporting your CDN's PoP list and Anycast assignments. For CloudFront, Fastly, or Cloudflare, map each probe location to the PoP it will naturally hit via BGP. If you use CDN HTTP/2, HTTP/3 and QUIC with Anycast, verify that checkpoints in the same region actually land on different PoPs — otherwise you are testing the same edge twice.
Recommended baseline distribution for a global audience:
- North America: Ashburn (VA), Dallas, San Jose — covers east, central, west and validates inland vs. coastal routing.
- Europe: Dublin, Frankfurt — tests both Atlantic edge and central EU shield.
- Asia-Pacific: Tokyo, Singapore, Sydney — captures Japan/Korea, Southeast Asia, and Oceania latencies.
- South America & Africa: São Paulo, Johannesburg — low traffic but high business impact if degraded.
Public vs. Private Checkpoints
Public checkpoints (Datadog, Checkly, Catchpoint, ThousandEyes) are easy to deploy and share IP ranges you can allowlist. Private checkpoints — small VMs in VPCs or colo — are essential if you need to test authenticated origins, internal headers, or WAF bypass tokens that you cannot expose to third-party IPs. A hybrid model works best: 80% public for breadth, 20% private for depth.
- Does the checkpoint ASN match your real users? Residential ISP vs. cloud backbone can differ by 40ms.
- Is IPv6 enabled where your users have it? Dual-stack failures are invisible on IPv4-only probes.
- Can you pin the probe to a specific resolver (1.1.1.1, 8.8.8.8, ISP resolver) to test DNS steering?
- Have you excluded the checkpoint IPs from CDN DDoS protection rate limiting?
4. Alert Policies That Actually Page Correctly
The most common failure in synthetic monitoring is not missing an outage — it is paging too often. Alert policies must balance sensitivity (mean time to detect) with specificity (false positive rate).
The Multi-Location Confirmation Rule
Never alert on a single checkpoint failure. Require at least 2 of 5 or 3 of 8 checkpoints to fail within a 2-3 minute window before triggering a page. This filters transient packet loss, single-PoP blips, and checkpoint host issues. For performance alerts (latency degradation), require the same threshold to exceed baseline for 5 consecutive minutes.
Two-Tier Alert Severity
| Alert Tier | Condition | Evaluation Window | Notification |
|---|---|---|---|
| P1 — Availability | HTTP 5xx / timeout / TLS error from ≥2 checkpoints | 2 min, retest after 30s | PagerDuty / Opsgenie page |
| P2 — Performance | p95 TTFB > baseline +40% or >800ms absolute | 5 min rolling, 3 consecutive failures | Slack #cdn-alerts + ticket |
| P3 — Cache Correctness | Unexpected MISS, stale age, or body checksum mismatch | 3 min, 2 locations | Slack + auto-rollback hook |
| P4 — Informational | Cert expiry <21 days, HTTP/3 fallback rate >5% | Daily check | Email / dashboard |
Baseline-Driven Thresholds
Static thresholds like “TTFB < 200ms” fail across geographies. A Tokyo checkpoint will always be slower from a US origin than Ashburn. Instead, compute per-checkpoint baselines using a 7-day rolling p50/p95 and alert on deviation. For example: alert if 5-minute p95 TTFB exceeds 7-day p95 by 40% or exceeds an absolute ceiling (e.g., 900ms), whichever is higher.
Include burn-rate logic for SLOs: if your error budget is 0.1% monthly, a 2% error rate for 5 minutes burns 1.4% of the budget — page. A 0.5% error rate for the same window burns 0.35% — ticket only.
5. Reference Implementation: From Probe to Page
Below is a production-ready example using Checkly-style YAML and a Terraform alert policy. It validates cache HIT for a static asset, measures TTFB per phase, and pages only on multi-location confirmation.
# checkly.config.yml — HTTP probe for CDN cache validation checks: - name: "cdn-static-asset-hit" activated: true frequency: 1m locations: ["us-east-1", "eu-west-1", "ap-northeast-1", "sa-east-1"] request: url: "https://cdn.example.com/assets/app.7a3f.css" method: GET headers: "Accept-Encoding": "gzip, br" "User-Agent": "FlyFish-Synthetic/1.0" assertions: - "statusCode == 200" - "headers['x-cache'] contains 'HIT'" - "headers['age'] > 0" - "responseTime < 800" - "body contains '/* flyfish:css-v7a3f */'" - "tls.certificate.expiry > 14d"
# Terraform — alert policy with multi-location confirmation resource "checkly_alert_channel" "pagerduty_cdn" { pagerduty { account = "flyfish-nwa" service_key = var.pd_service_key send_failure = true send_recovery = true } } resource "checkly_check_alert" "cdn_p1" { check_ids = [checkly_check.cdn_static.id] alert_settings { escalation_type = "RUN_BASED" run_based_escalation { failed_run_threshold = 2 # 2 consecutive failures } reminders { amount = 2 interval = 5 } parallel_run_failure_threshold = 2 # 2+ locations } }
For cache MISS validation, duplicate the check with a cache-busted URL (?synthetic=miss-<timestamp>) and assert x-cache: MISS and age: 0. This ensures your origin and shield are reachable even when the edge is healthy — a critical distinction during origin outages where HITs mask failures.
6. Operational Best Practices
- Version your checks. Store probe definitions in Git, review changes like code, and deploy via CI. A bad assertion can page the entire org.
- Tag probes by service and PoP. Use labels like
service:checkout, pop:iad, tier:p1so dashboards and alerts can be filtered during incidents. - Correlate with RUM and logs. Push synthetic metrics to the same observability backend as RUM. When both degrade, it is a CDN issue; when only RUM degrades, it is likely client or ISP specific.
- Test purges and deploys. Trigger a synthetic run immediately after a cache purge or edge config deploy and block the pipeline if assertions fail. This catches bad invalidations before users do.
- Rotate probe credentials. If probes use tokens to bypass WAF, rotate them quarterly and store in a secrets manager — never hardcode.
- Audit checkpoint IPs quarterly. Cloud providers recycle IPs; an allowlist that drifts will cause false 403s that look like outages.
When done right, synthetic monitoring becomes the fastest feedback loop in your CDN operations — faster than logs, faster than RUM, and far more deterministic. Start with 4-5 high-value HTTP probes and one browser journey, nail the alert policy, then expand. The goal is not more monitors, but monitors that earn trust when they page.
Frequently Asked Questions
How many synthetic checkpoints do I need for a global CDN?
Start with 8-12 checkpoints covering North America (2-3), Europe (2), APAC (2-3), South America (1), and one inland vs. coastal pair per major region. Add more only if you have PoP-specific SLAs or need to validate Anycast routing. Too many checkpoints increases noise and cost without improving mean time to detect.
What is the difference between HTTP and browser-based synthetic probes?
HTTP probes are lightweight API checks that measure TTFB, status code, headers, and TLS handshake time. Browser probes run a full Chromium engine to measure Core Web Vitals, render time, and third-party asset waterfalls. Use HTTP for high-frequency uptime and cache validation, browser probes for hourly performance baselines.
How do I avoid alert fatigue from synthetic monitoring?
Require confirmation from 2-3 checkpoints before paging, enforce a 2-3 minute retest window, and separate alerts for availability (page immediately) vs. performance degradation (ticket or Slack). Tune thresholds per checkpoint using 7-day p95 baselines rather than global static values.
Can synthetic monitoring validate CDN cache HIT/MISS behavior?
Yes. Configure probes to assert on cache status headers like x-cache, cf-cache-status, or age, and send cache-busting query strings on alternate checks. Pair this with origin-shield validation to detect cache poisoning or unexpected MISS storms after purges.