10-metrics

Метрики

src/metrics/ — копії статистики й online TU в ClickHouse і метрики на них: графіки TU і команди, скоринг TU, пари TU з RU.

Дані: таблиці ClickHouse · Swagger: тег Metrics · План: MetricsService, Metrics Sync Worker

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

  • Тримає в ClickHouse копію project_statistics з денними парами TU + RU і денний online TU; online RU пише знімок на партнері (Online на партнері).
  • Рахує метрики TU і команди за днями, тижнями, місяцями в межах ролі; межі ролі — relations і журнали Stack, як у дашбордах.
  • Віддає календар RU по TU за 14 днів і деталі пари за день.

Копії в ClickHouse

Статистика

Дні замінюються цілком: по місяцю видаляються дні з обох таблиць, операції з Mongo вставляються пачками по 50 тис., денні пари будує сам ClickHouse з щойно вставлених операцій. Пари беруть лише операції агенції з RU, без службових типів і подарунків, і діляться за оператором і тімлідом дня.

Дні для копіювання визначає звірка відбитків, а не тригер: кількість рядків і останній createdAt кожного дня в Mongo й у копії. Рядки статистики лише вставляються й видаляються, тож будь-яка зміна дня змінює відбиток. Копія підхоплює пізні дані: історію нової адмін панелі з 2022 року, зовнішню історію нової TU, видалені дні, недокопійований місяць.

Online TU

Відрізки online TU діляться межами діб проєкту, тривалості TU за добу сумуються. Копіюються дні, що закінчились, від передостаннього скопійованого до вчора — так підхоплюється пізній синк Electron за вчора. Дні замінюються цілком по місяцю.

Коли

КолиЩо
Після оновлення relations (05-statistics)звірка статистики і копія online TU у фоні; збій лише логується, наступна звірка виправляє
Вручну, вкладка міграційзвірка або примусова копія днів from..to

Один запуск на проєкт: Redis-лок, паралельний — 409.

Метрики

Конект — пара TU + RU за день з будь-якою операцією, крім службових і подарунків; платний — з додатною сумою. Вік пари — днів від першого платного дня: new — 0, young — 1–7, old — 8+. Вік і повернення рахуються на читанні.

МетрикаВизначення
balanceсума додатних операцій
avgBalancePerDay, avgDauбаланс і конекти на активний день
avgOnlineхвилин online на активний день; null до початку обліку online проєкту (Golden — 2025-10-16)
avgSpentсередня сума платного конекту за віком
retention% пар з конектом і наступного дня від конектів попереднього дня за віком
tau, newConnрізні пари за період; пари з днем знайомства в періоді
cpr (TU)дні з конектом / дні можливої активності пари: від першого дня пари в періоді, якщо це день знайомства, інакше весь період
avgViews (TU)переглядів профілю (RU + година) на годину online, для TU з online понад годину
onTimeReplyRate, newConnRate% чат-задач з відповіддю до таймера; % RU з інвайтів, що відповіли

TU

TU ролі — з relations, кожна зі своїми активними днями в межах ролі. Пул точки — TU з активним днем у періоді й online від години (до обліку online — без відсіву). Online — project_tu_online_days лише за активні дні. ClickHouse рахує суми по TU і періоду, пул сумується в сервісі: метрики пар адитивні по TU.

Команда

Операції з прив’язкою до операторів у дні, коли вони були в межах ролі (TeamPeriodsService, спільний зі статистикою і дашбордами). Активний день — день оператора в ролі, online — оператора. Пара за день рахується для кожного оператора окремо.

Пари TU з RU

14 днів до day, RU, які за цей час платили TU. Статус дня за пріоритетом: блок TU, витрати на TU, на інші TU, online без витрат, не заходив. Незавершені дні — з project_statistics_temp на читанні. У деталях пари інші TU director бачить усі, топ — TU своїх тімлідів у цей день, решта — жодних.

Тимчасово з legacy Golden

Інвайти (golden_sender_answers), перегляди профілю (golden_profile_views), блоки (golden_block_list_history) — legacy ClickHouse main; задачі — Mongo golden_action_operators (LegacyMetricsRepository, TU за партнерським ID). Інші проєкти цих даних не мають — метрики 0.

