Global Uptime Monitoring with Uptime Kuma + NetDiag
Use Uptime Kuma for alerts and UI, NetDiag for multi-region checks with quorum. Stop false alerts caused by single-region monitoring.
Most uptime monitoring runs from one server in one region.
That works until it doesn't:
- your site is up in Europe but down in Asia
- DNS returns different answers per region
- a CDN edge is broken
- TLS handshake fails in one place only
- your monitor screams while users are fine (or worse: users are not fine and you don't know)
This post shows a setup combining Uptime Kuma for alerts and UI with NetDiag for multi-region checks and quorum logic.
What you'll build
A Kuma monitor that calls NetDiag:
https://api.netdiag.dev/v1/checks?host=aws.amazon.com
NetDiag runs checks from 3 regions, aggregates the result, and returns:
status: Healthyquorum.met: true- per-region
ping / dns / tls / http
Then Kuma evaluates a single JSON value:
- UP if
$.quorum.met == true - DOWN if
$.quorum.met == false
Why quorum beats single-region monitoring
Single-region monitors answer:
"Can my server reach your app?"
Quorum monitors answer:
"Is your app reachable from most places?"
This matters when the real world is messy:
- partial outages
- bad routing
- DNS propagation differences
- CDN edge issues
- region-specific failures
- flaky upstreams
With quorum you get fewer false positives and better signals during incidents.
Prerequisites
- A running Uptime Kuma instance (self-hosted or docker)
- A host/domain you want to monitor
- NetDiag endpoint (public):
https://api.netdiag.dev
Step 1: Create a new monitor
In Uptime Kuma:
- Click Add New Monitor
- Set Monitor Type to HTTP(s) - JSON Query
Step 2: Configure URL
Use this URL (replace with your domain):
https://api.netdiag.dev/v1/checks?host=example.com
Method: GET
Step 3: Set the JSON Query
In Kuma's JSON Query field, use:
$.quorum.met
Expected value:
true
This makes Kuma treat the monitor as:
- UP when quorum is met
- DOWN when quorum is not met
That's all it takes to turn Kuma into a multi-region monitor.
Step 4: Save and test
Click Save.
If everything is healthy you should see:
- green status
- response time based on NetDiag total run duration
NetDiag performs multiple checks per region, so response time is usually higher than a simple single ping monitor. That's expected.
Optional configurations
Different teams want different definitions of "truth."
Option A: Monitor overall status string
Instead of quorum, use:
JSON Query:
$.status
Expected Value:
Healthy
Similar to quorum but more high-level.
Option B: Strict mode (fail if any region fails)
If you want "any region unhealthy = alert me":
JSON Query:
$.regions[?(@.status!="Healthy")]
Expected Value:
[]
This means: "there are no unhealthy regions."
Use this if you operate global user traffic and care about any partial outage.
Option C: TLS-only monitoring (cert health)
Monitor TLS validity across regions:
JSON Query:
$.regions[?(@.tls.certificateValid!=true)]
Expected Value:
[]
If any region reports TLS invalid, Kuma marks DOWN.
Option D: HTTP status must be 200 in all regions
JSON Query:
$.regions[?(@.http.statusCode!=200)]
Expected Value:
[]
Simple and effective for web apps.
Notifications
Uptime Kuma handles alerting. It supports:
- Telegram
- Slack
- Discord
- Webhooks
- and many more
NetDiag focuses on signal quality. Kuma handles alert delivery.
Troubleshooting
Kuma shows DOWN but the site is up for you
That's often the point.
Common causes:
- DNS answers differ per region
- one CDN PoP is broken
- region-specific routing issues
- upstream service outage (partial)
Check NetDiag response details:
observations[]for warnings like DNS mismatchregions[]for which region failed and why
Kuma says JSON Query failed
That usually means:
- the API returned HTML or an error response
- you hit a rate limit
- transient network issues
Open the monitor's Logs, view the raw response and confirm you can see:
"quorum": { "met": true }
Example: What NetDiag returns
Shortened example of important fields:
{
"host": "example.com",
"status": "Healthy",
"quorum": { "required": 2, "total": 3, "met": true },
"durationMs": 1258,
"observations": [
{
"code": "DNS_ANSWERS_MISMATCH",
"severity": "warning",
"message": "DNS resolution differs across regions"
}
],
"regions": [
{
"region": "ap-southeast",
"status": "Healthy",
"tls": { "certificateValid": true, "daysUntilExpiry": 270 },
"http": { "statusCode": 200 }
}
]
}
Uptime Kuma only needs one value: $.quorum.met == true
When this setup works well
This is ideal if you:
- run a global product (users on multiple continents)
- use a CDN and want to detect regional issues
- want fewer false alarms
- want real incident signals, not "my VPS can ping you"
Summary
Uptime Kuma handles notifications and dashboards.
NetDiag handles multi-region diagnostics and quorum signals.
Together:
- global truth
- clean alerts
- no new monitoring UI to build
- no custom alerting system to maintain
Related articles
- Webhook Alerting Patterns for SSL Expiration and TLS Failures — dedupe, thresholds, quorum, escalation, and payload design
- What to Monitor Besides SSL Certificate Expiry — issuer, chain, SANs, protocol, and regional mismatches