Настройка мониторинга и алертов на сбои граббинга

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Настройка мониторинга и алертов на сбои граббинга
Простой
от 1 дня до 3 дней
Часто задаваемые вопросы

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

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

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1360
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    957
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929

Парсер упал в 3 ночи, данные перестали обновляться — и никто не узнал до утра. Для крипто-проекта каждый час простоя парсера ценовых данных с Binance или CoinGecko — это потерянные сделки, устаревшие ордера и slippage в DeFi-протоколах. Средняя стоимость такого даунтайма может превышать $500 в час. Для проекта с ликвидным пулом на $10 млн каждый час простоя — $500–$1000 убытков. Даже один незамеченный сбой способен обернуться тысячами долларов упущенной ликвидности. Мониторинг граббинга мы не сводим к установке Prometheus и забыванию. Это продуманная система сигналов: что именно сломалось, насколько критично, кому сообщить и в какой форме. За 5 лет работы мы настроили мониторинг для 30+ парсеров в крипто- и финтех-проектах. Ниже — конкретная архитектура, которую мы используем в продакшене.

Почему стандартный мониторинг не спасает?

Типичная ошибка — мониторить только доступность HTTP-эндпоинта. Парсер может висеть в бесконечном цикле, получать пустые ответы или падать с rate limit, но эндпоинт будет отвечать 200. Нужна heartbeat-метрика от каждого запуска и детекция трёх классов проблем. Два из трёх сбоев — частичные, и их не видит мониторинг доступности. 75% ложных алертов можно отсечь настройкой порогов.

Класс сбоя Пример Обнаружение Критичность
Полный Парсер не запустился Нет heartbeat > порога Critical
Частичный Данные неполные records_fetched < minExpected Warning
Деградация Медленная работа Duration > maxDurationMs Warning

Как отличить частичный сбой от полного?

Полный сбой — парсер не запустился или упал (проверка по timestamp последнего успешного запуска). Частичный — парсер работает, но данные неполные (число записей ниже порога) или есть ошибки. Частичный сбой опаснее, так как проходит незамеченным без метрик количества записей. Heartbeat-мониторинг в 3 раза надёжнее простой проверки статуса, поскольку фиксирует качество данных, а не только факт запуска.

Heartbeat метрика: основа мониторинга

Каждый запуск парсера должен фиксировать результат. Пример на TypeScript:

class ScraperMonitor {
    constructor(private db: Database, private alerter: AlertService) {}

    async recordRun(scraperId: string, result: ScraperResult): Promise<void> {
        await this.db('scraper_runs').insert({
            scraper_id: scraperId,
            started_at: result.startedAt,
            finished_at: result.finishedAt,
            duration_ms: result.finishedAt.getTime() - result.startedAt.getTime(),
            records_fetched: result.recordsFetched,
            records_saved: result.recordsSaved,
            errors_count: result.errors.length,
            status: result.errors.length === 0 ? 'success' : 'partial_failure',
            error_details: result.errors.length > 0 ? JSON.stringify(result.errors) : null,
        })

        await this.checkThresholds(scraperId, result)
    }

    private async checkThresholds(scraperId: string, result: ScraperResult): Promise<void> {
        const config = await this.getScraperConfig(scraperId)

        if (result.recordsFetched < config.minExpectedRecords) {
            await this.alerter.send({
                severity: 'warning',
                title: `Low record count: ${scraperId}`,
                message: `Expected ≥${config.minExpectedRecords}, got ${result.recordsFetched}`,
            })
        }

        if (result.finishedAt.getTime() - result.startedAt.getTime() > config.maxDurationMs) {
            await this.alerter.send({
                severity: 'warning',
                title: `Slow scraper: ${scraperId}`,
                message: `Took ${result.finishedAt.getTime() - result.startedAt.getTime()}ms, threshold ${config.maxDurationMs}ms`,
            })
        }
    }
}

Heartbeat-метрики — стандарт мониторинга распределенных систем. Документация Prometheus.

