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 с; без розрізу опівночі |
| TU | heartbeat Electron раз на 60 с | продовжується відрізок цієї TU тієї ж доби, що закінчився не раніше ніж за 100 с; інакше новий відрізок 60 с |
Правила склеювання — legacy Golden. Документ на відрізок, без розрізів по днях: читання обрізає відрізки межами доби проєкту.
Online на партнері
project-goldenкожні 5 хвилин запитує на партнері списки online RU і TU і надсилає знімок.- Платформа пише знімок, ставить
lastOnlineAtнаявним профілям RU і пише присутність кожного RU знімка вproject_ru_online(ClickHouse): хвилини за день = кількість знімків × 5. - Після кожного знімка складаються тижні пн–нд, що повністю минули, від останнього порахованого: різні й середні 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/snapshot | project-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)).