PostgreSQL — алерт по запросу, который висит дольше N секунд
Раз в неделю аналитик запускает тяжёлую выборку без LIMIT и блокирует другие транзакции. Хочется получать уведомление через минуту, а не через час.
Рецепт
#!/usr/bin/env bash
# psql one-liner: any query > 60s currently active outside vacuum/autovacuum.
LIMIT_SEC="${LIMIT_SEC:-60}"
COUNT=$(psql -tAX -c "
SELECT COUNT(*) FROM pg_stat_activity
WHERE state = 'active'
AND backend_type = 'client backend'
AND now() - query_start > interval '${LIMIT_SEC} seconds'")
[ "${COUNT:-0}" -gt 0 ] && echo "high ${COUNT}" || echo "ok"
То же самое в Enterno.io
Поднимите endpoint и Enterno-монитор с keyword "ok" и интервалом 1 мин. Дополнительно — heartbeat на pg_dump, чтобы при долгих транзакциях не пропустить и сам бэкап.
Похожие рецепты
long_query_time = 1, slow_query_log включён. Нужно понимать, когда количество медленных запросов в минуту резко вырастает (deploy сломал индекс, ORM начал N+1).
Нужно ловить момент, когда реплика начала отставать от мастера больше чем на 10 секунд.
Secondary в replica set отстаёт от primary, через минуту приложение начнёт читать stale-данные. Нужен HTTP-эндпойнт со словом "ok" / "lag".