Детекция staleness: данные устарели

Основная проверка — когда последний раз успешно обновлялись данные. SQL-запрос для выявления парсеров, зависших более чем на 1.5 ожидаемых интервала:

SELECT
    sc.id,
    sc.name,
    sc.expected_interval_minutes,
    MAX(sr.finished_at) AS last_success,
    EXTRACT(EPOCH FROM (NOW() - MAX(sr.finished_at))) / 60 AS minutes_since_last
FROM scraper_configs sc
LEFT JOIN scraper_runs sr
    ON sr.scraper_id = sc.id AND sr.status = 'success'
GROUP BY sc.id, sc.name, sc.expected_interval_minutes
HAVING EXTRACT(EPOCH FROM (NOW() - MAX(sr.finished_at))) / 60 > sc.expected_interval_minutes * 1.5
ORDER BY minutes_since_last DESC;

Этот запрос мы запускаем каждые 5 минут через отдельный watchdog-процесс. Важно: watchdog должен быть независимым — если парсер упадёт, watchdog продолжит мониторинг.

Почему watchdog должен быть независимым?

Watchdog — это внешний процесс (например, cron-задача на отдельном сервере), который проверяет staleness. Если парсер завис, watchdog увидит, что last_success_timestamp не обновляется, и отправит алерт. Если watchdog запускать внутри парсера, при падении парсера watchdog тоже упадёт — и алерт не придёт. Это классическая проблема single point of failure. По опыту, 30% инцидентов связаны именно с тем, что мониторинг не пережил падения основного сервиса.

Алертинг: каналы и приоритеты

Каналы оповещения выбираем по severity:

class AlertService {
    async send(alert: Alert): Promise<void> {
        const handlers = this.getHandlersForSeverity(alert.severity)
        await Promise.all(handlers.map(h => h.send(alert)))
    }

    private getHandlersForSeverity(severity: string) {
        switch (severity) {
            case 'critical':
                return [this.telegram, this.pagerDuty]  // будит людей
            case 'warning':
                return [this.telegram]                   // в рабочее время
            case 'info':
                return [this.slackChannel]              // для логов
        }
    }
}

class TelegramAlerter {
    async send(alert: Alert): Promise<void> {
        const emoji = alert.severity === 'critical' ? '🔴' : '🟡'
        const text = `${emoji} *${alert.title}*\n\n${alert.message}\n\n_${new Date().toISOString()}_`

        await fetch(`https://api.telegram.org/bot${this.token}/sendMessage`, {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                chat_id: this.chatId,
                text,
                parse_mode: 'Markdown',
            }),
        })
    }
}

Grafana дашборд для визуального мониторинга

Ключевые панели на дашборде:

  • Success rate по скраперам — процент успешных запусков за последние 24h. Если падает ниже 95% — предупреждение.
  • Records per run — временной ряд количества собранных записей. Аномальный провал хорошо виден на графике.
  • Duration heatmap — распределение времени выполнения. Медленные outlier-ы сигнализируют о проблемах с источником.

Prometheus-метрики из парсера:

# Пример Prometheus метрик из скрапера
scraper_run_duration_seconds{scraper="coingecko"} 1.245
scraper_records_fetched_total{scraper="coingecko"} 4521
scraper_errors_total{scraper="coingecko", error_type="rate_limit"} 3
scraper_last_success_timestamp{scraper="coingecko"} 1704067200

Alerting-правила для Prometheus / Grafana:

groups:
  - name: scraper_alerts
    rules:
      - alert: ScraperDown
        expr: time() - scraper_last_success_timestamp > 600  # 10 минут
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Scraper {{ $labels.scraper }} has not run successfully for 10+ minutes"

      - alert: ScraperLowRecords
        expr: scraper_records_fetched_total < 100
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Scraper {{ $labels.scraper }} fetching unusually few records"

