Мониторинг ботов: Prometheus и Grafana — полное руководство из практики
Дата публикации: 2025-10-20 Автор: Bothost Team Последние три года я внедрял мониторинг для ботов в Telegram, Discord и VK — от маленьких MVP до продакшна с миллионами событий в сутки. В этой статье я покажу, как я настраиваю метрики, алерты и дашборды так, чтобы команда реагировала на инциденты за минуты, а не за часы. Мы пойдём от базовой схемы к продвинутым приёмам, которые реально экономят деньги и нервы.Содержание
- Зачем ботам мониторинг и что ломается в реальности
- Какие метрики собирать: боевой набор
- Экспорт метрик из кода: Python и Node.js
- Prometheus: сбор, ретеншн, relabel
- Grafana: дашборды, аннотации, переменные
- Alertmanager: алерты без «шума»
- Docker Compose конфигурация
- Жизненные кейсы и как я их решал
- Чек-лист внедрения
- Лучшие практики поддержки
Зачем ботам мониторинг и что ломается в реальности
Из реальных инцидентов за последний год:- Падает внешний провайдер 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 — одна из самых полезных «фич», мгновенно видно, какой деплой сломал метрики.
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против среднего за день
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 комментариев
Комментарии (0)
Пока нет комментариев. Будьте первым!