Настройка мониторинга 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 метрики якщо потребується аналітика по торговій активності.