API для frontend

Графіки приймають project, from, to, groupBy: day | week | month; скоринг — без groupBy. Дні від сьогодні не рахуються, межі точок повні (тиждень пн–нд, місяць).

РоутРоліПоля
POST /v2/metrics/tus/directordirectorteamLeadProjectId?, operatorProjectId?, tuId?
POST /v2/metrics/tus/team-leadтімлід, directorteamLeadProjectId, operatorProjectId?, tuId?
POST /v2/metrics/tus/operatoroperator, directoroperatorProjectId, tuId?
POST /v2/metrics/tus/top-managertop manager, directorteamLeadProjectId?, operatorProjectId?, topManagerUserId?, tuId?
POST /v2/metrics/scoring/{director,team-lead,operator,top-manager}як вищеті самі без tuId
POST /v2/metrics/team/directordirectorхоча б одне: topManagerUserId, teamLeadProjectId, operatorProjectId
POST /v2/metrics/team/{team-lead,operator,top-manager}як у TUяк у TU, без tuId
POST /v2/metrics/connectionsdirector, top manager, тімлід, operatortuId, day, stage?
POST /v2/metrics/connection-detailsті саміtuId, ruId, day

Один роут графіка повертає точки з усіма метриками (legacy — 12 роутів і /all).

Internal API

РоутХто викликаєНавіщо
POST /v2/internal/metrics/sync-statisticsвручну, вкладка міграційбез дат — звірка (на порожній копії — уся історія); з датами — дні from..to примусово
POST /v2/internal/metrics/sync-tu-onlineвручну, вкладка міграційбез дат — від передостаннього дня (на порожній таблиці — уся історія); з датами — дні from..to

Відмінності від legacy

  • Вік пари й повернення рахуються на читанні: пізні дані їх не ламають. Legacy зберігав їх у рядку на момент запису.
  • Активні дні TU — з relations. Legacy вважав TU без логів активною весь період, тож мав більше днів: avgOnline, avgBalancePerDay, avgDau тут нижчі.
  • Оператори команди — з relations ролі; legacy брав усіх поточних операторів тімліда, зокрема заблокованих без логів.
  • TAU і нові конекти команди — різні пари за період; legacy сумував денні значення по операторах. avgDau legacy /all ділив на TAU замість суми денних конектів — тут як окремий legacy /avg-dau.
  • avgSpent округлюється, legacy обрізав: різниця 0,01.

Звірка з legacy (дамп ClickHouse 01.10.2026, Mongo до 27.09)

  • Пари за день проти golden_general_metric_data: 05.2026 — 17 336, 09.2026 — 15 290 спільних пар-днів, 0 розбіжностей; 08.2026 — 17 172 спільні, 0 розбіжностей, і 1 013 лише в нас — 54 TU адмін панелі, доданої 30.08, історію яких legacy не долив.
  • Графік TU director, 08–09.2026: balance, retention, tau, newConn, cpr, задачі й інвайти збігаються, avgSpent і avgViews — ±0,01; різняться лише метрики на активний день. Скоринг 08.2026: 451 спільна TU, баланс кожної збігається.
  • Команда: оператор — усе, крім TAU; тімлід і топ — сума ±0,5 % у місяцях переходів операторів між командами.
  • Пари TU з RU: календарі 4 TU за три дні з фільтром віку — статуси й суми збігаються, крім днів з недолитою в legacy історією; деталі 12 пар — 1:1.
  • Копія статистики: кількість і сума по всіх 57 місяцях збігаються з Mongo. Online TU за 08.2026 збігається з відрізками Mongo до округлення секунд.
  • Швидкість: місяць director — 1 с (legacy 20 с), 9 місяців по тижнях — 4,7 с, з них ~3 с — задачі з legacy Mongo; команда — 0,2–0,5 с.

Борг

  • Межі ролі беруться з тіла запиту без перевірки власника, як у legacy і в дашбордах.
  • Інвайти, перегляди, блоки і задачі читаються з legacy Golden — до переробки інвайтів і задач.