You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The headline of 0.6.0: when a monitor confirms down locally, the peers
probe the same target from their side before the alert goes out, and
the alert carries the verdict - "confirmed down from 3/3 vantage
points" (real outage) vs "seen UP by hora-b - network issue near this
node?". Two Raspberry Pi at two homes become a distributed Pingdom.
Built to be boring under failure:
- Strictly fail-open: peers being slow, broken, unreachable or
misconfigured never block, delay past a hard 10s concurrent
deadline, or suppress the alert. The worst outcome is an alert
without the annotation - exactly what Hora sent before. The incident
record is written before the peers are consulted.
- Never a proxy: POST /api/peer/probe only probes targets present in
the responder's OWN config (matched on kind + target, probed with
its own timeout/assertions/proxy and no retries), so a leaked token
cannot turn a peer into an SSRF relay. The requesting peer's
listen_token is strictly required (the id alone never authorizes),
unknown peers answer exactly like wrong tokens, and response bodies
are read bounded (16 KiB) like the witness reports.
- A disputed down still alerts: a peer seeing the target up softens
the message, never silences it - geo-partial outages are real.
- Plumbing: Event::Down gains a vantage field rendered by all ten
backends; DownAlert carries it through the coalescer; peer requests
ride the shared plain client, never a monitor's proxy client.
Enabled with [health] confirm_with_peers = true (per-monitor
override), validated at load (needs [health] + a peer with ping_url;
push monitors can't opt in). Tested by a two-real-nodes round trip
over live HTTP sockets covering agreement, dispute, wrong-token and
dead-peer modes - plus a manual two-daemon smoke test end to end.
|`POST /api/push/{id}`| Record a heartbeat for a push monitor. Send the token as an `X-Push-Token` header (preferred - it stays out of proxy access logs) or as `?token=…`. Optional `status=up\|down\|degraded`, `msg`, `ping`. 401 on a wrong token, 404 if not a push monitor. |
223
229
|`POST /api/silence?monitors=api,web&duration=10m`| Mute alerts ad hoc (deploy hook): `monitors` is a comma-separated id list or `all`, `duration` like `10m`/`1h30m` (max 7d), optional `reason`. **Requires `server.auth_token`** (as `Authorization: Bearer` or `?token=`); without one configured the endpoint is closed. |
230
+
|`POST /api/peer/probe`| Multi-vantage confirmation between Hora nodes: probe a target *present in this node's own config* and answer with the verdict. Requires the requesting peer's `listen_token` (`X-Push-Token`). Never probes arbitrary targets. |
224
231
|`GET /api/monitors/{id}/heatmap.svg`| 28-day hours-by-days latency heatmap (SVG), colour relative to the monitor's median. |
225
232
|`GET /api/badge/{id}/status`| Embeddable SVG status badge for a monitor. |
226
233
|`GET /api/badge/{id}/uptime`| Embeddable SVG 24h-uptime badge for a monitor. |
0 commit comments