Alertmanager — алерт когда alert застрял в pending
Алерт в alertmanager в state=pending дольше for-window — должен быть active, но не fire-ит (group_wait большой? notifier broken? misconfig route?). Никто не получит уведомление.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/am-stuck
# */5 * * * * root /opt/am-stuck.sh
AM=${AM_URL:-http://localhost:9093}
THRESH_MIN=${THRESH_MIN:-15}
NOW=$(date -u +%s)
STUCK=$(curl -fsS "$AM/api/v2/alerts" \
| jq --argjson now "$NOW" --argjson max "$THRESH_MIN" '
[.[] | select(.status.state == "pending") |
{name: .labels.alertname,
age_min: (($now - (.startsAt | sub("\\.[0-9]+Z$"; "Z") | fromdateiso8601)) / 60)} |
select(.age_min > $max)]')
COUNT=$(echo "$STUCK" | jq 'length')
if [ "${COUNT:-0}" -gt 0 ]; then
EXAMPLES=$(echo "$STUCK" | jq -r '.[] | "\(.name)=\(.age_min|floor)m"' | head -3 | tr '\n' ',')
curl -fsS "$HEARTBEAT_URL" --data "pending=$COUNT,examples=$EXAMPLES"
exit 2
fi
echo "OK (no stuck pending alerts)"
То же самое в Enterno.io
Заверните в Enterno heartbeat — meta-monitor для alertmanager: сам поймает ситуацию «alerts фиксируются, но не доставляются» раньше on-call.
Похожие рецепты
Prometheus + Alertmanager шлют алерты только в email или PagerDuty. Команда живёт в Telegram — нужно мостовое звено без отдельного сервера.
Prometheus сам жив, но один из targets (`up==0`) — данные перестали течь, графики пустые, alertmanager-правила, основанные на этом target, не fire-ят (нет данных = нет алерта).
Filebeat / Logstash тихо упал на одном edge-сервере. Ingest rate в Elasticsearch снижен на 40%, но dashboards никто не смотрит. Запросы в Sentry без логов = слепота.