Skip to content

Kafka — алерт когда consumer-offset не двигается

Consumer работает, но offset не растёт (consumer-thread в deadlock или zoom-блок без heartbeat). kafka-consumer-lag показывает «0 lag» потому что producer тоже стоит — но bug в продакшне.

Рецепт

bash
#!/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 секунд или второй раз за неделю.

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

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