Інтеграція Datadog для моніторингу мобільного додатку (APM)
APM для мобільних додатків — це не те саме, що APM на бекенді. Серверний трейс починається з HTTP-запиту й закінчується відповіддю. На мобільному клієнті ланцюг складніший: холодний старт → ініціалізація SDK → навігація → мережевий запит → рендер екрану. Datadog Mobile SDK може пов'язати всі ці етапи в один розподілений трейс, але тільки з правильною інструментацією.
Чому Datadog, а не просто Firebase Crashlytics
Firebase добре ловить крахи. Datadog розв'язує іншу задачу — бачити продуктивність живих сесій: скільки часу займає Time to Interactive на конкретному екрані, які HTTP-запити уповільнюють рендер, на якому кроці воронки користувач чекає більше 3 секунд.
Зв'язування DD-Trace на iOS/Android з dd-trace на бекенді дозволяє передати trace-id з мобільного клієнта в серверний запит — і в Datadog APM ви бачите повний шлях від натиснення кнопки до відповіді бази даних.
Інтеграція SDK
iOS (Swift Package Manager):
// Package.swift dependency
.package(url: "https://github.com/DataDog/dd-sdk-ios", from: "2.0.0")
import DatadogCore
import DatadogRUM
import DatadogTrace
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "pub-xxxxx",
env: "production",
site: .eu1
),
trackingConsent: .granted
)
RUM.enable(with: RUM.Configuration(applicationID: "your-rum-app-id"))
Trace.enable()
Параметр trackingConsent критичний для GDPR: якщо користувач ще не дав згоду, використовуйте .pending. SDK буферизує дані локально. Коли ви отримаєте згоду, викличте Datadog.set(trackingConsent: .granted) і все відправиться.
Android (Kotlin):
// build.gradle.kts
implementation("com.datadoghq:dd-sdk-android-rum:2.+")
implementation("com.datadoghq:dd-sdk-android-trace:2.+")
implementation("com.datadoghq:dd-sdk-android-okhttp:2.+")
val config = Configuration.Builder(
clientToken = "pub-xxxxx",
env = "production"
).build()
Datadog.initialize(this, config, TrackingConsent.GRANTED)
val rumConfig = RumConfiguration.Builder("your-rum-app-id")
.trackUserInteractions()
.trackLongTasks(durationThreshold = 100L)
.build()
RumMonitor.enable(rumConfig)
Інструментація View та Action
За замовчуванням Datadog автоматично відслідковує UIViewController на iOS та Activity/Fragment на Android. Але автоматичне відслідковування показує назви класів, не читабельні назви екранів. Додайте кастомні назви:
// iOS — кастомна назва View
RUM.monitor?.startView(viewController: self, name: "ProductDetailScreen")
// Android — ручне відслідковування View у Fragment
GlobalRumMonitor.get().startView(
key = this,
name = "ProductDetailScreen",
attributes = mapOf("product_id" to productId)
)
Для дій користувача: Datadog автоматично відслідковує натиски через trackUserInteractions(). Явно логуйте кастомні бізнес-события:
GlobalRumMonitor.get().addAction(
type = RumActionType.CUSTOM,
name = "AddToCart",
attributes = mapOf("sku" to sku, "quantity" to qty)
)
Розподілена трасування мобіль → бекенд
Найцінніша частина — пов'язати мобільні запити з серверними трейсами. SDK Datadog інжектує заголовки x-datadog-trace-id та x-datadog-parent-id у вихідні HTTP-запити.
iOS з URLSession:
let session = URLSession(
configuration: .default,
delegate: DDURLSessionDelegate(),
delegateQueue: nil
)
Android з OkHttp:
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(
DatadogInterceptor.Builder(listOf("api.myapp.com"))
.setTraceSampler(RateBasedSampler(20f)) // 20% трейсів
.build()
)
.build()
Зверніть увагу на RateBasedSampler — для high-traffic додатків 100% трасування швидко перевищує квоту. При дебагуванні нового екрана використовуйте 100%; у продакшені 10–20% зазвичай достатньо.
На бекенді (наприклад, Node.js з dd-trace):
const tracer = require('dd-trace').init({ service: 'mobile-api' });
// dd-trace автоматично витягує x-datadog-trace-id з заголовків
У інтерфейсі Datadog APM ви побачите граф від мобільного RUM View до конкретного SQL-запиту на сервері.
Кастомні метрики та алерти
Для бізнес-метрик використовуйте addAttribute на рівні RUM View:
RUM.monitor?.addAttribute(forKey: "checkout.step", value: "payment")
RUM.monitor?.addAttribute(forKey: "cart.value", value: cartTotal)
У Datadog Monitors створіть алерт на p95(rum.view.loading_time) > 3000 для екрана оформлення замовлення — це перехоплює деградацію раніше, ніж користувачі почнуть скаржитись.
Що ми робимо
- Підключаємо SDK для iOS та Android (або Flutter через
datadog_flutter_plugin) - Налаштовуємо автоматичне відслідковування Views, Actions, Errors та Long Tasks
- Інструментуємо мережевий шар для розподілених трейсів
- Створюємо дашборди: Time to Interactive, Error Rate, p95 Network Latency за екранами
- Налаштовуємо алерти на деградацію продуктивності
Часові оцінки
Базова інтеграція з RUM та APM: 2–3 дні. Додавання кастомних бізнес-атрибутів та дашбордів — ще один день. Ціна розраховується індивідуально.







