Представьте: вы настроили ежедневный бэкап базы данных. Скрипт надёжно лежит в cron и каждую ночь складывает копию в S3. Вы спокойны. А через месяц обнаруживаете, что бэкапы не создавались… потому что две недели назад сервер перезагрузили, а скрипт забыли добавить в автозагрузку.

Знакомо? Или другая ситуация: вы разрабатываете устройство для умного дома, которое работает за NAT и не имеет публичного IP. Как узнать, что оно всё ещё онлайн и отправляет данные?

Обычный HTTP-мониторинг тут бессилен - нет открытого порта, до которого можно достучаться извне. Но есть элегантное решение, которое называется Heartbeat мониторинг. И в PingZen он работает из коробки - бесплатно и без танцев с бубном.

Почему стандартный мониторинг не помогает

Самый распространённый способ проверки - «мы стучимся к вам». Мониторинговый сервер пытается открыть TCP-соединение, отправить HTTP-запрос или пинг. Это отлично работает для сайтов, API и публичных сервисов.

Но что, если проверяемый объект:

  • сам инициирует соединения (cron-задачи, фоновые обработчики);

  • находится в приватной сети (за NAT, в корпоративной VPN);

  • не имеет публичного IP (умные розетки, камеры, датчики);

  • работает по расписанию и просыпается только для выполнения работы?

Во всех этих случаях классический pull-мониторинг (когда проверяющий идёт к цели) бесполезен. Цель просто недоступна для входящих подключений.

Heartbeat меняет правила игры

Идея проста до гениальности: не мы проверяем сервис, а сервис сам сообщает нам, что он жив. Это называется heartbeat-мониторинг (или push-мониторинг). Вы даёте своему приложению уникальный URL, а оно регулярно стучится на этот адрес. Если стук прекратился - значит, что-то пошло не так.

В PingZen такой монитор создаётся за минуту. Вот как выглядит экран создания Heartbeat-монитора:

Что мы видим на экране:

  • Название монитора - просто чтобы не запутаться.

  • URL Slug - уникальная часть адреса, по которому сервис будет стучаться. Полный URL выглядит так: https://pingzen.dev/api/v1/ping/my-super-job

  • Ожидаемый интервал проверки - как часто ваш скрипт должен «пинать» нас (например, раз в 5 минут).

  • Льготный период (grace period) - дополнительное время ожидания после интервала. Это чтобы случайная задержка в пару минут не вызвала ложную тревогу. Если интервал 5 минут, а льготный период 2 минуты, то тревога сработает только если heartbeat не будет получен в течение 7 минут.

После создания вы попадаете на страницу монитора, после нужно нажать на редактирование монитора, где увидите уникальный эндпоинт и готовые примеры интеграции:

готовые примеры интеграции
готовые примеры интеграции
готовые примеры интеграции
готовые примеры интеграции

Как видите, PingZen даёт не просто URL, а сразу готовые команды для самых популярных сценариев: для cron, для bash-скриптов, для Python. Просто копируете и вставляете.

Где это реально нужно

1. Мониторинг cron-задач и scheduled jobs

Самый частый сценарий. Вы добавляете в свой crontab строчку, скопированную прямо из интерфейса:

*/5 * * * * curl -fsS -m 10 --retry 5 -o /dev/null https://pingzen.dev/api/heartbeat/backup-job

Или, если хотите более надёжный вариант с retry:

*/5 * * * * curl -fsS -m 10 --retry 5 -o /dev/null https://pingzen.dev/api/v1/ping/backup-job

Теперь если задача не выполнится (скрипт упал, сервер лёг, cron сломался), PingZen через заданное время пришлёт уведомление в Telegram, Slack или на почту.

2. Мониторинг фоновых процессов в приложении

В любом приложении есть фоновые воркеры: обработчики очередей, парсеры, сборщики метрик. Добавьте вызов heartbeat в их основной цикл:

# Пример на Python
import requests
import time

def worker_loop():
    while True:
        # делаем полезную работу
        process_jobs()
        # сообщаем, что живы
        requests.get("https://pingzen.dev/api/heartbeat/worker-1")
        time.sleep(60)

Если воркер завис или упал, запросы перестанут приходить - вы узнаете об этом быстро.

3. Устройства за NAT (IoT, умный дом, роутеры)

Ваше устройство не имеет публичного IP, но оно может инициировать соединения наружу. Пусть оно раз в час отправляет heartbeat. Если сигнал пропал - значит, устройство потеряло связь с интернетом или выключилось.

# На роутере с OpenWrt можно добавить в cron
0 * * * * wget -qO- https://pingzen.dev/api/heartbeat/router-home

4. Мониторинг VPN-подключений

Если у вас удалённые офисы подключаются по VPN, вы можете на каждом шлюзе настроить heartbeat. Пока туннель жив, heartbeat доходит. Нет heartbeat - сработала тревога, можно проверять соединение.

