Discovery Health
Discovery Health answers a question you rarely think to ask: “is auto-discovery actually working on every host?” When a parser silently fails — nginx running but no vhosts detected, MySQL up but no databases returned — the result looks like an empty page rather than an error. This view surfaces those silent gaps.
Open it under Monitoring → Insights → Discovery Health, or at /insights/discovery-health.
What you see
Section titled “What you see”Hosts are bucketed by discovery status:
- Error — the last discovery run failed outright, or a mandatory scan came back empty on a host where it should not.
- Warning — one or more discovery sources partially failed (e.g. cron parsed but services empty).
- Unknown — the agent has not reported a discovery result recently. Usually means the host is offline.
- Healthy — every discovery source returned data.
Each bucket is a collapsible section with the affected servers, the hostname, when discovery last ran, and a summary of what came back empty.
Header shows the total server count and how many fell into each bucket.
What you can do
Section titled “What you can do”- Open the server — jumps to the host detail so you can inspect logs and re-run discovery from the header.
- Force a discovery run — from the server detail page. Useful after fixing a config on the host.
How it works
Section titled “How it works”Every heartbeat the agent runs the parsers it can — nginx / Apache vhosts, systemd services, Docker, cron, SSL certs, network interfaces, plugin data. Each parser reports one of three things:
- OK, with results — parsed cleanly, returned data.
- OK, empty — parsed cleanly, nothing to find (a host with no cron entries genuinely has none).
- Error — the parser failed. Missing binary, permission denied, malformed config.
Discovery Health looks at the mix of these across a host and decides which bucket it belongs in. The catch — and the reason this page exists — is that “OK, empty” is sometimes wrong: if a host is definitely running nginx and reports zero vhosts, that is a silent parser miss, not the truth. The heuristics on this page flag those cases so you don’t chase a phantom “no domains” bug downstream.