Алерт при всплеске медленных запросов MySQL
long_query_time = 1, slow_query_log включён. Нужно понимать, когда количество медленных запросов в минуту резко вырастает (deploy сломал индекс, ORM начал N+1).
Рецепт
#!/usr/bin/env bash
# Count slow queries logged in the last 60 seconds. Alert above THRESHOLD.
LOG="/var/log/mysql/mysql-slow.log"
THRESHOLD=${THRESHOLD:-20}
SINCE=$(date -u -d "1 minute ago" "+%Y-%m-%dT%H:%M")
COUNT=$(awk -v t="$SINCE" '
/^# Time:/ { ts = substr($3 " " $4, 1, 16) }
/^# Query_time/ && ts >= t { c++ }
END { print c+0 }
' "$LOG")
if [ "$COUNT" -gt "$THRESHOLD" ]; then
curl -X POST "$SLACK_WEBHOOK" \
--data "{\"text\":\"MySQL: $COUNT slow queries in the last minute (threshold $THRESHOLD)\"}"
fi
То же самое в Enterno.io
Page-speed regression обычно следует за медленными SQL-запросами. PageSpeed checker + Navigator-monitor с историей дают тот же сигнал на уровне TTFB, без доступа к slow-log.
Похожие рецепты
Раз в неделю аналитик запускает тяжёлую выборку без LIMIT и блокирует другие транзакции. Хочется получать уведомление через минуту, а не через час.
Secondary в replica set отстаёт от primary, через минуту приложение начнёт читать stale-данные. Нужен HTTP-эндпойнт со словом "ok" / "lag".
Memcached переполнился и начал выбрасывать ключи под нагрузкой — приложение получает cache-miss и долбит БД. Нужен порог evictions/мин.