5. Проверка скриптов в изолированных средах

CI/CD пайплайны, временные контейнеры, Lambda-функции - они живут недолго, но важно знать, что они успешно выполнились. Heartbeat в конце работы скажет: «Задача выполнена». Добавьте вызов в конец вашего скрипта сборки или теста:

curl -X POST https://pingzen.dev/api/v1/ping/github-actions-run

Почему это лучше, чем self-hosted решения

Конечно, можно поднять свой сервер с cron-проверками. Но зачем, если есть готовый SaaS?

  • Никакой инфраструктуры. Не нужно ставить PostgreSQL, настраивать окружение, думать об отказоустойчивости.

  • Мгновенные уведомления. Telegram, Slack, Discord, email - всё из коробки.

  • Бесплатный порог. В PingZen можно создать неограниченное количество мониторов (включая heartbeat) с интервалом от 60 секунд и 6 каналами уведомлений: Telegram, Slack, Discord, MS Teams, Mattermost, Webhook.

  • Льготный период - настраивается под ваши нужды, чтобы избежать ложных срабатываний из-за редиректов или временных задержек.

  • Статистика и история. Все приходы heartbeat записываются, можно посмотреть график и убедиться, что задача работает стабильно.

Как это устроено внутри PingZen (немного техники)

Если интересно, под капотом всё просто и надёжно:

  • Каждый heartbeat-монитор имеет уникальный slug, по которому мы принимаем POST/GET запросы (поддерживаются оба метода, как указано на скриншоте).

  • При получении запроса мы сохраняем событие в таблицу heartbeat_pings PostgreSQL через HeartbeatMonitorRepositoryImpl. Время каждого пинга фиксируется — это и есть наша история.

  • Фоновый воркер запускается каждые 30 секунд (параметр check_interval). Чтобы в кластерной среде несколько экземпляров приложения не дублировали работу, мы используем Redis для распределённой блокировки (distributed lock) — только один воркер получает право на сканирование.

  • Воркер перебирает все heartbeat-мониторы и для каждого вычисляет, не превысило ли время с последнего сохранённого пинга допустимый порог (интервал + льготный период). Если превысило — статус меняется на DOWN, и мы инициируем отправку уведомлений.

  • В отличие от обычных мониторов, у heartbeat нет настраиваемого порога подтверждения сбоя (confirmation_threshold). Статус DOWN фиксируется сразу при первом же пропуске. При этом мы всё равно отслеживаем количество последовательных пропусков (consecutive_misses) для статистики и отладки, но это значение не влияет на смену статуса.

  • График прихода heartbeat строится на основе данных из таблицы heartbeat_pings с помощью обычных SQL-запросов (логика в _stats.py). Мы не используем для этого отдельную time-series базу — PostgreSQL отлично справляется с таким объёмом данных, а вам в интерфейсе всё равно отображается красивый и понятный график.

Никакой магии, только надёжный код на Python asyncio и быстрые реакции.

Пара слов о ложных срабатываниях

Самая частая проблема heartbeat-мониторинга - случайные задержки. Сервер может быть временно недоступен из-за сетевых проблем, или скрипт выполняется чуть дольше обычного.

Поэтому мы добавили льготный период (grace period). Если интервал 5 минут, а льготный период 2 минуты, тревога сработает только через 7 минут молчания. Этого достаточно, чтобы отсечь большинство временных глюков, но не пропустить реальную проблему.

Как создать Heartbeat-монитор: проще, чем кажется

  1. Зарегистрируйтесь на PingZen.dev (есть вход через Telegram, Google, Yandex - мучительно не больно).

  2. Нажмите «Создать монитор» и выберите тип Heartbeat.

  3. Задайте имя, интервал и льготный период.

  4. Получите уникальный URL и готовые примеры интеграции (как на скриншотах выше).

  5. Вставьте вызов этого URL в свой скрипт, crontab или конфиг устройства.

  6. Готово! Вы будете знать о проблемах раньше, чем они станут критичными.

Заключение

Heartbeat-мониторинг - это простой и надёжный способ следить за тем, что нельзя проверить извне. Он закрывает огромный пласт задач: от мелких cron-скриптов до распределённых устройств в полях. И теперь у вас есть готовый инструмент, который не требует сервера, настройки и денег (по крайней мере, пока вы не вырастете из стартового тарифа).

Попробуйте прямо сейчас, а в комментариях расскажите, какие ещё сценарии вы видите для heartbeat-мониторинга. Может быть, мы что-то упустили?

Жду ваших историй и вопросов!

P.S. Кстати, в PingZen есть и обычные HTTP/TCP/UDP/ICMP мониторы, и даже сложные проверки через Playwright (протокол Transaction) - можно эмулировать действия пользователя и проверять не просто доступность, а корректную работу интерфейса.