monitor states
A monitor is always in exactly one of five states. State derives mechanically from the latest check — there is no separate state machine to reason about.
| state | color | meaning |
|---|---|---|
| up | green | latest check: every condition returned pass |
| degraded | amber | latest check: at least one warn, none fail |
| down | red | latest check: at least one condition returned fail |
| paused | gray | monitoring temporarily disabled by a user |
| pending | violet | created but never checked yet |
worst outcome wins
State is the worst outcome across all the monitor's
conditions, where fail > warn >
pass. One failing condition makes the whole monitor down, even if
ten others passed. One warning condition (and no failures) makes it
degraded.
Because state is recomputed from scratch on every check, any check whose
conditions all pass returns the monitor to up — the previous state
doesn't matter.
degraded is a first-class state, not a flag. It means the site is
reachable but a quality dimension is off — rising latency, a cert
nearing expiry. Green / yellow / red maps to the vocabulary every status
page already uses, so it needs no explanation to your stakeholders.
degraded counts as uptime
When pngr computes uptime %, degraded time counts as up. Only
down time reduces uptime. The reasoning: during degraded the site
was still reachable — what was degraded was quality (latency, cert
margin), not availability. This matches status-page conventions and
spares you from explaining "but my site was up the whole time" to a
confused stakeholder.
See incidents for how a state change turns into an incident, and how severity escalates and de-escalates within a single incident.
paused and pending
paused and pending both render gray but mean different things.
pending is a brand-new monitor the scheduler hasn't reached yet
(usually for ~10s after creation). paused is a deliberate stop — no
checks run, no incidents open, and history is preserved until you resume.
On the status timeline, both paused windows and the pre-monitoring gap show as muted-gray "no data" buckets rather than green — the absence of a check is not a passing check.