Health and Readiness
A Demos node exposes plain HTTPGET endpoints on its RPC port for operational
monitoring. These are unauthenticated, return JSON, and are designed to be
polled by load balancers, Kubernetes liveness/readiness probes, and uptime
checks. The contract is additive: existing fields are preserved across releases
so probes do not break.
GET /health
The primary health endpoint. It aggregates the subsystem registry, the boot
tracker, the main-loop heartbeat, and process-level error counters into a single
snapshot.
Status semantics
The top-levelstatus field collapses everything into one of four values, with
the following precedence (failing wins, then dormant, degraded, ok):
Only
failing returns HTTP 503. dormant and degraded are intentional
states and return 200, so a probe keyed solely on HTTP status will not flap on
a node that legitimately has no peers yet.Headers
X-Demos-Dormant: true— added only whenstatusisdormant. Lets an LB route around a node that is up but not yet participating in consensus.
Response fields
Each entry under
subsystems is keyed by name (one of chain, rpc,
metrics, signaling, mcp, tlsnotary, omni, dtr, l2ps, main_loop)
and carries: status (pending | running | ready | failed |
skipped | dormant), since (ms timestamp of the last transition or
null), port, requestedPort, lastError, enabled, and optional extra.
Sample response
Probe configuration
A liveness probe should treat any HTTP503 (i.e. status: failing) as
unhealthy. A readiness probe wanting to gate traffic until consensus
participation can additionally inspect dormant / the X-Demos-Dormant header
or require boot.complete === true.
GET /health/subsystems
A slim sibling for ops dashboards that only need subsystem state. It returns the
same subsystems snapshot plus the dormant flag, with a smaller body and no
status roll-up: