Kafka — алерт когда consumer-offset не двигается
Consumer работает, но offset не растёт (consumer-thread в deadlock или zoom-блок без heartbeat). kafka-consumer-lag показывает «0 lag» потому что producer тоже стоит — но bug в продакшне.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/kafka-offset
# */2 * * * * root /opt/kafka-offset.sh
GROUP=${CONSUMER_GROUP}
TOPIC=${TOPIC}
BROKER=${BROKER:-kafka:9092}
STATE=/var/lib/kafka-offset.state.$GROUP-$TOPIC
STALL_CYCLES=${STALL_CYCLES:-5} # alert after N cycles unchanged
# Get current end offset across all partitions
NOW=$(kafka-consumer-groups.sh --bootstrap-server "$BROKER" --group "$GROUP" --describe \
| awk -v t="$TOPIC" '$2==t {sum += $4} END {print sum+0}')
PREV=$(cat "$STATE" 2>/dev/null || echo "$NOW:0")
PREV_OFFSET=${PREV%:*}
PREV_STALL=${PREV#*:}
if [ "$NOW" = "$PREV_OFFSET" ]; then
STALL=$((PREV_STALL + 1))
else
STALL=0
fi
echo "$NOW:$STALL" > "$STATE"
if [ "$STALL" -ge "$STALL_CYCLES" ]; then
curl -fsS "$HEARTBEAT_URL" --data "stall=$STALL,offset=$NOW,group=$GROUP"
exit 2
fi
echo "OK (offset=$NOW stall=$STALL)"
То же самое в Enterno.io
Заверните в Enterno heartbeat — поймаете именно «consumer заморозился» (отдельный signal от lag-rate), история стоит ли 30 секунд или второй раз за неделю.
Похожие рецепты
Consumer-группа отстаёт от продьюсера, и сообщения копятся. Нужен порог lag, после которого летит алерт.
Consumer для Redis Streams лагает — сообщения берутся, но XACK не происходит (worker завис между чтением и подтверждением). XLEN не растёт, XPENDING растёт.
Нужно убедиться, что сайт возвращает 2xx каждую минуту, и получить алерт в Slack/Telegram при падении.