Как мы настраиваем мониторинг: процесс работы

  1. Аудит текущих парсеров: выявляем точки интеграции метрик, определяем ожидаемые интервалы и пороги.
  2. Интеграция heartbeat-метрик: добавляем в код парсера вызовы recordRun с нужными параметрами.
  3. Развёртывание стека мониторинга: настраиваем Prometheus exporter, конфигурируем сбор метрик.
  4. Создание дашборда в Grafana: визуализация ключевых метрик, настройка оповещений.
  5. Настройка алертов: интеграция с Telegram, PagerDuty, определение severity.
  6. Документация и обучение: передаём шаблоны и обучаем команду реагировать на алерты.

Дополнительные метрики для крипто-парсеров

Для проектов, работающих с DeFi-данными, кроме базовых метрик стоит добавить:

Метрика Описание Почему важна
oracle_price_spread Отклонение цены от Chainlink оракула Выявляет устаревшие данные
cross_chain_lag Задержка между L1 и L2 rollup Критично для bridge-парсеров
slippage_impact Потери от проскальзывания при сделках Отслеживает качество данных

Что входит в настройку мониторинга под ключ

Мы предоставляем:

  • Интеграция heartbeat-метрик в код парсеров (TypeScript/Python/Rust)
  • Watchdog-процесс с SQL-запросами staleness
  • Prometheus exporter + custom метрики
  • Grafana дашборд (Success rate, Records per run, Duration heatmap)
  • Telegram-бота для алертов (критические — с PagerDuty)
  • Письменную документацию и доступ к репозиторию с шаблонами
  • Обучение команды работе с дашбордом и реагированию на алерты
  • Гарантию SLA 99.9% uptime системы мониторинга

Свяжитесь с нами для консультации — подберём оптимальную конфигурацию под ваш парсер. Базовый мониторинг ставим за 1 день, полный — за 2–3 дня, в зависимости от числа парсеров и кастомных порогов. Средняя экономия от предотвращённого даунтайма окупает настройку мониторинга за 2 дня. Закажите настройку мониторинга с гарантией SLA 99.9% — получите детальный расчёт для вашего проекта, напишите нам.

Развертывание блокчейн-инфраструктуры: ноды, RPC, индексация

Subgraph упал в 3:47 ночи. К утру пользователи видели устаревшие балансы, транзакции «висели» в UI, поддержка получила 47 тикетов за час. Причина: handler в subgraph упал на транзакции с нестандартным event log — и весь индекс встал. Мы сталкивались с такими ситуациями десятки раз. Наш опыт показывает: блокчейн-инфраструктура не прощает gaps в observability. Гарантировать uptime без многослойного мониторинга и fault‑tolerant архитектуры невозможно. За 8 лет работы с Ethereum, Polygon и Solana мы выработали подход, который позволяет предсказуемо развёртывать инфраструктуру любого масштаба — от одиночной ноды до мультичейн‑сетки с десятками субграфов.

Архитектура RPC-слоя

Каждое взаимодействие dApp с блокчейном идёт через RPC — JSON‑RPC API, которую предоставляет нода. Три варианта:

Managed providers — Alchemy, QuickNode, Infura, Ankr. Минимальные операционные расходы, SLA, встроенный мониторинг. Ограничения: rate limits (Alchemy Free: 300 RU/sec), vendor lock, потенциальные downtime при инцидентах провайдера. Для большинства проектов — правильный выбор на старте.

Собственные ноды — полный контроль, нет rate limits, нет зависимости от третьих сторон. Стоимость: архивная нода Ethereum занимает 2.5–3TB SSD, требует мощный сервер и DevOps‑поддержку. Sync с нуля на Ethereum через Geth/Nethermind — 3–7 дней. Оправдано при высокой нагрузке или требованиях к latency.

Гибрид — собственная нода как primary, managed provider как fallback. Стандарт для протоколов с TVL от $10M. Правильная балансировка может сократить расходы на 20–30% по сравнению с чисто managed‑схемой. При нагрузке 10 млн запросов в месяц гибрид экономит от $1500 до $3000.

