Интеграция 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 — manual View tracking в 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)
)
Распределённая трассировка mobile → backend
Самая ценная часть — связать мобильный запрос с серверным трейсом. Для этого Datadog SDK инжектирует заголовки 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 из заголовков
В UI 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 дня. Добавление кастомных бизнес-атрибутов и дашбордов — ещё день. Стоимость рассчитывается индивидуально.







