08-online

Online

src/online-sessions/ · src/partner-online/ — online оператора і TU в нашому workspace (відрізки часу) та online RU і TU на партнері (знімки й тижневі агрегати).

Дані: project_operator_online_sessions, project_tu_workspace_sessions, project_partner_online_snapshots, project_partner_online_weeks · Swagger: лише internal-роути · План: OperatorOnlineService, TUWorkspaceOnlineService, PartnerOnlineHistoryService

Що робить модуль

  • Склеює ручні дії оператора і heartbeat TU з Electron у відрізки online.
  • Зберігає знімки online RU і TU на партнері, оновлює lastOnlineAt у профілях RU і складає тижневі агрегати для дашбордів.
  • Пише присутність RU у ClickHouse для метрик.

Читачі: статистика (online оператора й TU за день), дашборди (online операторів за тиждень, online на партнері), метрики (денна копія online TU, online RU).

Логіка

Online у workspace

Один синк Electron — один запит відрізків, які події можуть продовжити, склеювання в пам’яті (online-sessions.fold.ts) і один bulkWrite: upsert за власником і початком, $max на кінці. Назовні пишуться лише нові й подовжені відрізки. Повтор і паралельний синк безпечні: відрізок ніколи не коротшає.

ПодіяСклеювання
Операторручна дія (чат, лист)дію накриває відрізок, що почався не пізніше і закінчився не раніше ніж за 5 хв до неї — кінець стає часом дії; інакше новий відрізок 1 с; без розрізу опівночі
TUheartbeat Electron раз на 60 спродовжується відрізок цієї TU тієї ж доби, що закінчився не раніше ніж за 100 с; інакше новий відрізок 60 с

Правила склеювання — legacy Golden. Документ на відрізок, без розрізів по днях: читання обрізає відрізки межами доби проєкту.

Online на партнері

  1. project-golden кожні 5 хвилин запитує на партнері списки online RU і TU і надсилає знімок.
  2. Платформа пише знімок, ставить lastOnlineAt наявним профілям RU і пише присутність кожного RU знімка в project_ru_online (ClickHouse): хвилини за день = кількість знімків × 5.
  3. Після кожного знімка складаються тижні пн–нд, що повністю минули, від останнього порахованого: різні й середні RU, TU і наші TU за тиждень і по годинах доби проєкту. Знімки з невдалим запитом списку в середнє не входять.

Тижні від статистики не залежать (legacy рахував їх у денній вигрузці). Ремонт — internal convert, повтор перезаписує тиждень.

Internal API

РоутХто викликаєНавіщо
POST /v2/internal/online-sessions/record-operator-actions— (сервіс, що приймає синк Electron)дії оператора → відрізки online
POST /v2/internal/online-sessions/record-tu-heartbeats— (сервіс, що приймає синк Electron)heartbeat TU → відрізки online TU
POST /v2/internal/partner-online/snapshotproject-golden, кожні 5 хвзнімок online на партнері
POST /v2/internal/partner-online/convertвручнуперерахунок тижнів

Звірка з legacy

  • Склеювання — 3000 випадкових послідовностей синків проти legacy-коду: реалістичний потік — 0 розбіжностей. При діях, що запізнюються на хвилини й накладаються на наявні відрізки, legacy міг вкоротити відрізок; тут кінець лише росте.
  • Денні суми після міграції: оператор 09–11.2025 і 08.2026 — 0 розбіжностей, крім 1 с на 7 legacy-дублях з тим самим початком (тут злиті); TU старого формату — 275 868 пар оператор + TU + день, 0; TU 08.2026 — 28 744 пари, 0.

Нюанси

  • Online оператора зберігається назавжди, online TU — кандидат в архів; тому колекції окремі.
  • Online всіх TU за місяць з Mongo — 226 тис. відрізків і 1,3 с; метрики читають денну копію project_tu_online_days у ClickHouse.
  • Години й дати тижнів рахуються в зоні проєкту (legacy — у зоні сервера); перенесені legacy-тижні лишаються як були.
  • Prime, Chathouse і Udate не мають запиту online на весь партнер: знімки буде вирішено разом з їхнім Electron.

Борг

  • Запис online у workspace не підключений: stack-golden не викликає record-*, тож після міграції нового online оператора і TU на платформі немає.
  • Сирі знімки online на партнері не архівуються і не видаляються після конвертації (TODO(archive)).