Alert Delivery Health
An alert channel that has never worked looks exactly like an alert channel with nothing to report. Both are quiet.
Alert Delivery Health makes that distinction visible. It reports, per channel, whether alerts are really arriving — and tells you when a channel has been accepting traffic and delivering none of it.
Why this exists
A misconfigured webhook does not announce itself. The rule saves cleanly, the channel appears in your list, and every alert it generates disappears. You find out during an incident, when the page never arrives.
The verdict that matters most here is broken: the channel has had traffic and has never once delivered successfully. That is a configuration error that has been silently discarding alerts since the day it was created.
The four verdicts
| Status | Meaning | What to do |
|---|---|---|
| healthy | Recent successful delivery, no suppression | Nothing |
| degraded | Some deliveries failed, but the channel has worked before | Review the last error — often a transient outage at the destination |
| suppressed | The circuit breaker is open; deliveries are being dropped right now | See Suppression below |
| broken | Traffic, but not a single successful delivery, ever | Verify the target and credentials — this channel has never worked |
Each channel also returns a plain-language remediation string, so the next step is on
screen rather than in a runbook.
Suppression and circuit breakers
When a channel fails repeatedly, Infracast opens a circuit breaker and stops attempting delivery. This protects both your alerting pipeline and the failing destination from a retry storm.
Suppression distinguishes two causes, because they need different responses:
- Permanent — the destination rejected the delivery outright: bad credentials, a revoked token, a deleted webhook. Retrying will never succeed. Fix the channel configuration on the rule; saving the rule clears the suppression.
- Transient — repeated but recoverable failures, such as an unreachable endpoint. Delivery retries automatically after a cooldown.
suppressed_now reports how many deliveries have been dropped since the breaker opened,
so you know what you have missed.
Resetting a breaker manually
If you have fixed the underlying problem and do not want to wait for the cooldown:
POST /api/v1/tenants/{tenantID}/alerts/rules/{ruleID}/reset-breaker
Checking delivery health
GET /api/v1/tenants/{tenantID}/alerts/delivery-health?window_days=30
The response includes per-channel detail plus summary counters (healthy, degraded,
suppressed, broken, tripped_channels) so a dashboard can badge a nav item without
walking the full list.
{
"window_days": 30,
"healthy": 3,
"degraded": 1,
"suppressed": 0,
"broken": 1,
"tripped_channels": 0,
"channels": [
{
"channel_type": "webhook",
"status": "broken",
"breaker_open": false,
"remediation": "This channel has never successfully delivered an alert. Verify the target and credentials."
}
]
}
The verdict survives retention
Alert history is pruned on a retention schedule. Delivery health deliberately does not derive "has this channel ever worked?" from that history.
This matters more than it sounds. If the verdict were computed from retained rows, then once a channel's history aged out:
- a channel that last worked months ago would masquerade as one that had never worked, and
- a genuinely broken but low-traffic channel would disappear from the view entirely once its failure rows were pruned — exactly the channel you most need to see.
Instead, "has ever delivered" is recorded durably when it happens. Retention can prune the detail; it cannot erase the verdict.
Recommended practice
Check delivery health before you need the alerts, not after. A channel added months ago and never exercised is the most likely one to be broken, and the least likely to be noticed — because silence from a working channel and silence from a broken one look identical until you look here.
See also
- Slack integration — configuring a Slack alert channel
- Microsoft Teams integration — configuring a Teams alert channel
- Webhooks API — webhook delivery and payload format