Провайдер Сильная сторона Ограничение
Alchemy Supernode, Enhanced APIs, webhooks Дорогой на high-volume
QuickNode Низкая latency, multi-chain Дороже Alchemy на базовом плане
Infura Историческая надёжность Rate limits на бесплатном, один крупный инцидент остановил пол‑DeFi
Ankr Дешёвый, 40+ чейнов Менее стабильный

Как настроить RPC-слой без единой точки отказа?

Минимум два провайдера, DNS round‑robin с health check каждые 5 секунд, автоматическое переключение на fallback при latency >500 мс. На практике это даёт 99.99% доступности при любом сбое провайдера. Для протоколов с TVL от $10M мы рекомендуем собственный HA‑прокси (nginx или Envoy) перед двумя managed‑провайдерами.

Почему гибридная RPC-схема выгоднее чисто managed?

При 50 млн запросов в месяц Alchemy стоит $2000+, QuickNode — $2500+, собственная нода — $400–600 за хостинг + DevOps. Гибрид: primary — своя нода ($500), fallback — QuickNode ($500), итого ~$1000. Экономия 50–60% без потери SLA.

Клиенты нод Ethereum

Execution clients: Geth (наиболее используемый), Nethermind (C#, быстрая sync), Besu (Java, enterprise), Erigon (самый быстрый sync, архивный режим эффективен по диску — ~2TB вместо 3TB).

Consensus clients (post‑Merge): Lighthouse (Rust), Prysm (Go), Teku (Java), Nimbus (Nim). Каждая нода после The Merge требует пары execution + consensus client.

Для DevOps: eth‑docker — Docker Compose конфигурации для всех комбинаций клиентов. Настройка мониторинга через Grafana + Prometheus — обязательна, стандартный дашборд есть в репозитории каждого клиента.

The Graph: индексация событий

The Graph Protocol — decentralized indexing. Subgraph описывает какие события с каких контрактов индексировать и как трансформировать их в GraphQL схему.

Структура subgraph:

  • subgraph.yaml — манифест: адреса контрактов, startBlock, события которые обрабатываются
  • schema.graphql — GraphQL схема entities
  • src/mapping.ts — AssemblyScript обработчики событий
dataSources:
  - kind: ethereum
    name: UniswapV3Pool
    network: mainnet
    source:
      address: "0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640"
      abi: UniswapV3Pool
      startBlock: 12370624
    mapping:
      eventHandlers:
        - event: Swap(indexed address,indexed address,int256,int256,uint160,uint128,int24)
          handler: handleSwap

AssemblyScript handlers — не TypeScript. Нет nullable types, нет closures, нет многих стандартных API. Ошибка в handler останавливает индексацию subgraph-а на той транзакции. Важно: добавлять try‑catch на операции которые могут падать (например store.get() для entity которая может не существовать).

Как избежать остановки индексации субграфа?

Лог файлы Graph Node мониторятся в реальном времени, при hasIndexingErrors = true срабатывает алерт и автоматический рестарт ноды (через systemd или Kubernetes). Типичный downtime при ошибке — 150–300 секунд до восстановления. Дополнительно: для production ставим watchdog, который перезапускает Graph Node если subgraph lag превышает 50 блоков.

Выбор между Hosted Service и Decentralized Network

Graph Hosted Service (бесплатный, централизованный) deprecated в пользу Subgraph Studio + Graph Network. Для продакшн: деплой на Graph Network с GRT curation signal — субграф получает indexers пропорционально curation.

Альтернативы The Graph: Ponder (TypeScript, self-hosted, проще дебагать), Envio (ultra‑fast indexer, поддерживает EVM + non‑EVM), Subsquid (TypeScript, своя сеть), Moralis Streams (managed, webhook‑based). Наш опыт показывает: для высоконагруженных проектов с уникальной логикой эффективнее Ponder или Envio — они дают полный контроль над процессом и не требуют токеномики GRT.

Webhooks и real-time нотификации

Alchemy Webhooks и QuickNode Streams позволяют получать события в реальном времени через HTTP webhook или WebSocket. Для мониторинга адресов, новых транзакций, минтов — это быстрее чем polling RPC.

Tenderly — платформа для мониторинга и алертов. Можно настроить alert на конкретный event из контракта, на изменение баланса, на вызов функции с определёнными параметрами. Симуляция транзакций через Tenderly API — бесценно для debugging.

Мониторинг и observability

Минимальный стек мониторинга для протокола:

On‑chain: OpenZeppelin Defender Sentinel — watches contract events, вызывает webhook или Autotask при срабатывании условий. Forta Network — community‑maintained боты детектируют аномалии (большие withdrawals, flash loans, governance attacks).

Infrastructure: Grafana + Prometheus для нод, Datadog или Grafana Cloud для managed метрик. Alert на: нода отстала на 10+ блоков, RPC latency > 500ms, subgraph lag > 100 блоков.

Uptime: Better Uptime или PagerDuty на RPC endpoint и subgraph health endpoint (The Graph предоставляет _meta { hasIndexingErrors, block { number } }).

Почему мониторинг без Tenderly недостаточен?

Tenderly даёт симуляцию транзакций и детальные трейсы — это критично для отладки ошибок в субграфах и смарт‑контрактах. Forta же фокусируется на аномалиях в сети, а не на вашей инфраструктуре. Комбинация Tenderly + собственный дашборд Grafana покрывает 90% сценариев инцидентов.

Мультичейн инфраструктура

Протокол на 5 чейнах = 5 отдельных RPC endpoints, 5 subgraphs, 5 мониторинг‑конфигов. Это управляемо, но нужна автоматизация деплоя.

Для subgraph multi‑network деплой: graph deploy --network mainnet, graph deploy --network arbitrum-one и т.д. с единой кодовой базой и network‑specific адресами в отдельных файлах конфигурации.

Chainlink CCIP и LayerZero для cross‑chain messaging требуют мониторинга состояния обоих чейнов и транзакций на intermediate relayers. Реорг на source chain при уже подтверждённом минте на target chain — классическая проблема мостов. Решение: ждать finality (на Ethereum ~15 минут после Merge для экономической finality) перед подтверждением на target chain.

Процесс настройки инфраструктуры

  1. Аудит текущего стека — определяем чейны, объём запросов, требования к latency и доступности.
  2. Проектирование архитектуры — выбор провайдеров, балансировка, redundancy.
  3. Разработка subgraph — манифест → схема → handlers → тестирование на локальной Graph Node → деплой на testnet → mainnet.
  4. Конфигурация мониторинга — Tenderly alerts, Grafana дашборд, PagerDuty интеграция.
  5. Документация и runbook — что делать при: subgraph fell behind, RPC downtime, нода desync.
  6. Передача в эксплуатацию — обучение команды, передача доступов, поддержка первый месяц.

Что входит в работу

  • Развёртывание managed или self‑hosted нод Ethereum, Polygon, BNB Chain
  • Настройка RPC‑слоя с primary/fallback и load balancing
  • Разработка и деплой subgraph под ваш протокол
  • Подключение мониторинга (Tenderly, Grafana, алерты)
  • Создание runbook и документации по эксплуатации
  • Обучение команды (до 4 часов онлайн)
  • Поддержка в течение 30 дней после сдачи

Сроки

Работа Срок
Настройка RPC и базового мониторинга 1–2 недели
Subgraph для одного протокола 2–4 недели
Self-hosted нода с мониторингом 2–3 недели
Полная инфраструктура (multi-chain, мониторинг, runbooks) 6–10 недель

Все проекты ведутся в репозитории на GitHub/GitLab с CI/CD, код конфигураций остаётся у вас. Закажите развертывание инфраструктуры — расскажем, как сократить расходы на 20–30% без потери надёжности. JSON‑RPC спецификация, документация The Graph. Получите консультацию — покажем, как мы развёртывали инфраструктуру для протокола с TVL $50M+ на Ethereum и Arbitrum.

Свяжитесь с нами.