Настройка мониторинга uptime торгового бота
Торговый бот который упал в 3 ночи и никто не заметил — это не просто пропущенные сделки. Это открытые позиции без управления, пропущенные стоп-лоссы, и потенциально значительные убытки к моменту когда кто-то это обнаружит. Мониторинг uptime бота — это не Grafana ради красивых графиков, это система которая разбудит вас раньше чем рынок сделает это болезненнее.
Что нужно мониторить
Uptime бота — это не просто «процесс запущен». Процесс может быть живым, но бот не торгует. Нужны три уровня проверок:
Process alive — самый базовый. Процесс запущен, не завис.
Application alive — бот действительно обрабатывает данные. Heartbeat: бот регулярно пишет timestamp последней активности. Если timestamp не обновлялся N минут — что-то не так.
Trading alive — бот не просто работает, но и торгует ожидаемым образом. Метрики: количество ордеров за период, P&L, открытые позиции соответствуют стратегии.
Инструменты
Healthcheck endpoint. Самый простой и надёжный подход — добавить HTTP endpoint в бота:
from fastapi import FastAPI
import asyncio
import time
app = FastAPI()
last_heartbeat = time.time()
bot_state = {"status": "running", "last_trade": None, "open_positions": 0}
@app.get("/health")
async def health():
age = time.time() - last_heartbeat
if age > 60: # не обновлялся больше минуты
return {"status": "stale", "heartbeat_age_seconds": age}, 503
return {"status": "ok", **bot_state}
# В основном цикле бота
async def bot_loop():
global last_heartbeat
while True:
last_heartbeat = time.time()
await run_strategy()
await asyncio.sleep(5)
Uptime Kuma — self-hosted аналог UptimeRobot. Проверяет HTTP endpoint каждые N секунд, отправляет уведомления в Telegram/Discord/PagerDuty при недоступности. Деплоится за 5 минут на Docker:
docker run -d --restart=always -p 3001:3001 \
-v uptime-kuma:/app/data louislam/uptime-kuma:1
Для бота: Monitor Type = HTTP, URL = http://your-bot-host:8080/health, interval = 30 seconds, expected status = 200.
Better Uptime / PagerDuty — если нужны SLA-гарантии и escalation политики.
Telegram-алерт напрямую из бота. Самый быстрый способ получить уведомление — бот сам отправляет сообщение при ошибке:
import httpx
async def notify_telegram(message: str):
await httpx.AsyncClient().post(
f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
json={"chat_id": CHAT_ID, "text": message}
)
# В exception handler
try:
await run_strategy()
except Exception as e:
await notify_telegram(f"Bot crashed: {e}")
raise
Prometheus + Grafana для метрик
Для более детального мониторинга — экспортировать метрики в Prometheus:
from prometheus_client import Counter, Gauge, start_http_server
orders_placed = Counter('bot_orders_placed_total', 'Total orders placed', ['symbol', 'side'])
open_positions = Gauge('bot_open_positions', 'Number of open positions')
pnl_gauge = Gauge('bot_unrealized_pnl_usd', 'Unrealized PnL in USD')
last_heartbeat_gauge = Gauge('bot_last_heartbeat_timestamp', 'Last heartbeat timestamp')
# В коде бота
orders_placed.labels(symbol='BTCUSDT', side='buy').inc()
last_heartbeat_gauge.set(time.time())
start_http_server(9090) # Prometheus scrape endpoint
Alerting rules в Prometheus:
groups:
- name: trading_bot
rules:
- alert: BotHeartbeatStale
expr: time() - bot_last_heartbeat_timestamp > 120
for: 1m
annotations:
summary: "Trading bot heartbeat stale for {{ $value }}s"
- alert: BotNoOrders
expr: rate(bot_orders_placed_total[30m]) == 0
for: 30m
annotations:
summary: "Bot placed no orders in 30 minutes"
Watchdog процесс
Если сам бот не может отправить алерт (процесс мёртв) — нужен внешний watchdog. Простейший вариант на bash с кронтабом:
#!/bin/bash
# /usr/local/bin/bot-watchdog.sh
HEALTH_URL="http://localhost:8080/health"
TELEGRAM_TOKEN="..."
CHAT_ID="..."
response=$(curl -s -o /dev/null -w "%{http_code}" --max-time 10 "$HEALTH_URL")
if [ "$response" != "200" ]; then
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendMessage" \
-d "chat_id=${CHAT_ID}" \
-d "text=ALERT: Trading bot health check failed (HTTP ${response})"
fi
# Crontab: каждую минуту
* * * * * /usr/local/bin/bot-watchdog.sh
Автоматический перезапуск
systemd — если бот запущен как systemd service:
[Unit]
Description=Trading Bot
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/bot/main.py
Restart=on-failure
RestartSec=10
StartLimitIntervalSec=60
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
Restart=on-failure — автоматически перезапускает при падении. StartLimitBurst=3 — не более 3 перезапусков за 60 секунд (защита от crash loop).
Docker restart policy: --restart=unless-stopped или --restart=on-failure:3.
Что входит в настройку
Настройка занимает 1-2 дня: добавление healthcheck endpoint в бота (или адаптация существующего), деплой Uptime Kuma / настройка внешнего мониторинга, настройка Telegram-алертов, watchdog скрипт, автоматический перезапуск через systemd/Docker, базовые Prometheus метрики если нужна аналитика по торговой активности.







