Налаштування Real User Monitoring (RUM) для мобільного додатку: навіщо це потрібно?
Уявіть: користувач на Xiaomi Redmi Note 9 скаржиться, що екран списку товарів гальмує. Синтетичний моніторинг показує ідеальні 60 FPS, а на LTE в регіоні — network timeout на 8-й секунді. Без RUM ви дізнаєтеся про це тільки з відгуків у Play Market. RUM фіксує кожне відвисання UI, кожен анріл, кожну мережеву помилку. Наш досвід показує: 30% критичних багів не видно в синтетичних тестах. Впровадження RUM у 50+ проектах скорочує час діагностики в 3 рази та економить до $1500 на місяць за рахунок швидкого виявлення вузьких місць.
Різниця між RUM та синтетичним моніторингом
RUM збирає дані з реальних пристроїв, тоді як синтетика працює в контрольованому середовищі. Синтетичний моніторинг не покаже, що на Huawei P40 екран оплати гальмує через overdraw у FrameLayout. RUM фіксує кожну подію: View, Action, Resource, Error, Long Task. Серед них Long Task — найбільш діагностично цінний показник. Документація Datadog RUM стверджує, що понад 50% перформанс-інцидентів виявляються саме через Long Task.
Які дані збирає RUM?
Стандартний набір подій у мобільному RUM:
- View — перехід на екран (відкриття, закриття, тривалість)
- Action — тап, свайп, scroll, LongPress
- Resource — HTTP-запит: URL, метод, статус, розмір, latency
- Error — handled exception, unhandled exception, ANR, крэш
-
Long Task — операція на main thread > 100ms (Android) / main runloop > 16ms (iOS)
З усіх подій найбільш діагностично цінне — Long Task у кореляції з View. Якщо Long Task у 250ms трапляється в момент переходу на екран оплати у 15% користувачів — це конкретний перформанс-баг, а не «щось іноді лагає».
Чому Long Task — головний індикатор проблем?
Long Task безпосередньо вказує на блокування UI. Наприклад, в одному проекті після інтеграції RUM з'ясували, що під час завантаження списку замовлень на Android відбувається важке сортування на main thread (Long Task 400ms). Рішення: перенести сортування в корутину. Без RUM ця проблема залишилася б непоміченою.
Порівняння інструментів RUM
| Інструмент |
Особливості |
Семплінг |
Середня вартість за 100k сесій |
| Datadog RUM |
Повний стек mobile+server, W3C tracing |
До 100%, гнучкий |
$300–$450 |
| Sentry |
Безкоштовний tier, хороші release comparisons |
За замовчуванням 100% |
$0 (до ліміту) |
| Firebase Performance |
Безкоштовно, тільки Google-екосистема |
Автоматичний |
$0 |
| New Relic Mobile |
Потужний NRQL, enterprise |
До 100% |
$500+ |
Для більшості продуктів Firebase Performance — хороший старт (безкоштовно, zero-config для мережі). Але як тільки потрібна кореляція з серверними трейсами або кастомні бізнес-атрибути, переходять на Datadog або Sentry. Datadog обробляє в 10 разів більше подій, ніж Firebase Performance, при порівнянній вартості.
Як вибрати sessionSampleRate?
sessionSampleRate визначає відсоток сесій, які надсилаються до RUM. При високому DAU (наприклад, 1 млн) 100% сесій — дорого. Стандартна практика: 100% для нових релізів перші 48 годин, потім знижуємо до 20–30%. Для пошуку рідкісних помилок (наприклад, ANR на 0.5% пристроїв) знадобиться високий семплінг. Збалансований вибір — 50%.
Налаштування на прикладі Datadog RUM
Інтеграція SDK
import DatadogRUM
RUM.enable(with: RUM.Configuration(
applicationID: "your-rum-app-id",
sessionSampleRate: 80, // 80% сесій
telemetrySampleRate: 20,
trackBackgroundEvents: false // не трекаємо фонові події
))
Інструментація екранів вручну (SwiftUI)
struct ProductListView: View {
var body: some View {
List(products) { product in
ProductRow(product: product)
}
.trackRUMView(name: "ProductList")
}
}
Моніторинг конкретного мережевого запиту
// З URLSession + Datadog
let delegate = DDURLSessionDelegate()
let session = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil)
Datadog автоматично інжектує x-datadog-trace-id у кожен запит через цей session — жодних додаткових перехоплювачів.
Типові проблеми при впровадженні RUM
Частий баг — View закривається занадто рано. Наприклад, у UIKit без явного виклику stopView агент закриває View при viewWillDisappear, але якщо контролер показує bottom sheet поверх себе — View закриється і відкриється знову, створивши дублюючий запис. Рішення:
// iOS — явне управління View lifecycle
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
RUM.monitor?.startView(viewController: self, name: "ProductDetail")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if isMovingFromParent {
RUM.monitor?.stopView(viewController: self)
}
}
Процес впровадження RUM
| Етап |
Тривалість |
Результат |
| Аналіз поточного додатку |
0.5 дня |
Список вузьких місць |
| Вибір інструменту та архітектура |
0.5 дня |
Технічне завдання |
| Інтеграція SDK та інструментація |
1–2 дні |
Робочий прототип на стейджингу |
| Тестування та A/Б-тест з синтетикою |
1 день |
Верифікація даних |
| Деплой на продакшн та запуск дашбордів |
0.5 дня |
Моніторинг у реальному часі |
Що входить в роботу?
- Вибір інструменту під стек та бюджет (Datadog / Sentry / Firebase / New Relic)
- Підключення SDK з оптимальним sessionSampleRate
- Інструментація View-переходів (iOS, Android, Flutter)
- Налаштування HTTP-перехоплювача для трекінгу мережевих ресурсів
- Конфігурація consent-логіки під GDPR
- Побудова дашборду: р75/p95 View load time, Error Rate, Long Task Rate
- Навчання команди роботі з дашбордами
Терміни та вартість
Базова настройка RUM займає 1–2 дні. Кастомні атрибути та дашборди — ще 1–2 дні. У середньому впровадження окупається за 2–3 місяці за рахунок скорочення часу на пошук багів. Вартість розраховується індивідуально залежно від складності додатку та обраного інструменту. Зв'яжіться з нами для точної оцінки. Наша команда має 7+ років досвіду в мобільній розробці. Отримайте консультацію з вибору інструменту RUM.
Аналітика мобільних застосунків: Firebase, Amplitude, AppsFlyer та атрибуція
Наша команда регулярно стикається з проектами, де аналітика вже «налаштована», але реальних інсайтів немає. Типовий приклад — стартап з 50k DAU: трекінг десятків подій без жодної відповіді на питання «чому користувачі не доходять до оплати». За два тижні ми побудували базову воронку і з'ясували, що 70% аудиторії відвалюється на екрані верифікації номера телефону. Після локалізації бага retention зріс на 12%. Висновок: аналітика повинна починатися з конкретних питань, а не з трекінгу всього підряд.
Чому таксономія подій — основа аналітики мобільних застосунків?
Firebase Analytics, Amplitude, Mixpanel — технічно схожі. Різниця в тому, що ви в них кладете. Типова помилка: події screen_view, button_tap_1, button_tap_2 без контексту. Через місяць ніхто не пам'ятає, що таке button_tap_2.
Правильна таксономія: об'єкт + дія + контекст. product_viewed, checkout_started, payment_completed з параметрами product_id, category, price, source. Це дозволяє будувати воронки, когортний аналіз та retention без додаткового трекінгу.
Ми фіксуємо naming convention у tracking plan — документі (Google Sheet або Amplitude Data Catalog), де описано кожну подію, її параметри та умови спрацьовування. Tracking plan синхронізується з командою аналітиків до початку розробки, а не після. Такий підхід гарантує, що через місяць дані залишаться інтерпретованими, а не перетворяться на звалище. Досвід впровадження на 50+ проектах підтверджує: при відсутності tracking plan вартість підтримки аналітики зростає у 2-3 рази за рахунок переробок.
Що обрати для аналітики мобільних застосунків: Firebase, Amplitude чи Mixpanel?
Таблиця нижче показує ключові відмінності трьох популярних платформ. Вибір залежить від бюджету, трафіку та завдань.
| Критерій |
Firebase Analytics |
Amplitude |
Mixpanel |
| Безкоштовний ліміт |
Безліміт (в рамках Spark-плану) |
До 10 млн events/міс |
До 1 тис. MTU/міс (Special) |
| Затримка даних |
До 24 годин (стандарт) |
Хвилини (real-time) |
Хвилини (real-time) |
| Воронки та когорти |
Базові воронки, обмежена кількість |
Глибокі воронки, Journeys, когорти |
Funnels, Retention, Insights |
| BigQuery-експорт |
Так (безкоштовно, сирі дані) |
Так (підписка) |
Так (Enterprise) |
| Session Replay |
Ні |
Є (iOS/Android SDK) |
Ні |
| Інтеграція з рекламою |
Google Ads (нативна) |
Через Universal Links |
Через партнерів |
Firebase Analytics — безкоштовно, глибока інтеграція з Google Ads, BigQuery-експорт для сирих даних. Обмеження: затримка даних до 24 годин, обмежені воронки. Для стартапів з Google Ads трафіком — перший вибір.
Amplitude — продуктова аналітика з акцентом на когорти та шляхи користувача. Journeys (колишній Pathfinder) показує реальні шляхи між подіями — не передбачувані воронки, а фактичні маршрути. Session Replay — запис сесій для UX-аналізу. Безкоштовний тир до 10 млн events/місяць достатній для більшості продуктів на старті.
Mixpanel — ближче до Amplitude, сильніший у сегментації в реальному часі. Insights, Funnels, Retention — базові інструменти, які закривають 90% аналітичних завдань продакта.
Більш формальні визначення цих платформ можна знайти у Wikipedia (Firebase) та Wikipedia (Amplitude).
Як вирішити проблему мультиканальної атрибуції з AppsFlyer?
Знати звідки прийшов користувач — окреме завдання. Firebase Attribution працює лише всередині Google-екосистеми. Для мультиканальної атрибуції (Facebook Ads, TikTok, Apple Search Ads, programmatic) потрібен MMP — Mobile Measurement Partner.
AppsFlyer — лідер ринку. OneLink — universal deep link, який працює на iOS та Android і коректно атрибутує встановлення з будь-якого каналу. Protect360 — вбудований захист від fraud (фейкові встановлення, click injection на Android). Adjust та Branch — конкуренти з подібним функціоналом. Branch сильний у deep linking; Adjust популярний у gaming.
Згідно з Apple, з iOS 14.5 застосунки повинні отримувати дозвіл користувача через ATT перед збором IDFA для відстеження. AppsFlyer використовує probabilistic matching (IP + user agent + timing) для цих користувачів — точність нижча, але краще ніж нічого. SKAdNetwork та Privacy Preserving Attribution надають агреговані дані від Apple із затримкою 24-72 години.
Як налаштувати crash-аналітику, щоб не пропускати баги?
Firebase Crashlytics — стандарт для crash reporting. Автоматично групує креші за стектрейсом, показує affected users %, velocity alerts при зростанні crash rate більш ніж на 10% за годину.
Важливо: символікація. На iOS .dSYM файли повинні автоматично завантажуватися при кожній збірці — через Fastlane upload_symbols_to_crashlytics або Xcode Cloud built-in. Без символів креш у Crashlytics виглядає як набір адрес пам'яті. Це трапляється частіше, ніж здається при переході на новий CI — в одному проекті з аудиторією 500k користувачів ми виявили, що 40% крешів залишалися несимволізованими через пропущений етап у CI/CD. Після автоматизації час реакції на баги скоротився з 3 годин до 15 хвилин.
Для React Native та Flutter — @sentry/react-native та sentry_flutter дають додатковий контекст: breadcrumbs, мережеві запити перед крешем, стан Redux/Provider.
Нижче — порівняння популярних інструментів crash-аналітики для вибору під свої завдання.
| Критерій |
Firebase Crashlytics |
Sentry |
Instabug |
| Безкоштовний ліміт |
Безліміт (в рамках Spark) |
5k events/міс |
250 MAU |
| Групування |
За стектрейсом + параметри |
За fingerprint |
За стектрейсом + метадані |
| Символікація |
Автоматична (через файл) |
Автоматична (через CLI) |
Автоматична |
| Velocity alerts |
Так (за % зміни) |
Так (за кількістю) |
Так (за порогом) |
| Дод. контекст |
Logs, Keys, Custom Keys |
Breadcrumbs, User, Tags |
User steps, мережеві запити |
| Ціна |
Безкоштовно (у Firebase) |
Від $26/міс (Team) |
Від $99/міс |
Налаштування оточення
Три оточення з окремими Firebase проектами: dev, staging, production. Змішувати аналітику з тестових сесій і production — поширена помилка, яка спотворює всі метрики. На iOS через GoogleService-Info.plist для кожної схеми, на Android через google-services.json у папці кожного flavor.
Терміни: базова аналітика з Firebase + Crashlytics — 3-5 днів. Повноцінний tracking plan + Amplitude/Mixpanel з воронками та когортами — 2-3 тижні. Атрибуція через AppsFlyer з deep linking та fraud protection — 1-2 тижні. Вартість розраховується індивідуально залежно від складності інтеграцій.
Що входить у нашу роботу
В рамках впровадження аналітики ми надаємо:
- Розробку та узгодження tracking plan з командами продукту та маркетингу.
- Інтеграцію SDK (Firebase, Amplitude, Mixpanel, AppsFlyer) з урахуванням вашого стеку (Swift/Kotlin/Flutter/React Native).
- Налаштування воронок, когорт, дашбордів та алертів.
- Автоматизацію символікації та завантаження .dSYM через Fastlane.
- Документацію щодо подій та параметрів.
- Навчання команди роботі з аналітичною платформою.
- Два тижні пост-релізної підтримки та коригування трекінгу.
Наш досвід — 7 років впровадження аналітики та понад 80 успішних проектів у сфері мобільної розробки. Ми гарантуємо коректність даних і прозорість кожного етапу.
Зв'яжіться з нами, щоб отримати консультацію з налаштування аналітики вашого застосунку. Замовте аудит поточної аналітики — і ми покажемо, які метрики ви втрачаєте.