Skip to content

Incidents: related alerts as one piece of work with an owner

Incident rules group monitor, uptime, SLO and error alerts; take it, add notes, wait out recovery and close on its own, reopen on relapse; one PagerDuty or incident.io page per incident.

Markdown
On this page

An incident groups related alerts into one piece of work with an owner. When a nightly job fails and then times out, you get one incident — INC-12 · Nightly billing — with both alerts linked, one message to each destination, and one place to take it, write notes and close it. An incident closes on its own only after everything linked has stayed healthy for a while.

Open Incidents in a workspace. Viewers can read incidents; members can take, assign, note and resolve them; admins change the incident rules.

How alerts become an incident#

Alerts → Incident rules decides which alerts open an incident and how related alerts join it. Every workspace starts with one rule:

SettingDefault
KindsMonitor, uptime, SLO and error-issue alerts
SeverityMedium and above
Group bySame source and environment — the same monitor, uptime check, SLO or issue in the same environment
Window30 minutes
Recovery wait15 minutes

Rules are tried in order; the first enabled rule that matches an alert wins. You can narrow a rule to projects and environments, or group by project and environment so that every alert of one app in production lands in the same incident.

An alert that joins an incident does not send its own message. Destinations hear about the incident instead: opened, reopened, severity raised, escalated and resolved. Without a matching rule (or with the rule switched off), alerts are sent one by one as before — see Alerts.

A maintenance window that suppresses an alert also keeps it out of incidents (maintenance windows).

States#

StateMeans
OpenAt least one linked alert is firing and nobody has taken it
AcknowledgedA person took it (Take it, shortcut A); they become the owner if there was none
Monitoring recoveryEvery linked alert recovered; Belvador waits out the recovery wait before closing
ResolvedClosed. Verified when it stayed healthy through the recovery wait; Not verified when someone closed it by hand
  • A new alert during Monitoring recovery puts the incident back to Open silently — no second "opened" message.

  • A related alert within the window after an incident was resolved (and at most 24 hours later) reopens it, with a "reopened" message. Later than that, a new incident with a new number opens.

  • The same alert arriving twice (a node retry, a duplicate delivery) never opens a second incident; two alerts arriving at the same moment still open one.

  • Resolve manually asks for a reason; it is kept on the timeline and sent with the "resolved" message.

Severity#

An incident's severity is the highest severity among its alerts that are still firing; the peak is kept. When severity rises (for example a critical monitor joins), destinations get one "severity raised" message per level. Critical and high incidents always go out at once, even during quiet hours.

Messages and on-call tools#

EventWho hears it
Opened, reopened, severity raisedThe destinations of the alert rule that matched
EscalatedThe escalation destination of the notification policy
AcknowledgedPagerDuty only, so the page stops ringing
ResolvedEveryone who was told it opened

PagerDuty and incident.io destinations receive one alert per incident (trigger, acknowledge, resolve with the same deduplication key), so your on-call tool shows one page, not one per alert. On the incident page, Delivery shows each message: Accepted means the service took the message; only a person taking the incident counts as acknowledged.

Timeline and notes#

Every change is on the timeline: opened, alerts joining or recovering, severity changes, who took it, owner and title changes, fallbacks, escalation, notes and the resolution. Notes (up to 2,000 characters) are shown to your team as plain text. Names and titles come from your own apps and are always displayed as text, never as links or markup.

Impact shows the users affected when the node reports it; Unknown never means zero.

API and MCP#

The same actions are in the REST API and the MCP server:

CallDoes
GET /v1/incidents, GET /v1/incidents/{incident_id}List and read incidents (links, timeline, delivery states) — scope incidents:read
POST /v1/incidents/{incident_id}/ackTake it — scope incidents:write
POST /v1/incidents/{incident_id}/resolveResolve with a reason
POST /v1/incidents/{incident_id}/notesAdd a note
PATCH /v1/incidents/{incident_id}Rename or change the owner
GET/POST /v1/incident-rules, DELETE /v1/incident-rules/{rule_id}Incident rules — scopes alerts:read / alerts:write (admin)

A token acts with its owner's current role: a viewer's token can read but never take or resolve an incident.

Spotted something wrong or missing? Tell us: hello@belvador.dev