mirror of
https://github.com/FerraSoft/bottohelp.git
synced 2026-08-06 21:55:03 +00:00
278 lines
9.0 KiB
Markdown
278 lines
9.0 KiB
Markdown
# 📊 Система мониторинга ошибок
|
||
|
||
## Обзор
|
||
|
||
Система мониторинга телеграм-бота включает в себя комплексное решение для отслеживания ошибок, производительности и отправки алертов. Реализована с использованием Prometheus, Sentry и кастомной системы алертов.
|
||
|
||
## 🚀 Компоненты системы
|
||
|
||
### 1. Логирование (Structured Logging)
|
||
- **Формат**: JSON для легкого парсинга
|
||
- **Уровни**: DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||
- **Ротация**: Автоматическая ротация логов
|
||
- **Интеграция**: Отправка ERROR и выше в Sentry
|
||
|
||
### 2. Метрики (Prometheus)
|
||
- **Сервер метрик**: HTTP endpoint на порту 8000 (настраиваемо)
|
||
- **Собираемые метрики**:
|
||
- `telegram_bot_errors_total` - количество ошибок по типам
|
||
- `telegram_bot_command_duration_seconds` - время выполнения команд
|
||
- `telegram_bot_active_users` - количество активных пользователей
|
||
- `telegram_bot_messages_total` - общее количество сообщений
|
||
- `telegram_bot_api_response_time_seconds` - время отклика внешних API
|
||
- `telegram_bot_status` - статус бота (1=работает, 0=остановлен)
|
||
|
||
### 3. Мониторинг ошибок (Sentry)
|
||
- **Автоматический захват**: Все необработанные исключения
|
||
- **Performance monitoring**: Отслеживание производительности
|
||
- **Фильтрация**: Исключение тестовых данных и чувствительной информации
|
||
- **Контекст**: Добавление информации о боте и конфигурации
|
||
|
||
### 4. Система алертов (AlertManager)
|
||
- **Типы алертов**:
|
||
- Высокая частота ошибок (>10 в минуту)
|
||
- Падение бота
|
||
- Высокое время отклика (>5 секунд)
|
||
- Проблемы с подключением к БД
|
||
- **Каналы уведомлений**:
|
||
- Telegram (разработчикам)
|
||
- Email
|
||
- Webhook
|
||
|
||
## 🛠 Настройка
|
||
|
||
### 1. Установка зависимостей
|
||
|
||
```bash
|
||
pip install prometheus_client sentry-sdk
|
||
```
|
||
|
||
### 2. Конфигурация
|
||
|
||
Добавьте в `config_local.py`:
|
||
|
||
```python
|
||
# Включение мониторинга
|
||
ENABLE_SENTRY = True
|
||
SENTRY_DSN = "https://your-dsn@sentry.io/project-id"
|
||
|
||
# Настройки Prometheus
|
||
PROMETHEUS_PORT = 8000
|
||
|
||
# Уведомления разработчиков
|
||
ENABLE_DEVELOPER_NOTIFICATIONS = True
|
||
DEVELOPER_CHAT_ID = 123456789 # ID чата для алертов
|
||
```
|
||
|
||
### 3. Переменные окружения
|
||
|
||
```bash
|
||
export ENABLE_SENTRY=true
|
||
export SENTRY_DSN="https://your-dsn@sentry.io/project-id"
|
||
export PROMETHEUS_PORT=8000
|
||
export DEVELOPER_CHAT_ID=123456789
|
||
```
|
||
|
||
## 📈 Использование метрик
|
||
|
||
### Prometheus endpoint
|
||
```
|
||
http://localhost:8000/metrics
|
||
```
|
||
|
||
### Пример запросов к метрикам
|
||
|
||
```promql
|
||
# Количество ошибок в минуту
|
||
rate(telegram_bot_errors_total[1m])
|
||
|
||
# Среднее время отклика команд
|
||
rate(telegram_bot_command_duration_seconds_sum[5m]) / rate(telegram_bot_command_duration_seconds_count[5m])
|
||
|
||
# Активные пользователи
|
||
telegram_bot_active_users
|
||
|
||
# Статус бота
|
||
telegram_bot_status
|
||
```
|
||
|
||
## 🎯 Настройка алертов
|
||
|
||
### Добавление нового правила алерта
|
||
|
||
```python
|
||
from .alerts import AlertManager
|
||
|
||
# В Application или где-то еще
|
||
alert_manager = AlertManager(config, metrics)
|
||
|
||
# Добавляем новое правило
|
||
alert_manager.add_alert_rule('custom_rule', {
|
||
'enabled': True,
|
||
'threshold': 100,
|
||
'cooldown': 600, # 10 минут
|
||
'last_alert': None
|
||
})
|
||
```
|
||
|
||
### Отключение алерта
|
||
|
||
```python
|
||
alert_manager.disable_alert_rule('high_error_rate')
|
||
```
|
||
|
||
## 🔧 Интеграция в код
|
||
|
||
### Использование декораторов
|
||
|
||
```python
|
||
from core.monitoring import measure_time, error_handler
|
||
|
||
class MyHandler(BaseHandler):
|
||
@measure_time(metrics, 'weather_api')
|
||
async def call_external_api(self):
|
||
# Код API вызова
|
||
pass
|
||
|
||
@error_handler(metrics, 'my_handler')
|
||
async def risky_operation(self):
|
||
# Рискованный код
|
||
pass
|
||
```
|
||
|
||
### Ручная запись метрик
|
||
|
||
```python
|
||
# Запись ошибки
|
||
metrics.record_error('DatabaseError', 'user_handler', exception)
|
||
|
||
# Запись команды
|
||
metrics.record_command('start', 'user_handler', duration)
|
||
|
||
# Запись сообщения
|
||
metrics.record_message('text')
|
||
|
||
# Обновление активных пользователей
|
||
metrics.update_active_users(150)
|
||
```
|
||
|
||
## 📊 Grafana дашборды
|
||
|
||
### Рекомендуемые панели
|
||
|
||
1. **Обзор ошибок**
|
||
- График количества ошибок по времени
|
||
- Разбивка по типам ошибок
|
||
- Топ обработчиков с ошибками
|
||
|
||
2. **Производительность**
|
||
- Время отклика команд
|
||
- Среднее время API вызовов
|
||
- Загрузка системы
|
||
|
||
3. **Активность пользователей**
|
||
- Количество активных пользователей
|
||
- Общее количество сообщений
|
||
- Топ команд
|
||
|
||
4. **Системные метрики**
|
||
- Статус бота
|
||
- Использование памяти/CPU
|
||
- Состояние подключений
|
||
|
||
### Пример конфигурации datasource
|
||
|
||
```json
|
||
{
|
||
"name": "Telegram Bot Prometheus",
|
||
"type": "prometheus",
|
||
"url": "http://localhost:8000",
|
||
"access": "proxy"
|
||
}
|
||
```
|
||
|
||
## 🧪 Тестирование
|
||
|
||
### Запуск тестов мониторинга
|
||
|
||
```bash
|
||
pytest tests/test_monitoring.py -v
|
||
```
|
||
|
||
### Имитация ошибок для тестирования
|
||
|
||
```python
|
||
# В коде для тестирования
|
||
import time
|
||
|
||
async def test_error_scenario():
|
||
# Имитация медленного ответа
|
||
await asyncio.sleep(6) # > 5 секунд для триггера алерта
|
||
|
||
# Имитация ошибки
|
||
raise ValueError("Test error for monitoring")
|
||
```
|
||
|
||
## 🚨 Troubleshooting
|
||
|
||
### Проблемы с Prometheus
|
||
|
||
1. **Метрики не собираются**
|
||
- Проверьте порт 8000
|
||
- Убедитесь, что `prometheus_client` установлен
|
||
|
||
2. **Высокая нагрузка**
|
||
- Уменьшите частоту сбора метрик
|
||
- Используйте sampling для высоконагруженных endpoint'ов
|
||
|
||
### Проблемы с Sentry
|
||
|
||
1. **Ошибки не отправляются**
|
||
- Проверьте SENTRY_DSN
|
||
- Убедитесь, что ENABLE_SENTRY=true
|
||
- Проверьте сетевые настройки
|
||
|
||
2. **Слишком много событий**
|
||
- Настройте фильтры в `_before_send_sentry`
|
||
- Увеличьте `traces_sample_rate`
|
||
|
||
### Проблемы с алертами
|
||
|
||
1. **Алерты не приходят**
|
||
- Проверьте DEVELOPER_CHAT_ID
|
||
- Убедитесь, что бот имеет права отправки сообщений
|
||
|
||
2. **Слишком много алертов**
|
||
- Увеличьте cooldown в правилах
|
||
- Настройте пороги срабатывания
|
||
|
||
## 📋 TODO для продакшена
|
||
|
||
- [ ] Настроить мониторинг ресурсов сервера (CPU, память, диск)
|
||
- [ ] Добавить health checks endpoint
|
||
- [ ] Интегрировать с внешними системами мониторинга
|
||
- [ ] Настроить retention политику для метрик и логов
|
||
- [ ] Добавить A/B тестирование алертов
|
||
- [ ] Создать runbook для реагирования на алерты
|
||
|
||
## 🤝 Вклад в развитие
|
||
|
||
При добавлении новых метрик или алертов:
|
||
|
||
1. Добавьте описание в эту документацию
|
||
2. Обновите тесты
|
||
3. Убедитесь в обратной совместимости
|
||
4. Протестируйте в staging окружении
|
||
|
||
## 📞 Поддержка
|
||
|
||
При проблемах с системой мониторинга:
|
||
|
||
1. Проверьте логи в `bot.log`
|
||
2. Посмотрите метрики в Prometheus
|
||
3. Проверьте настройки в Sentry
|
||
4. Обратитесь к разработчикам
|
||
|
||
---
|
||
|
||
*Последнее обновление: Октябрь 2025* |