Налаштування сповіщень про збої криптобота

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Налаштування сповіщень про збої криптобота
Простий
~1 день
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1307
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1219
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    921
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1148
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    611
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    886

Налаштування сповіщень про збої крипто-бота

Крипто-бот упав в 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 секунд → попередження