Мониторинг ботов: Prometheus и Grafana — полное руководство из практики

Дата публикации: 2025-10-20 Автор: Bothost Team Последние три года я внедрял мониторинг для ботов в Telegram, Discord и VK — от маленьких MVP до продакшна с миллионами событий в сутки. В этой статье я покажу, как я настраиваю метрики, алерты и дашборды так, чтобы команда реагировала на инциденты за минуты, а не за часы. Мы пойдём от базовой схемы к продвинутым приёмам, которые реально экономят деньги и нервы.

Содержание

Зачем ботам мониторинг и что ломается в реальности

Из реальных инцидентов за последний год:
  • Падает внешний провайдер AI — бот начинает отвечать с задержкой 10–20 секунд, пользователи уходят. Мы ловим рост p95 латентности и переключаемся на резервную модель.
  • Блокируется вебхук из-за неверного SSL — входящие события перестают приходить. Мониторинг видит падение входящих сообщений/мин и отправляет алерт.
  • Вылетает Redis — сессии не восстанавливаются, растёт процент ошибок аутентификации. По error rate мы накатываем hotfix и переводим на отдельный кластер.
Вывод: без прозрачных метрик по входящим сообщениям, задержкам, ошибкам и ресурсам контейнеров вы реагируете вслепую.

Какие метрики собирать: боевой набор

  • Трафик: bot_messages_total, bot_updates_per_min
  • Латентность: bot_request_latency_seconds (p50/p90/p95/p99)
  • Ошибки: bot_errors_total с метками provider, endpoint, code
  • Внешние API: ai_tokens_used_total, ai_cost_usd_total
  • Ресурсы: CPU/RAM контейнеров, дескрипторы, сеть
  • Здоровье: проверки вебхуков, БД, кэша, диска

Экспорт метрик из кода: Python и Node.js

# Python (prometheus_client)
from prometheus_client import Counter, Histogram, Gauge, start_http_server

MESSAGES_TOTAL = Counter("bot_messages_total", "Total messages processed", ["channel"])
REQUEST_LATENCY = Histogram("bot_request_latency_seconds", "Request latency", buckets=[0.1,0.3,0.5,1,2,5])
ERRORS_TOTAL = Counter("bot_errors_total", "Errors by type", ["provider","code"])
HEALTH = Gauge("bot_health", "0=down,1=up", ["component"])  # component: webhook,db,redis

if __name__ == "__main__":
    start_http_server(9100)  # экспонируем /metrics
// Node.js (prom-client)
const client = require('prom-client')
const register = new client.Registry()

const messagesTotal = new client.Counter({ name: 'bot_messages_total', help: 'Total messages', labelNames: ['channel'] })
const latency = new client.Histogram({ name: 'bot_request_latency_seconds', help: 'Latency', buckets: [0.1,0.3,0.5,1,2,5] })
const errorsTotal = new client.Counter({ name: 'bot_errors_total', help: 'Errors', labelNames: ['provider','code'] })

register.registerMetric(messagesTotal)
register.registerMetric(latency)
register.registerMetric(errorsTotal)
client.collectDefaultMetrics({ register })

// Пример использования
function handleMessage(ctx){
  const end = latency.startTimer()
  try {
    // ... обработка
    messagesTotal.labels('telegram').inc()
  } catch (e) {
    errorsTotal.labels('openai', e.code || 'unknown').inc()
  } finally {
    end()
  }
}

Prometheus: сбор, ретеншн, relabel

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'bots'
    static_configs:
      - targets: ['bot:9100']
    relabel_configs:
      - source_labels: [__address__]
        regex: "(.):."
        target_label: instance
        replacement: "$1"
  • Ретеншн для MVP: 15–30 дней; для продакшна: 60–90 дней (или remote_write в VictoriaMetrics/Thanos).
  • Храните p95, error_rate и критичные бизнес-метрики дольше — это ценно для трендов.

Grafana: дашборды, аннотации, переменные

  • Дашборды: «Здоровье», «Производительность», «Ошибки», «Стоимость AI»
  • Переменные: instance, channel, provider
  • Аннотации: релизы из CI/CD — одна из самых полезных «фич», мгновенно видно, какой деплой сломал метрики.
Пример запроса p95:
histogram_quantile(0.95, sum(rate(bot_request_latency_seconds_bucket[5m])) by (le))

Alertmanager: алерты без «шума»

Мои базовые правила:
  • Availability: падение bot_health{component="webhook"} до 0 > 2 мин
  • Performance: рост p95 > 2с 5 мин подряд
  • Errors: increase(bot_errors_total[5m]) > N по провайдерам
  • Business: резкое падение bot_messages_total против среднего за день
Эскалации: Telegram/Slack → дежурный инженер → on-call. Важна «тишина»: лучше 5 продуманных алертов, чем 50 бессмысленных.

Docker Compose конфигурация

version: '3.9'
services:
  bot:
    image: my-bot:latest
    ports:
      - "9100:9100"  # метрики
    environment:
      - ENABLE_METRICS=true
    restart: unless-stopped

  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    restart: unless-stopped

Жизненные кейсы и как я их решал

  • Кейс 1: «Ночные зависания». p95 скакал до 8–12 секунд. Аналитика показала, что в это время обучался соседний сервис на том же узле. Решение: ограничение CPU для соседей + autoscaling бота. В итоге p95 стабилизировался на 300–400 мс.
  • Кейс 2: «Тихая смерть вебхука». Никаких ошибок в логах, но входящих сообщений стало в 10 раз меньше. Алерт на падение входящего трафика сработал через 3 минуты — виноват просроченный SSL. Автопродление + алерт на срок действия сертификата.
  • Кейс 3: «Счёт за AI улетел в космос». Метрики ai_tokens_used_total и ai_cost_usd_total позволили быстро заметить рост. Ввели кэширование FAQ и nightly retraining prompts — снизили стоимость на 62% без падения качества.

Чек-лист внедрения

  • [ ] Экспортируем базовые метрики, открываем /metrics
  • [ ] Настраиваем Prometheus, ретеншн, безопасный доступ
  • [ ] Дашборды Grafana с p95/p99, error rate, входящим трафиком
  • [ ] Alertmanager: 5–7 ключевых алертов + эскалации
  • [ ] Документируем SLO: цели по аптайму и латентности
  • [ ] Еженедельный разбор трендов и инцидентов

Лучшие практики поддержки

  • Метрики — часть Definition of Done. Любой новый эндпоинт должен быть «виден» на дашбордах.
  • Собирайте cost-метрики по AI: легко терять деньги незаметно.
  • Аннотируйте релизы. Без этого поиск регрессий — гадание.
  • Учите команду читать графики: это снижает MTTR в 2–3 раза.

Связанные статьи:

220 просмотров
0 лайков
0 комментариев