Metric
src/golden/Metric/
KPI-метрики TU поверх ClickHouse. Живлять два екрани метрик на фронті — Connections with users і TU scoring — плюс time-series графіки аналітики. Доступ: director / topManager / supervisor / operator; пул видимих TU залежить від ролі.
Перелік ендпоінтів — у Swagger, група Metric.
Джерела даних
| Таблиця (ClickHouse) | Що лежить | Хто наповнює |
|---|---|---|
golden_general_metric_data | кожна витрата RU по парі TU↔RU: сума, тип операції, lifetime пари, retention-категорія, ознака повернення, оператор/тімлід | крок «Генерація метрик» добової вигрузки статистики (statistics); ручний trigger tech-команди |
golden_ru_daily_activity | хвилини онлайну RU за день | getting-online — реал-тайм оновлення за сьогодні кожні 5 хв; історична синхронізація з Mongo — ручний trigger |
golden_profile_views | перегляди профілю TU чоловіком, дедуп по парі+дата+година | Electron шле перегляди пачками |
golden_sender_answers | унікальні agency-invites по парі за день + ознака «чи відповів RU» | update-online-time |
golden_block_list_history | журнал блокувань/розблокувань TU чоловіком | обробка block-list оновлень у mail-extension |
Додатково з MongoDB: бонуси сьогоднішнього дня (golden_temp_statistics), онлайн-сесії TU (golden_lady_online, пише Electron), таски в денних діях оператора (golden_action_operators — для OTRR), журнал подій TU (рівні, активація/деактивація).
Генерація golden_general_metric_data: інкрементально від останньої дати в ClickHouse до сьогодні; дата, для якої записи вже є, пропускається — перегенерувати заднім числом можна тільки вручну після чистки. ClickHouse тут — похідне сховище: джерело правди лишається в Mongo (golden_statistic), всі таблиці можна перезалити.
Lifetime і категорії пари: lifetime = днів від першої витрати пари TU↔RU. Категорії: new = LT0 (день знайомства), young = LT1–7, old = LT8+. Запис дня позначається «повернення», якщо попередня витрата пари була рівно вчора.
Дані «сьогодні»
ClickHouse наповнюється раз на добу (вигрузка о 13:06), тому для сьогоднішньої дати — і вчорашньої до ~13:00 — обидва екрани доповнюють ClickHouse-дані бонусами з golden_temp_statistics нальоту. Lifetime для таких пар добудовується від останнього відомого запису пари в ClickHouse.
Видимість TU за ролями
| Роль | Пул TU |
|---|---|
| director | усі; опційні фільтри тімлід/оператор |
| topManager | TU своїх supervisors (список приходить зі stack по RMQ); фільтри звужують |
| supervisor | TU своєї family; фільтр по оператору |
| operator | тільки свої TU |
Для director у TU scoring пул додатково чиститься від TU, які були неактивні всі дні періоду — стан на кожен день відновлюється по журналу подій TU (створення/активація/деактивація).
Connections with users
Календар активності RU по одній TU за вікно 14 днів (обрана дата + 13 днів назад).
- З ClickHouse беруться всі RU, що витрачали на цю TU у вікні (ігноровані типи операцій не рахуються).
- Для цих RU паралельно тягнуться: витрати на інших TU і дні онлайну.
- Кожен день кожного RU отримує статус, пріоритет згори вниз: заблокував TU → витратив на цю TU (з сумою) → витратив на інших TU → був онлайн без витрат → не логінився. Заблоковані дні відновлюються з журналу блокувань (інтервал від «blocked» до «unblocked» або до кінця вікна).
- Фільтр Connection type (new/young/old) — по retention-категорії пари.
- RU без жодної витрати на цю TU у вікні в результат не потрапляє.
Деталізація клітинки (пара + день): розбивка витрат по типах операцій, lifetime/категорія, хвилини онлайну RU за день, загальні витрати RU на всіх TU. Список «на яких ще TU витрачав» бачить тільки director (усі TU) і topManager (тільки TU своїх supervisors); supervisor/operator бачать лише загальну суму і кількість TU.
TU scoring
Зведена таблиця KPI по кожній TU пулу за довільний період + рядок total по пулу. TU з сумарним онлайном менше 60 хв за період виключаються і зі списку, і з total.
| # | Метрика | Визначення | Джерело |
|---|---|---|---|
| 1 | LVL | рівень TU за період; якщо мінявся всередині періоду — діапазон «ДО-ПІСЛЯ» | історія рівнів TU |
| 2 | Balance | сума витрат RU за період (без ігнорованих операцій) | golden_general_metric_data |
| 3 | Avg Balance per Day | Balance / кількість активних днів анкети | — |
| 4 | Avg Online | середній онлайн TU за день, хв | сесії golden_lady_online, тільки за активні дні |
| 5 | Avg Views per Hour | перегляди профілю / години онлайну | golden_profile_views |
| 6 | OTRR | % тасків «непрочитане повідомлення» закритих відповіддю до дедлайну таймера | таски в golden_action_operators |
| 7 | NewConn Rate | % унікальних RU, що відповіли на agency-invite | golden_sender_answers |
| 8 | NDR (new/young/old) | повернення наступного дня: returns сьогодні / connections вчора, по категоріях | golden_general_metric_data |
| 9 | Avg Spend per Day (new/young/old) | середні витрати RU за день-коннект відповідної категорії | golden_general_metric_data |
| 10 | CPR | частка активних днів пари від можливих днів періоду | golden_general_metric_data |
| 11 | Avg DAU | середня кількість унікальних RU за день | golden_general_metric_data |
| 12 | TAU | унікальні RU за період | golden_general_metric_data |
| 13 | New Conn | кількість нових пар (LT0) за період | golden_general_metric_data |
Базові поняття для формул
- Connection-день — пара TU↔RU + конкретна дата, в яку по парі була хоч одна врахована витрата. Більшість метрик рахуються по connection-днях, а не по окремих транзакціях.
- Врахована витрата — сума > 0 і тип операції не з ігнор-списку (реальні подарунки, штрафи, бонуси за активацію, обмін контактами — те, що не є заробітком на переписці).
- Активні дні — дні періоду, коли анкета була активна (стан відновлюється по журналу подій TU). Це знаменник усіх «per day»-середніх — не дні з онлайном і не дні з витратами.
- Категорія connection-дня — по lifetime пари в цей день: New = LT0, Young = LT1–7, Old = LT8+.
1. LVL
Якщо в межах періоду рівень не мінявся — поточний рівень анкети. Якщо мінявся — діапазон «рівень-на-вході — рівень-на-виході» (наприклад MID-TOP): рівень до першої зміни в періоді й рівень після останньої.
2. Balance
Сума всіх врахованих витрат RU на цю TU за період. Без усереднень.
3. Avg Balance per Day
Balance ÷ активні дні анкети. Немає активних днів або балансу → 0.
4. Avg Online
сумарний онлайн (хв) ÷ активні дні. Онлайн — сума тривалостей онлайн-сесій TU за день (сесії шле Electron). Враховуються тільки сесії за активні дні анкети; день зміни статусу активності зараховується активним з обох боків межі (закриває попередній період і відкриває новий включно).
5. Avg Views per Hour
унікальні перегляди профілю за період ÷ повні години онлайну. Перегляд унікальний у межах пара+дата+година: той самий RU, що відкрив профіль тричі за годину, дає 1 перегляд. Години = цілі години онлайну (хвилини ÷ 60, округлення вниз); якщо онлайн не перевищує годину — метрика 0.
6. OTRR (On-Time Reply Rate)
Чи вчасно оператор відповідає RU від імені цієї TU. Рахується по тасках: Chat: active-unanswered, Chat: finished-unanswered, Unanswered message — і лише таски з дедлайном таймера.
OTRR = вчасно закриті ÷ всі такі таски × 100. «Вчасно» = відповідь дана до дедлайну таймера таска.
7. NewConn Rate
Конверсія sender-розсилки у відповідь. Одиниця обліку — RU-день: день, у який по парі TU↔RU була хоч одна відправка з чат сендера. Якщо RU того ж дня відповів — RU-день вважається «з відповіддю» (фіксує update-online-time).
Rate = RU-дні з відповіддю ÷ всі RU-дні × 100.
Важливо: рахуються саме RU-дні, не унікальні RU за період. RU, якому сендер слав інвайти 5 різних днів і який відповів одного дня, дає в метрику 1/5.
8. NDR (Next Day Retention)
Відсоток повернень наступного дня, по категоріях лайфтайму. Логіка: беремо вчорашні конекти категорії; якщо по парі сьогодні знову був конект — це повернення, категорія вчорашнього конекта отримує «+». Повернення = connection-день, перед яким попередня витрата пари була рівно вчора (ознака ставиться при генерації golden_general_metric_data).
- знаменник: конекти категорії за період, зсунутий на день назад
[from−1, to−1]; - чисельник: їхні повернення за період
[from, to].
Категорія визначається по LT вчорашнього конекта. Повернення наступного дня має LT на 1 більший — тому межі в колонці повернень зсунуті на +1 і формально «заходять» у наступну категорію (повернення LT8 покриває вчорашній Young-конект LT7 — дірки на межі нема):
| Категорія | Конекти вчора (знаменник) | Повернення сьогодні (чисельник) |
|---|---|---|
| New | LT0 | LT1 |
| Young | LT1–7 | LT2–8 |
| Old | LT8+ | LT9+ |
9. Avg Spend per Day (New/Young/Old)
Середній чек connection-дня по категоріях: сума витрат у connection-днях категорії ÷ кількість connection-днів категорії.
10. CPR (Custom Periodic Retention)
Щільність ходіння RU до TU. Для кожної пари TU↔RU:
- активні дні пари = унікальні дні з витратою за період;
- можливий період = якщо знайомство (LT0) сталося всередині періоду — від дня знайомства до кінця періоду; інакше — весь період.
CPR TU = сума активних днів усіх її пар ÷ сума можливих періодів × 100.
11. Avg DAU
По кожному дню періоду рахуються унікальні RU з connection-днем; сума цих денних значень ділиться на активні дні анкети.
Чисельник і знаменник — різні множини днів: чоловіки сумуються за всі дні періоду з конектами (включно з днями, коли анкета була неактивна — витрати по неактивній анкеті можливі), а ділиться тільки на активні дні.
⚠️ TODO перевірити задум:
- конекти в день, коли анкета неактивна, потрапляють у чисельник, але день не потрапляє в знаменник — середнє завищується;
- неактивні дні без конектів не враховуються ніде — метрика не штрафує за простій: TU з 3 активними днями з 28-денного періоду отримає DAU по своїх 3 днях, а не по 28.
12. TAU
Кількість унікальних RU, що мали хоч один connection-день з TU за період.
13. New Conn
Кількість унікальних RU, які зробили перший коннект (connection-день з LT0) у періоді.
Рядок Total
Total — не середнє відсотків по TU, а перерахунок по всьому пулу:
- rate-метрики (OTRR, NewConn Rate, NDR, CPR) — зважені: суми чисельників ÷ суми знаменників усіх TU;
- Avg Online = сумарний онлайн усіх TU ÷ сумарні активні дні;
- Avg Views — у годинах онлайну враховуються тільки TU з онлайном понад 60 хв;
- TAU / New Conn / Avg DAU рахуються по конектах (парах TU↔RU), а не по унікальних RU: RU, що ходить до двох TU, дає 2 конекти. Це задум — Total міряє конекти, узгоджено з пер-TU значеннями (для однієї TU «унікальні RU» і «пари» — те саме).
Нюанси
- Онлайн TU рахується лише за дні, коли анкета була активна. Оператори можуть працювати на неактивних анкетах — heartbeat-и далі пишуться, і без фільтра онлайн за неактивні дні роздував би середній онлайн за день. Періоди активності відновлюються по журналу подій TU.
- «Активні дні» в знаменниках середніх — дні активності анкети, а не дні з онлайном.
- Помилка читання журналу блокувань не валить екран connections — дні просто лишаються без статусу «заблокований».
Дашборди (time-series)
Ті самі метрики як таймсерії з групуванням по тижнях — для графіків аналітики на екрані TU scoring: по одній TU, по всьому пулу, або по командах (порівняння тімлідів/операторів). Окремі Swagger-групи Metric Dashboard і Metric Team Dashboard; у ClickHouse ходять батч-запитами по періодах.
Зв’язки
- Оновлюється від: statistics (генерація метрик у добовому пайплайні), getting-online, update-online-time
- Читає: clickhouse