|
1 | 1 | # Metrics |
2 | 2 |
|
3 | | -TODO |
| 3 | +## Назначение |
| 4 | + |
| 5 | +Metrics отвечает за внутренний admin-only endpoint с базовыми счетчиками |
| 6 | +сервиса. |
| 7 | + |
| 8 | +Модуль нужен для быстрой технической сводки: сколько в системе пользователей, |
| 9 | +ролевых профилей, проектов, вакансий и сколько пользователей сейчас считаются |
| 10 | +online через websocket-чаты. |
| 11 | + |
| 12 | +## Статус модуля |
| 13 | + |
| 14 | +Модуль рабочий и подключен в корень API через `GET /`. |
| 15 | + |
| 16 | +Endpoint доступен только staff-пользователям. Для anonymous и обычных |
| 17 | +authenticated пользователей доступ закрыт. |
| 18 | + |
| 19 | +## Основные возможности |
| 20 | + |
| 21 | +- подсчет общего количества пользователей; |
| 22 | +- подсчет количества ролевых профилей пользователей; |
| 23 | +- подсчет количества проектов; |
| 24 | +- подсчет количества вакансий; |
| 25 | +- подсчет текущих online-пользователей по cache-ключу websocket-чата. |
| 26 | + |
| 27 | +## Архитектура |
| 28 | + |
| 29 | +- `metrics/views.py` - HTTP endpoint метрик. |
| 30 | +- `metrics/services.py` - сбор response payload. |
| 31 | +- `metrics/urls.py` - route модуля. |
| 32 | +- `metrics/tests/` - regression-тесты и helpers модуля. |
| 33 | + |
| 34 | +## API |
| 35 | + |
| 36 | +- `GET /` - получить внутренние метрики сервиса. |
| 37 | + |
| 38 | +Response содержит поля: |
| 39 | + |
| 40 | +- `total_CustomUser_count` - количество пользователей; |
| 41 | +- `total_Expert_count` - количество экспертных профилей; |
| 42 | +- `total_Investor_count` - количество профилей инвесторов; |
| 43 | +- `total_Member_count` - количество профилей участников; |
| 44 | +- `total_Mentor_count` - количество профилей менторов; |
| 45 | +- `total_Project_count` - количество проектов; |
| 46 | +- `total_Vacancy_count` - количество вакансий; |
| 47 | +- `current_online_users` - количество пользователей online по данным cache. |
| 48 | + |
| 49 | +## Основные сценарии |
| 50 | + |
| 51 | +### Staff открывает внутреннюю сводку |
| 52 | + |
| 53 | +Staff-пользователь отправляет `GET /` и получает текущие счетчики. |
| 54 | + |
| 55 | +Счетчики `total_*_count` считаются через `objects.count()` соответствующих |
| 56 | +моделей. |
| 57 | + |
| 58 | +### Подсчет online-пользователей |
| 59 | + |
| 60 | +`current_online_users` считается по cache-ключу `online_users`. |
| 61 | + |
| 62 | +Этот ключ наполняется модулем `chats`: при подключении пользователя к |
| 63 | +websocket-чату пользователь добавляется в set online-пользователей, при |
| 64 | +отключении удаляется. |
| 65 | + |
| 66 | +## Связи с другими модулями |
| 67 | + |
| 68 | +- `users` - счетчики пользователей и ролевых профилей. |
| 69 | +- `projects` - счетчик проектов. |
| 70 | +- `vacancy` - счетчик вакансий. |
| 71 | +- `chats` - источник данных для `current_online_users`. |
| 72 | +- `core` - cache helpers для online-ключей. |
| 73 | + |
| 74 | +## Ограничения и риски |
| 75 | + |
| 76 | +- Endpoint подключен к корню API: `GET /`. Это текущий контракт, но он |
| 77 | + неочевиден для отдельного модуля метрик. |
| 78 | +- `current_online_users` показывает только пользователей, которые считаются |
| 79 | + online через websocket-чаты. Пользователь, который делает только HTTP-запросы, |
| 80 | + в этот счетчик не попадет. |
| 81 | +- Online-счетчик зависит от cache. После очистки cache значение будет `0`, пока |
| 82 | + пользователи снова не подключатся к websocket. |
| 83 | +- Поля response имеют технические имена моделей и сохранены для совместимости. |
| 84 | + |
| 85 | +## Тесты |
| 86 | + |
| 87 | +Текущие тесты лежат в `metrics/tests/`. |
| 88 | + |
| 89 | +Проверяется: |
| 90 | + |
| 91 | +- anonymous пользователь не получает доступ к метрикам; |
| 92 | +- обычный authenticated пользователь не получает доступ к метрикам; |
| 93 | +- staff-пользователь получает payload метрик; |
| 94 | +- service считает пользователей, ролевые профили, проекты, вакансии и |
| 95 | + online-пользователей; |
| 96 | +- пустой online-cache возвращает `current_online_users = 0`; |
| 97 | +- helper подсчета модели сохраняет уже собранный payload. |
0 commit comments