Uptime monitors call health check endpoints from outside your network, which is the only place that sees what customers see. Hyperping, for example, requests your endpoint as often as every 30 seconds from the regions you choose, counts any 2xx response as up, and alerts only after the failure is confirmed from your other regions. A text assertion can also require something like "status":"ok" in the response body, so an error page served with a 200 still counts as down.
Kubernetes splits health checks into three probes, and the split is useful even if you don't run Kubernetes.
Kubernetes itself exposes /livez and /readyz on its API server and has deprecated its old /healthz endpoint, which is a good naming model for your own services.
A shallow check returns 200 if the process can answer HTTP. It's cheap and catches crashes, but it says "healthy" when the app is running and its database is unreachable.
A deep check runs a quick query against each dependency the service can't work without, such as SELECT 1 on the database or a ping to Redis, and returns 503 if one fails. It catches more, with three rules to keep it safe:
Use the shallow check for liveness and the deep one for readiness and external monitoring. A useful response names what was checked:
{"status":"ok","checks":{"database":"ok","redis":"ok"},"version":"2026.10.1"}
Don't put connection strings, internal hostnames, or stack traces in it. If the endpoint must stay private, require a token in a request header. Hyperping monitors can send custom headers.
In Hyperping, "Healthchecks" is the name of the cron job monitoring feature, and it works the other way round. Instead of Hyperping calling your endpoint, your job calls a unique Hyperping URL each time it finishes, and you get an alert when the call doesn't arrive on schedule. Use an endpoint check for services that answer requests, and a heartbeat for jobs that run on a schedule.
"status":"ok".503 Service Unavailable. Load balancers and monitors read the status code first, so a 200 with "status":"down" in the body only works if every caller checks the body.
Either works. Pick one name for every service so monitors and load balancers can be configured the same way. If you split liveness and readiness, /livez and /readyz make the difference obvious.
Load balancers usually check every 5 to 30 seconds. For an external uptime monitor on a production service, every 30 seconds to 1 minute is the right range. At 5 minutes, an outage can last several minutes before the first failed check.
No. A ping only shows that the host answers network packets. The web server on that host can be down, or returning errors, while the ping still succeeds. Use ping and port checks for hosts and network services, and an HTTP health check for applications.