Skip to content

Alertmanager — алерт когда alert застрял в pending

Алерт в alertmanager в state=pending дольше for-window — должен быть active, но не fire-ит (group_wait большой? notifier broken? misconfig route?). Никто не получит уведомление.

Рецепт

bash
#!/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.

Настроить API monitor → ← Все рецепты

Похожие рецепты

Prometheus сам жив, но один из targets (`up==0`) — данные перестали течь, графики пустые, alertmanager-правила, основанные на этом target, не fire-ят (нет данных = нет алерта).