Налаштування сповіщень про збої крипто-бота
Крипто-бот упав в 3 ночі, пропустив 40 транзакцій або завис на одній операції — дізнатись про це потрібно негайно, не через 8 годин коли відкриєте ноутбук. Правильна система алертів закриває три класи проблем: падення процесу, деградація продуктивності (бот працює, але повільно або пропускає подіїв), та бізнес-аномалії (немає транзакцій уже 2 години — це нормально або мережа впала?).
Типова архітектура крипто-бота та точки отказу
Більшість крипто-ботів — це цикл: слухаємо подіїв → обробляємо → діємо. Точки отказу:
- RPC провайдер — Infura/Alchemy можуть повертати помилки, ratelimit або відставати від head блока
- WebSocket з'єднання — рвуться, бот продовжує працювати але не отримує подіїв
- Обработчик транзакцій — завис на одній, блокує чергу
- Нехватка gas/SOL — бот не може відправляти транзакції
- Процес впав — OOM, необроблена помилка, segfault
Healthcheck endpoint + зовнішній моніторинг
Найнадійніший підхід: бот періодично повідомляє "я живий", зовнішній сервіс фіксує відсутність сигналу.
// У боті: heartbeat кожні 30 секунд
class BotHealthReporter {
private lastProcessedBlock: number = 0;
private processedCount: number = 0;
startHeartbeat(): void {
setInterval(async () => {
const payload = {
status: 'ok',
lastBlock: this.lastProcessedBlock,
processed: this.processedCount,
timestamp: Date.now(),
rpcLatency: await this.measureRpcLatency(),
};
// Betterstack/Healthchecks.io ping
await fetch(process.env.HEALTHCHECK_PING_URL!, {
method: 'POST',
body: JSON.stringify(payload),
}).catch(() => {}); // Не крашимся якщо healthcheck недоступен
}, 30_000);
}
}
Healthchecks.io — безплатний сервіс для deadman's switch алертів. Налаштовуєте: "якщо не отримаю ping протягом 2 хвилин — відправ сповіщення". Підтримує Telegram, Email, Slack, PagerDuty.
Betterstack (ex. Logtail) — аналог з більш багатим UI та інтеграцією з логами.
Telegram-бот для алертів: швидше ніж email
class TelegramAlerter {
private bot: Telegraf;
private chatId: string;
constructor() {
this.bot = new Telegraf(process.env.TELEGRAM_BOT_TOKEN!);
this.chatId = process.env.TELEGRAM_ALERT_CHAT_ID!;
}
async sendAlert(level: 'info' | 'warning' | 'critical', message: string): Promise<void> {
const emoji = { info: 'ℹ️', warning: '⚠️', critical: '🚨' }[level];
const text = `${emoji} *[${level.toUpperCase()}]*\n\n${message}\n\n_${new Date().toISOString()}_`;
await this.bot.telegram.sendMessage(this.chatId, text, {
parse_mode: 'Markdown',
});
}
async sendBlockAlert(currentBlock: number, chainHead: number): Promise<void> {
const lag = chainHead - currentBlock;
if (lag > 50) {
await this.sendAlert('critical',
`Бот отстає від мережи на ${lag} блоків\nТекущій: ${currentBlock}\nHead: ${chainHead}`
);
}
}
}
Моніторинг отставання від chain head
Бот може працювати без помилок, але обробляти блоки з відставанням — через повільний RPC або перегружений обработчик. Додаємо перевірку lag:
async function checkChainLag(provider: JsonRpcProvider, lastProcessed: number): Promise<void> {
const currentHead = await provider.getBlockNumber();
const lag = currentHead - lastProcessed;
if (lag > 10) alerter.sendAlert('warning', `Lag: ${lag} блоків`);
if (lag > 50) alerter.sendAlert('critical', `Критичне отставання: ${lag} блоків`);
// Метрика для Grafana
metrics.gauge('bot_chain_lag_blocks', lag);
}
Алерт на низкий баланс gas wallet
async function checkGasBalance(provider: JsonRpcProvider, botAddress: string): Promise<void> {
const balance = await provider.getBalance(botAddress);
const balanceEth = parseFloat(formatEther(balance));
if (balanceEth < 0.05) {
await alerter.sendAlert('warning',
`Низкий баланс gas wallet: ${balanceEth.toFixed(4)} ETH\nАдреса: ${botAddress}`
);
}
if (balanceEth < 0.01) {
await alerter.sendAlert('critical',
`КРИТИЧНО: gas wallet майже пуст: ${balanceEth.toFixed(4)} ETH — бот скоро зупиниться`
);
}
}
Process supervisor: автоперезапуск
Якщо бот впав — повинен автоматично піднятись. PM2 для Node.js:
# ecosystem.config.js
module.exports = {
apps: [{
name: 'crypto-bot',
script: 'dist/bot.js',
restart_delay: 5000,
max_restarts: 10,
min_uptime: '10s', // не лічимо рестарт якщо упав раніше 10s
error_file: '/var/log/crypto-bot/error.log',
out_file: '/var/log/crypto-bot/out.log',
}]
};
pm2 start ecosystem.config.js
pm2 save # автозапуск після перезагрузки сервера
PM2 сам відправляє сповіщення через pm2-notify або інтеграцію з keymetrics. При кожному рестарті — логуємо та відправляємо алерт через Telegram.
Підсумковий чекліст алертів
- Відсутність heartbeat > 2 хвилин → критичний алерт
- Отставання від chain head > 50 блоків → критичний алерт
- Баланс gas wallet < 0.05 ETH → попередження
- N помилок підряд в обработчику → критичний алерт
- Процес перезапустився → інформаційний алерт
- RPC latency > 5 секунд → попередження







