Incidents

Everything Drumbeats records about a single outage, and what you can do to it while it is open.

An incident is one outage, from the moment a monitor goes DOWN to the moment it recovers. Every alert, acknowledgement, delivery attempt, and timeline event for that outage rolls up under it.

RESOLVED is the only terminal state. There is no "close without resolving". A job that stops pinging entirely keeps its incident open until a success arrives or you pause the monitor.

Why an incident opened#

The IncidentEvent field tells you which rule fired.

EventTriggerMonitor types
MISSEDThe expected window closed without a success pingCron, Heartbeat
FAILEDA failure ping, a non-zero exit code, a hung run, or three failed HTTP checksAll
DURATION_HIGHThe run finished but took longer than max_duration_secondsCron, Heartbeat, Event-driven
DURATION_LOWThe run finished faster than min_duration_secondsCron, Heartbeat, Event-driven
SSL_EXPIRINGThe TLS certificate crossed 30, 14, 7, or 1 day remainingUptime

DURATION_HIGH, DURATION_LOW, and SSL_EXPIRING open an incident without flipping the monitor DOWN. They are advisories.

A DURATION_LOW on a job with a stable runtime usually means it exited early rather than ran fast, so it is worth setting on anything whose duration you can predict.

What the states mean#

StateMeaningHow it gets here
OPENActive problem, the assigned groups were pagedThe monitor flipped DOWN
ACKNOWLEDGEDSomeone is on it. Still open, paging pausedA person clicked Acknowledge, or called the REST API
RESOLVEDThe job recovered and the groups got a recovery messageAutomatic on the next success. Manual resolution is possible but obscures the real recovery time

What happens when a monitor goes DOWN#

  1. Drumbeats records the failure event.
  2. The monitor flips DOWN once failure_tolerance or schedule_tolerance is reached.
  3. An incident opens with the matching event.
  4. Every channel in every assigned group fires in parallel, unless surge protection has paging paused.
  5. The timeline keeps recording: further failures, log events, acknowledgements, delivery results, and finally the recovery.
The incident detail page in Drumbeats showing the OPEN status badge, the Missed Check-in event type, the Acknowledge button, an Overview card with the start time, and the Timeline and Notes tabs
The incident detail page in Drumbeats showing the OPEN status badge, the Missed Check-in event type, the Acknowledge button, an Overview card with the start time, and the Timeline and Notes tabs

How you get alerted#

The incident pages the notification groups on the monitor, plus any channels assigned directly. The message names the monitor, the event, and the time, and links back to this page. Alert logic governs whether that happens at all.

Acknowledge an incident#

Acknowledging tells your team someone is working on it. It does not resolve anything. The monitor still needs a success ping.

What it does change is the paging. An acknowledged incident stops nudging the on-call rotation while the fix is in progress, and new failures still extend the timeline underneath.

bash
curl -X POST https://api.drumbeats.io/v1/incidents/<incident-id>/acknowledge \
  -H "X-API-Key: $DRUMBEATS_API_KEY"
curl -X POST https://api.drumbeats.io/v1/incidents/<incident-id>/acknowledge \
  -H "X-API-Key: $DRUMBEATS_API_KEY"

Or click Acknowledge on the incident.

What recovery does#

A success ping, or a passing check on an Uptime monitor, closes the loop:

  1. The incident moves to RESOLVED.
  2. The groups that were paged get a recovery message with the outage duration.
  3. The monitor flips back to UP.
  4. The failure, miss, and alert counters reset, so the next outage starts fresh rather than continuing this one.

Read the timeline#

The incident detail page shows the outage in order: every ping with its event type, source IP, and payload preview; every status transition; every notification delivery with its per-channel result; and every manual action.

If the failing job posted its stderr as a payload, it renders inline. That is usually the difference between diagnosing from the incident page and opening a shell on the host.

Tune the sensitivity#

SettingRaise it whenCost of raising it
grace_period_secondsJobs start late because the host is busySlower detection of genuinely missed runs
failure_toleranceThe job has known transient errorsYou find out one whole run cycle later
schedule_toleranceThe scheduler is loose about timingMissed runs go unreported for that many windows
max_duration_secondsLegitimate runs are being flagged as hungA truly hung run takes longer to surface
alert_surge_thresholdA failure loop is flooding the channelMore noise before the storm is capped

Every one of these trades detection speed for quiet. Tune per monitor. A flaky scraper and a nightly backup want opposite settings.

Next#

Alert logic for the thresholds in that table. Channels for where incident messages land. REST API incidents for acknowledging and resolving from code.