Alertmanager Notification Failure
!!! danger "Severity: Critical" Target response: 5 min. Alertmanager can't deliver to one or more receivers. Real alerts may be firing right now and nobody is being notified.
What this alert means
rate(alertmanager_notifications_failed_total[5m]) > 0
Alertmanager attempted to send to a receiver and failed. Repeated failures mean the affected receiver (chat webhook, PagerDuty, email) is down or misconfigured.
This is the meta-alert: if it's firing, your other alerting is potentially broken. Fix this before anything else.
Quick diagnostics
Three commands to run before reading further. These cover the most common root causes:
# WHERE: shell with curl + jq. Set AM_URL to your Alertmanager
# (e.g., http://alertmanager:9093 if port-forwarded).
# WHAT: lists distinct receiver names AM is trying to notify.
# AM holds a backlog when notify fails — any receiver that
# repeatedly appears while errors fire is the one in trouble.
# READ: one receiver name dominating = that's the smoking gun.
# Many receivers failing = your receiver target (Mattermost,
# PagerDuty, etc.) is degraded org-wide, escalate to its owner.
curl -s $AM_URL/api/v2/alerts | jq '[.[].receivers[].name] | unique'
# WHERE: shell with kubectl context set, OR your log aggregator
# (Loki / Splunk / Datadog) filtered to the alertmanager service.
# WHAT: last 200 log lines from alertmanager pods, filtered to
# notify-related entries (errors, retries, timeouts).
# READ: look for "Notify for alerts failed" + the receiver name
# and underlying error. Common ones:
# "connect: connection refused" → receiver host unreachable
# "unexpected status code 401/403" → auth/credential issue
# "unexpected status code 400" → payload rejection
# "context deadline exceeded" → receiver too slow
kubectl logs -n monitoring -l app=alertmanager --tail=200 | grep -i notify
# WHERE: shell with curl, run from a host that has network access
# to the receiver URL (same network where AM runs).
# WHAT: POST a minimal payload directly to the receiver, bypassing
# AM's templating + retry logic. Substitute WEBHOOK_URL with the
# actual api_url from the failing receiver's config.
# READ: 200 = receiver works, AM-side issue (template, config).
# 401/403 = creds. 400 = payload schema rejection (check
# Content-Type, JSON shape). Connection refused = the URL
# doesn't resolve from where AM runs (host networking, DNS,
# wrong endpoint, container vs host).
curl -X POST -H "Content-Type: application/json" -d '{"text":"test"}' $WEBHOOK_URL
Severity & urgency
| Severity | Pager? | Target response | Business impact |
|---|---|---|---|
| Critical | Yes | 5 min | Alerting pipeline degraded; real issues may go unnoticed |
Diagnostic steps
1. Which receiver is failing?
TODO — break failures down by integration label:
sum by (integration) (rate(alertmanager_notifications_failed_total[5m]))
2. AM logs for the specific failure
# If AM is in K8s
kubectl logs -n monitoring -l app=alertmanager --tail=50 | grep -i "error\|fail"
The log line will include the receiver name and the underlying error (HTTP status, timeout, etc.).
3. Hit the failing receiver manually
TODO — for a chat webhook: curl -X POST <api_url> -d '{"text":"manual test"}'. See what error comes back.
Common causes & fixes
A. Mattermost webhook deleted
| Symptom | Fix |
|---|---|
HTTP 400 from /hooks/<id> with the generic "Failed to handle the payload" error |
The webhook in alertmanager.yml was soft-deleted in Mattermost. Run /alertmanager render <name> to get the current valid URL; update the YAML; reload AM. |
B. PagerDuty integration key changed
| Symptom | Fix |
|---|---|
| HTTP 401 / 403 from PagerDuty | Routing key rotated; update in alertmanager.yml; reload AM |
C. Outbound network blocked
| Symptom | Fix |
|---|---|
connection refused or i/o timeout to an external service |
New egress NetworkPolicy or firewall rule; whitelist the receiver's endpoint |
D. Receiver service degraded (chat/pager provider outage)
| Symptom | Fix |
|---|---|
| 5xx from the receiver consistently | Provider is having an outage; check their status page; wait |
Escalation
- Platform on-call.
- If the affected receiver is paging itself (chicken-and-egg), the team's own on-call should be reached out-of-band (phone, secondary system).
Post-incident
- Document any alerts that were dropped during the gap.
- Consider a secondary receiver for high-severity alerts as belt-and-suspenders (e.g., email AND PagerDuty AND chat).
Related runbooks
- Database Connectivity Loss — when AM can't reach its own state DB