Health & Probe Endpoints
Separate from the authenticated Runtime API, the Runtime can expose a dedicated, unauthenticated, licence-exempt HTTP listener for container and orchestrator health checks (Docker HEALTHCHECK, Kubernetes startupProbe / livenessProbe / readinessProbe). It runs on its own port so a probe reflects process health only — never an API key, a licence tier, or whether the Runtime API itself is enabled. It answers on every licence tier (including Core, where the Runtime API does not run).
Port: resolved from --health-port, then the COMPOSER_HEALTH_PORT environment variable. If neither is set, the endpoint does not start. Host binding reuses RuntimeApiHostName (default +; forced to localhost under --force-localhost).
Endpoints (all GET, no apikey; 200 = pass, 503 = not yet / no longer):
| Path | Probe | 200 when |
503 when |
|---|---|---|---|
/startup, /startupz |
startup | CUDA + engine init done and the main loop entered | during boot, before init completes |
/health, /livez |
liveness | the main loop has ticked within the last 30 s | the loop is wedged (> 30 s since last tick) |
/ready, /readyz |
readiness | startup complete and state is Idle or Running |
startup pending, or state is Loading / Stopping |
/ |
— | alias for liveness | — |
Any other path returns 404. Each response body is JSON for diagnostics:
{
"probe": "ready",
"status": "ok",
"state": "Running",
"startupComplete": true,
"lastTickAgeMs": 92
}
Readiness treats Idle as ready so an idle pod stays in rotation and can still receive a /runtime/load. Use /startup as a Kubernetes startupProbe to gate liveness and readiness during boot; point a Docker HEALTHCHECK at /ready.
The same predicates are exported as the Prometheus gauges composer_runtime_ready and composer_runtime_live, so Grafana alerts and orchestrator probes never disagree.