Skip to content

Set up alerts

The alert engine runs inside the binary and is on by default. It evaluates persisted rules every FANOUT_ALERTS_EVALUATION_INTERVAL (30s) against service rollups, and delivers by webhook.

Manage rules through the HTTP API using an operator or administrator session. The browser client has no alert-rule editor.

EndpointDoes
GET /api/alerting/alertsCurrent alert state
GET /api/alerting/summaryCounts by state
GET /api/alerting/rulesList rules
POST /api/alerting/rulesCreate and compile a rule
PUT /api/alerting/rules/:idReplace a rule; recompile it when enabled
POST /api/alerting/rules/:id/testEvaluate a saved expression against live data without changing alert state or delivering a webhook
DELETE /api/alerting/rules/:idDelete the rule and its alerts

Reading takes telemetry:read; creating and replacing takes alerts:manage, which starts at the operator role. See roles.

An expression, an optional service to scope it to, timing, and delivery:

FieldMeans
nameRequired rule name
enabledSet true to evaluate the rule; omitted means disabled
expressionThe condition, in CEL
serviceEvaluate only for this service; omit for all
for_secondsHow long the condition must hold before firing
cooldown_sMinimum quiet period after resolving before firing again
repeat_interval_sHow often to re-deliver while still firing
webhook_urlWhere to deliver
webhook_headersJSON-encoded object of extra headers, supplied as a string
webhook_templateGo text/template payload body; omit for the default
notify_on_resolveAlso deliver when the alert clears

Nonempty expressions supplied when creating or replacing a rule are type-checked against the declared variables and must return a boolean. An unknown variable or a type mistake is rejected at save time. Supply a complete rule body when replacing it; omitted fields take their zero values.

An expression reads one service’s rollup for the current window. The alert expression reference lists every variable, including error_rate, p95, throughput and the baseline deltas.

For example:

error_rate > 0.02 && throughput > 10

throughput is the total span count in the rollup window. A traffic floor prevents a single failure on a quiet service from triggering this rule.

An alert moves through three states:

  • pending: the condition is true but has not held for for_seconds yet. With for_seconds: 0 a rule skips this and fires immediately.
  • firing: it has held. The webhook is delivered, and re-delivered every repeat_interval_s while it stays true.
  • resolved: the expression went false. If notify_on_resolve is set, that is delivered too.

cooldown_s then holds the rule quiet for that long after resolving, which is what stops a metric hovering at the threshold from delivering repeatedly.

Each alert records its last delivery status and timestamp in GET /api/alerting/alerts. Setting repeat_interval_s to zero disables repeat delivery. Disabling a rule removes its pending and firing alerts.

Evaluation reads analytical rollups. The rollup pass follows durable telemetry publication; the evaluation interval and for_seconds add further delay. How storage works explains the publication horizon and watermark. A shorter evaluation interval does not increase the rollups’ time resolution.