Перейти к содержанию

analytics_service

1. Назначение

analytics_service собирает веб-аналитику первой стороны (first-party): просмотры страниц SPA, сессии, API-запросы с фронтенда, клиентские ошибки, согласие на cookie/аналитику.

Агрегаты для админ-панели (/admin/analytics, вкладки «Трафик», «Страницы», …) отдаёт admin_service — он читает те же таблицы через cross-import моделей analytics_app.

Связанные документы:

2. Порт и префикс

Параметр Значение
Host-порт (dev) 8008:8000
API-префикс /api/analytics/
Docker-сервис analytics_service

3. API ingest (публичный)

Все ingest-endpoint'ы: AllowAny, rate limit (AnalyticsBatchThrottle), CSRF exempt (beacon/fetch без cookie).

Метод Путь Назначение
POST /api/analytics/events/batch/ Пакет до ANALYTICS_BATCH_MAX_EVENTS (по умолчанию 20)
POST /api/analytics/consent/ Запись consent_granted / consent_denied

Тело batch

{
  "visitor_id": "uuid",
  "session_id": "uuid",
  "consent_version": "1.0",
  "events": [
    {
      "event_type": "page_view",
      "path": "/products",
      "occurred_at": "2026-05-17T10:00:00Z",
      "is_admin_area": false
    }
  ]
}

Ответ 201: { "stored": <int>, "visitor_id": "<uuid>" }.

Типы событий (event_type)

Значение Источник
page_view SPA route change
page_leave Смена route / visibilitychange
click Элемент с [data-analytics]
api_request Axios interceptors в frontend/src/services/api.js
client_error window.onerror, unhandledrejection
performance Navigation Timing (раз на сессию)
consent_granted / consent_denied Баннер или API consent

4. Модель данных

AnalyticsSession

Агрегат визита: один session_id, обновляется при каждом ingest события.

Ключевые поля: visitor_id, user (FK, nullable), started_at, last_seen_at, duration_sec, entry_path, exit_path, page_views_count, is_bounce, UTM, referrer_host, device_type, browser, os_name, ip_hash (SHA-256, не сырой IP), locale, screen_class, is_admin_area.

AnalyticsEvent

Append-only сырые события. Индексы по occurred_at, event_type, path, session_id, api_service.

AnalyticsDailyRollup

Зарезервировано для фоновых rollup (MVP: агрегации в admin_service на лету).

5. Приватность и согласие

Правило Реализация
Сбор только после согласия webAnalyticsTracker.js проверяет localStorage.konstructorium_analytics_consent === granted
IP не хранится в открытом виде ANALYTICS_IP_HASH_SALT + SHA-256 в ingest.py
Тексты ошибок error_message_hash, не полный текст в БД
Срок хранения сырых событий ANALYTICS_EVENT_RETENTION_DAYS (90), команда purge_old_analytics_events

Баннер: frontend/src/components/AnalyticsConsentBanner.jsx (см. frontend).

6. Диаграмма потока

sequenceDiagram
  participant U as Browser
  participant F as SPA_tracker
  participant A as analytics_service
  participant ADM as admin_service
  participant UI as AdminAnalytics

  U->>F: Accept cookies
  F->>A: POST /consent/ granted
  U->>F: Navigate /products
  F->>A: POST /events/batch page_view
  A->>A: AnalyticsEvent + AnalyticsSession upsert

  Note over ADM,UI: Staff only
  UI->>ADM: GET /api/admin/dashboard/web/overview/
  ADM->>ADM: ORM aggregate on analytics_app
  ADM-->>UI: KPI + charts data

7. Конфигурация (env)

Переменная Назначение По умолчанию
DATABASE_URL PostgreSQL
SECRET_KEY Django
ANALYTICS_IP_HASH_SALT Соль для IP hash konstructorium-analytics-salt
ANALYTICS_BATCH_MAX_EVENTS Лимит batch 20
ANALYTICS_EVENT_RETENTION_DAYS Retention purge 90
ANALYTICS_THROTTLE_RATE Общий anon throttle 120/min
ANALYTICS_BATCH_THROTTLE_RATE Throttle batch 60/min

Frontend:

Переменная Назначение
VITE_PRIVACY_POLICY_URL Ссылка в баннере (например /legal/privacy)

8. Локальная разработка

# В составе стека
docker compose -f docker-compose.services.yml up -d analytics_service

# Миграции
cd analytics_service && python manage.py migrate

# Purge старых событий
python manage.py purge_old_analytics_events

Vite proxy: /api/analyticshttp://localhost:8008 (см. frontend/vite.config.js).

9. Тесты

pytest tests/analytics_service/test_smoke.py
cd frontend && npm test -- --run src/test/webAnalyticsTracker.test.js

10. Исходники (карта файлов)

Путь Роль
analytics_app/models.py Модели
analytics_app/views.py Ingest API
analytics_app/serializers.py Валидация batch/consent
analytics_app/services/ingest.py Persist + session upsert
analytics_app/management/commands/purge_old_analytics_events.py Retention
admin_app/web_analytics_views.py Read API (в admin_service)

11. Ограничения MVP

Нет: вебвизора, heatmap, гео по городам, A/B. Есть: страницы, сессии, referrers, UTM, устройства, JS/API ошибки, realtime, CSV в админке.