Remove .env_example file and implement MetricsUpdater service for enhanced metrics tracking. Update bot.py to start and stop metrics updater, and improve database connection handling in CRUD operations with metrics tracking. Update README with details on metrics issues and fixes.
This commit is contained in:
189
README.md
189
README.md
@@ -1300,6 +1300,195 @@ ports:
|
||||
- Использовать reverse proxy с аутентификацией
|
||||
- Настроить TLS для HTTPS
|
||||
|
||||
## 🔧 Исправление проблем с метриками
|
||||
|
||||
### 🔍 Найденные проблемы
|
||||
|
||||
В дашбордах Grafana не отображались следующие метрики:
|
||||
- Database Connections - Active
|
||||
- Database Performance - Query Duration
|
||||
- Active Questions
|
||||
- Active Users
|
||||
- Answers per Minute
|
||||
- Live Activity - Active Users
|
||||
|
||||
### 🛠️ Внесенные исправления
|
||||
|
||||
#### 1. Создан сервис MetricsUpdater (`services/infrastructure/metrics_updater.py`)
|
||||
|
||||
**Исправление циклической зависимости**: Первоначально возникла циклическая зависимость между `metrics_updater.py` и `dependencies.py`. Проблема была решена путем:
|
||||
- Удаления импорта `get_database_service` из `dependencies`
|
||||
- Передачи пути к БД напрямую в конструктор `MetricsUpdater`
|
||||
- Создания собственного экземпляра `DatabaseService` внутри `MetricsUpdater`
|
||||
|
||||
**Исправление использования логгера**: Первоначально использовался `loguru` напрямую, но в проекте уже есть настроенная система логирования. Исправлено:
|
||||
- Заменен `from loguru import logger` на `from .logger import get_logger`
|
||||
- Используется `self.logger = get_logger(__name__)` в конструкторе
|
||||
- Все вызовы `logger` заменены на `self.logger`
|
||||
|
||||
**Проблема**: Методы `set_active_users()` и `set_active_questions()` были определены в `MetricsService`, но нигде не вызывались.
|
||||
|
||||
**Решение**: Создан сервис `MetricsUpdater`, который:
|
||||
- Периодически обновляет количество активных пользователей (за последние 24 часа)
|
||||
- Периодически обновляет количество активных вопросов (статус pending/processing)
|
||||
- Обновляет метрики соединений с БД
|
||||
- Запускается автоматически при старте бота
|
||||
|
||||
#### 2. Создан декоратор для метрик БД (`services/infrastructure/db_metrics_decorator.py`)
|
||||
|
||||
**Проблема**: Методы `record_db_connection()` и `record_db_query()` были определены, но не интегрированы в код БД.
|
||||
|
||||
**Решение**: Создан декоратор `track_db_operation`, который:
|
||||
- Автоматически записывает время выполнения операций БД
|
||||
- Отслеживает успешные и неудачные операции
|
||||
- Записывает метрики соединений с БД
|
||||
- Использует существующую систему логирования проекта
|
||||
|
||||
**Интеграция декораторов**: Для избежания циклических зависимостей создан патч `crud_metrics_patch.py`:
|
||||
- Применяет декораторы к CRUD операциям после их импорта
|
||||
- Автоматически активируется при импорте модуля
|
||||
- Покрывает основные операции: INSERT, SELECT, UPDATE для users и questions
|
||||
- **Исправлено**: Убрано применение `track_db_connection` к `@asynccontextmanager` методам (ошибка `__aenter__`)
|
||||
|
||||
#### 3. Обновлен bot.py
|
||||
|
||||
**Изменения**:
|
||||
- Добавлен запуск `MetricsUpdater` при старте бота
|
||||
- Добавлена остановка `MetricsUpdater` при завершении работы
|
||||
- Передача пути к БД в `MetricsUpdater`: `config.DATABASE_PATH`
|
||||
- Интервал обновления метрик: 30 секунд
|
||||
|
||||
#### 4. Обновлен __init__.py
|
||||
|
||||
**Изменения**:
|
||||
- Добавлен экспорт новых сервисов и декораторов
|
||||
- Обновлен список `__all__`
|
||||
|
||||
### 📊 Ожидаемые результаты
|
||||
|
||||
После внесения исправлений в дашбордах Grafana должны отображаться:
|
||||
|
||||
#### AnonBot Overview:
|
||||
- ✅ **Active Users** - количество активных пользователей за 24 часа
|
||||
- ✅ **Active Questions** - количество активных вопросов (pending/processing)
|
||||
- ✅ **Live Activity - Active Users** - то же значение, что и Active Users
|
||||
- ✅ **Answers per Minute** - скорость отправки ответов
|
||||
|
||||
#### Performance AnonBot:
|
||||
- ✅ **Database Connections - Active** - количество активных соединений с БД
|
||||
- ✅ **Database Performance - Query Duration** - время выполнения запросов к БД
|
||||
|
||||
#### Server Monitoring:
|
||||
- ✅ **AnonBot System Health** - активные пользователи
|
||||
- ✅ **AnonBot Active Questions** - активные вопросы
|
||||
- ✅ **AnonBot Database Connections** - соединения с БД
|
||||
|
||||
### 🚀 Развертывание исправлений
|
||||
|
||||
1. **Перезапустите AnonBot**:
|
||||
```bash
|
||||
docker-compose restart anon-bot
|
||||
```
|
||||
|
||||
2. **Проверьте логи**:
|
||||
```bash
|
||||
docker-compose logs -f anon-bot
|
||||
```
|
||||
|
||||
Должны появиться сообщения:
|
||||
```
|
||||
📊 Запуск обновления метрик...
|
||||
📊 MetricsUpdater запущен с интервалом 30 секунд
|
||||
```
|
||||
|
||||
3. **Проверьте метрики**:
|
||||
```bash
|
||||
curl http://localhost:8081/metrics | grep anon_bot_active
|
||||
```
|
||||
|
||||
4. **Проверьте в Grafana**:
|
||||
- Откройте дашборды AnonBot
|
||||
- Дождитесь обновления данных (до 30 секунд)
|
||||
- Проверьте отображение метрик
|
||||
|
||||
### 🔧 Дополнительные настройки
|
||||
|
||||
#### Изменение интервала обновления метрик
|
||||
|
||||
В файле `bot.py` можно изменить интервал обновления:
|
||||
|
||||
```python
|
||||
# Текущий интервал: 30 секунд
|
||||
await start_metrics_updater(update_interval=30)
|
||||
|
||||
# Для более частого обновления (например, 10 секунд):
|
||||
await start_metrics_updater(update_interval=10)
|
||||
```
|
||||
|
||||
#### Добавление метрик БД в CRUD операции
|
||||
|
||||
Для автоматического сбора метрик БД в CRUD операциях добавьте декоратор:
|
||||
|
||||
```python
|
||||
from services.infrastructure import track_db_operation
|
||||
|
||||
@track_db_operation("SELECT", "users")
|
||||
async def get_user(self, user_id: int):
|
||||
# код метода
|
||||
pass
|
||||
```
|
||||
|
||||
### 📈 Мониторинг
|
||||
|
||||
После внесения исправлений рекомендуется настроить алерты:
|
||||
|
||||
1. **Низкая активность пользователей**: `anon_bot_active_users < 1`
|
||||
2. **Много активных вопросов**: `anon_bot_active_questions > 100`
|
||||
3. **Проблемы с БД**: `anon_bot_db_connections_active == 0`
|
||||
4. **Высокое время ответа БД**: `histogram_quantile(0.95, rate(anon_bot_db_query_duration_seconds_bucket[5m])) > 1`
|
||||
|
||||
### 🐛 Troubleshooting
|
||||
|
||||
#### Ошибка циклической зависимости
|
||||
|
||||
**Проблема**: `ImportError: cannot import name 'get_database_service' from partially initialized module 'dependencies'`
|
||||
|
||||
**Решение**: Проблема была исправлена в версии 2.0 исправлений:
|
||||
- Удален импорт `get_database_service` из `metrics_updater.py`
|
||||
- Добавлен параметр `db_path` в конструктор `MetricsUpdater`
|
||||
- `DatabaseService` создается внутри `MetricsUpdater` с переданным путем к БД
|
||||
|
||||
#### Метрики не обновляются
|
||||
|
||||
1. Проверьте логи AnonBot:
|
||||
```bash
|
||||
docker-compose logs anon-bot | grep -i metrics
|
||||
```
|
||||
|
||||
2. Проверьте доступность эндпоинта:
|
||||
```bash
|
||||
curl http://localhost:8081/metrics
|
||||
```
|
||||
|
||||
3. Проверьте конфигурацию Prometheus:
|
||||
```bash
|
||||
curl http://localhost:9090/api/v1/targets | grep anon-bot
|
||||
```
|
||||
|
||||
#### Ошибки в логах
|
||||
|
||||
Если появляются ошибки типа "Database connection failed", проверьте:
|
||||
- Доступность базы данных
|
||||
- Правильность пути к БД в конфигурации
|
||||
- Права доступа к файлу БД
|
||||
|
||||
#### Нулевые значения в дашбордах
|
||||
|
||||
Если метрики отображаются, но имеют нулевые значения:
|
||||
- Убедитесь, что в БД есть данные (пользователи, вопросы)
|
||||
- Проверьте SQL запросы в `MetricsUpdater`
|
||||
- Увеличьте интервал обновления для накопления данных
|
||||
|
||||
## 🐳 Docker
|
||||
|
||||
### Сборка образа
|
||||
|
||||
Reference in New Issue
Block a user