Heartbeat
Heartbeat - монитор предназначен для отслеживания регулярных сигналов от сервисов, работающих в закрытых сетях, IoT устройств или фоновых процессов.
Принцип работы
- Вы создаёте Heartbeat монитор и задаёте ожидаемый интервал сигналов
- Ваше приложение периодически отправляет сигнал
ping - Если сигнал не приходит в течение заданного времени — отправляется уведомление
Параметры
Описание
| Параметр | Описание | Обязательный |
|---|---|---|
| Название | Уникальное имя монитора | Да |
| Описание | Примечание о назначении задачи | Нет |
Детали
Указываем ожидаемый интервал между задачами и опционально максимальное время выполнения.
Интервал
Поддерживается два типа расписания:
- Интервал
- Cron выражение
Ожидаемый интервал между сигналами:
| Значение | Описание |
|---|---|
| 1 минута | Сигнал ожидается каждую минуту |
| 5 минут | Сигнал ожидается каждые 5 минут |
| 15 минут | Сигнал ожидается каждые 15 минут |
| 30 минут | Сигнал ожидается каждые 30 минут |
| 60 минут | Сигнал ожидается каждый час |
Для нерегулярных расписаний используйте Cron-выражение:
┌───────────── минута (0 - 59)
│ ┌───────────── час (0 - 23)
│ │ ┌───────────── день месяца (1 - 31)
│ │ │ ┌───────────── месяц (1 - 12)
│ │ │ │ ┌───────────── день недели (0 - 6)
│ │ │ │ │
* * * * *
Примеры:
| Выражение | Описание |
|---|---|
*/5 * * * * | Каждые 5 минут |
0 * * * * | Каждый час |
0 9-18 * * 1-5 | Каждый час с 9 до 18 по будням |
Уведомления
Задача монитор отправляет уведомления в следующих случаях:
| Причина | Описание |
|---|---|
| Not Running | Задача не запустилась в течение Grace Period |
| Recovery | Задача восстановилась после ошибки |
Здесь можно указать группы контактов для уведомлений, если не указывать, то используется Email пользователя.
Также задаётся период ожидания - Grace Period. Добавляется к ожидаемому времени следующего сигнала. Например, если интервал 5 минут и Grace Period 2 минуты, то алерт будет отправлен через 7 минут после последнего сигнала. Повтор уведомлений напоминает о проблеме, можно задать интервал этих напоминаний и их количество.
Использование
Через CLI
# Простой ping
tuna monitor ping MONITOR_ID
# С указанием хоста (полезно для идентификации источника)
tuna monitor ping MONITOR_ID --host=server-01
# С сообщением
tuna monitor ping MONITOR_ID --message="All systems operational"
Через HTTP
Помимо tuna cli, можно отправлять сигналы напрямую через HTTP запросы. Это полезно когда CLI недоступен или вы используете другие языки программирования.
Формат URL:
https://monitor.tuna.am/{MONITOR_ID}/{slug-name}
{slug-name} - опционален и нужен скорее для простой идентификации монитор а в коде.
- curl
- wget
- Python
- PowerShell
# Простой ping
curl -s "https://monitor.tuna.am/MONITOR_ID/test"
# С указанием статуса
curl -s "https://monitor.tuna.am/MONITOR_ID/test?status=ping"
curl -s "https://monitor.tuna.am/MONITOR_ID/test?status=start"
curl -s "https://monitor.tuna.am/MONITOR_ID/test?status=finish"
curl -s "https://monitor.tuna.am/MONITOR_ID/test?status=fail"
# С сообщением (корректная кодировка UTF-8)
curl -G "https://monitor.tuna.am/MONITOR_ID/test" \
--data-urlencode "message=Backup completed successfully"
# С указанием хоста и сообщением
curl -G "https://monitor.tuna.am/MONITOR_ID/test?host=server-01" \
--data-urlencode "message=Все системы работают"
# Простой ping
wget -qO- "https://monitor.tuna.am/MONITOR_ID/test"
# С параметрами
wget -qO- "https://monitor.tuna.am/MONITOR_ID/test?status=ping&host=server-01"
import requests
from urllib.parse import urlencode
MONITOR_ID = "your_monitor_id"
BASE_URL = f"https://monitor.tuna.am/{ENDPOINT_TOKEN}"
# Простой ping
requests.get(BASE_URL)
# С параметрами
params = {
"status": "ping",
"host": "server-01",
"message": "Задача вы полнена успешно"
}
requests.get(BASE_URL, params=params)
# Простой ping
Invoke-WebRequest -Uri "https://monitor.tuna.am/MONITOR_ID/test" -Method GET
# С параметрами
$params = @{
status = "ping"
host = "server-01"
message = "Backup completed"
}
$uri = "https://monitor.tuna.am/MONITOR_ID/test"
Invoke-WebRequest -Uri $uri -Method GET -Body $params
Параметры запроса
| Параметр | Описание |
|---|---|
status | Статус сигнала: ping, start, finish, fail |
host | Идентификатор хоста (полезно при нескольких источниках) |
message | Произвольное сообщение |
В systemd сервисе
# /etc/systemd/system/my-heartbeat.service
[Unit]
Description=Heartbeat ping to Tuna
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/tuna monitor ping MONITOR_ID
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/my-heartbeat.timer
[Unit]
Description=Run heartbeat every 5 minutes
[Timer]
OnBootSec=1min
OnUnitActiveSec=5min
[Install]
WantedBy=timers.target
systemctl enable --now my-heartbeat.timer
В crontab
# Heartbeat каждые 5 минут
*/5 * * * * /usr/local/bin/tuna monitor ping MONITOR_ID
Статусы
| Статус | Описание |
|---|---|
| New | Монитор создан, ожидается первый сигнал |
| Up | Сигналы приходят регулярно |
| Down | Сигнал не пришёл в ожидаемое время |
Примеры использования
Мониторинг GitLab Runner в офисе
# На машине с GitLab Runner
*/5 * * * * /usr/local/bin/tuna monitor ping MONITOR_ID --host=gitLab-runner-0
Мониторинг VPN соединения
#!/bin/bash
# Проверяем VPN канал и отправляем heartbeat только если соединение активно
ping -c 1 192.168.14.88 && tuna monitor ping MONITOR_ID --message="VPN is up"