Skip to main content

Health and Readiness

A Demos node exposes plain HTTP GET 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-level status 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 when status is dormant. 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 HTTP 503 (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:

GET /info

Returns identity and peering metadata rather than health. Useful for service-discovery and confirming which node answered: