Настройка мониторинга работы крипто-бота
Торговый или арбитражный бот — это stateful процесс, который работает 24/7 с реальными деньгами. Без мониторинга первый же сбой превращается в убыток, который вы обнаружите утром. Хорошая система мониторинга замечает проблему раньше, чем она становится дорогостоящей.
Что мониторим
Жизнь процесса: бот жив, heartbeat приходит регулярно. Самый базовый уровень — /healthz endpoint, который проверяет раз в минуту.
On-chain состояние: балансы кошельков, нет ли транзакций в pending > 10 минут (застрявший nonce), gas price не вышел за пределы разрешённого диапазона.
Биржевое состояние: API биржи отвечает, WebSocket подключён, open orders актуальны (нет ордеров старше N часов которые не исполняются).
P&L метрики: реализованный и нереализованный PnL, дневной drawdown. Алерт если drawdown > X% от капитала.
Стек мониторинга
Prometheus + Grafana — стандарт для production ботов. Бот экспортирует метрики:
import { Counter, Gauge, Registry } from "prom-client";
const register = new Registry();
const tradesTotal = new Counter({
name: "bot_trades_total",
help: "Total number of trades executed",
labelNames: ["side", "symbol"],
registers: [register],
});
const walletBalance = new Gauge({
name: "bot_wallet_balance_usd",
help: "Current wallet balance in USD",
registers: [register],
});
const lastHeartbeat = new Gauge({
name: "bot_last_heartbeat_timestamp",
help: "Unix timestamp of last successful loop iteration",
registers: [register],
});
// В главном цикле бота:
lastHeartbeat.setToCurrentTime();
Grafana дашборд с ключевыми панелями: балансы в динамике, количество сделок в час, P&L по времени, latency биржевых запросов.
Alertmanager для уведомлений:
# alerting-rules.yml
groups:
- name: bot
rules:
- alert: BotHeartbeatMissed
expr: time() - bot_last_heartbeat_timestamp > 300
for: 2m
annotations:
summary: "Bot heartbeat missed for 5+ minutes"
- alert: DrawdownExceeded
expr: bot_daily_drawdown_pct > 5
annotations:
summary: "Daily drawdown exceeded 5%"
- alert: PendingTransactionStuck
expr: bot_pending_tx_age_seconds > 600
annotations:
summary: "Transaction stuck in pending for 10+ minutes"
Telegram-уведомления
Для немедленных алертов проще всего Telegram Bot API:
async function sendAlert(message: string, level: "info" | "warn" | "critical") {
const emoji = { info: "ℹ️", warn: "⚠️", critical: "🚨" }[level];
await fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
chat_id: ALERT_CHAT_ID,
text: `${emoji} *Bot Alert*\n\n${message}`,
parse_mode: "Markdown",
}),
});
}
Логирование
Структурированные логи (JSON) с обязательными полями: timestamp, level, event, data. Для агрегации — Loki (в связке с Grafana) или Datadog:
import pino from "pino";
const logger = pino({ level: "info" });
logger.info({ event: "trade_executed", symbol: "ETHUSDT", side: "buy", amount: 0.5, price: 3400 });
logger.error({ event: "api_error", exchange: "binance", error: err.message, retryIn: 5000 });
Dead man's switch
Для критических ботов — внешний watchdog. Если бот не "постучал" за N минут — автоматически перезапускаем или шлём SMS. Простейшая реализация через healthchecks.io или Cronitor: бот шлёт GET-запрос каждые 5 минут, сервис поднимает алерт при отсутствии пинга.
Настройка базового мониторинга с Prometheus, Grafana и Telegram-алертами: 1 рабочий день. Включая конфигурацию alerting rules под специфику конкретного бота.







