Интеграция New Relic для мониторинга мобильного приложения (APM)
New Relic Mobile — один из немногих APM-инструментов, где мобильный клиент и бэкенд живут в одном аккаунте без дополнительной настройки корреляции. Если на бэкенде уже стоит New Relic APM, мобильная часть встраивается в ту же иерархию сущностей, и Distributed Tracing работает практически из коробки.
Установка агента
iOS через Swift Package Manager:
// Package.swift
.package(url: "https://github.com/newrelic/newrelic-ios-agent-spm", from: "7.4.0")
import NewRelic
// AppDelegate.application(_:didFinishLaunchingWithOptions:)
NewRelic.start(withApplicationToken: "AA-XXXXXXXX-XXXX")
Агент автоматически перехватывает URLSession-запросы через swizzling. Если используете кастомный URLProtocol или Alamofire с кастомными адаптерами — придётся проверить, что swizzling не конфликтует.
Android:
// build.gradle (project level)
classpath("com.newrelic.agent.android:agent-gradle-plugin:7.+")
// build.gradle (app level)
apply plugin: 'newrelic'
implementation("com.newrelic.agent.android:android-agent:7.+")
// MainActivity или Application.onCreate()
NewRelic.withApplicationToken("AA-XXXXXXXX-XXXX")
.withLoggingEnabled(false)
.start(applicationContext)
Gradle-плагин инструментирует байткод во время сборки — HTTP-вызовы через OkHttp и HttpURLConnection начинают трекаться без кода. Это удобно, но иногда вызывает проблемы с Proguard: в proguard-rules.pro нужны правила для классов com.newrelic.**.
Взаимодействие с Distributed Tracing
New Relic передаёт заголовок newrelic (W3C TraceContext) во все исходящие запросы. На бэкенде New Relic APM агент подхватывает этот заголовок и формирует единый трейс. В UI New Relic One можно открыть конкретный HTTP-запрос из мобильного приложения и провалиться в серверный трейс до уровня SQL.
Важный момент: Distributed Tracing для мобильных агентов в New Relic по умолчанию включён только для Infinite Tracing (если настроен Trace Observer). Для стандартного семплирования нужно явно включить:
NewRelic.enableFeatures([.NRFeatureFlag_DistributedTracing])
Кастомные события и атрибуты
// Кастомное событие
NewRelic.recordCustomEvent(
"CheckoutCompleted",
attributes: [
"order_id": orderId,
"total": total,
"payment_method": method
]
)
// Добавить атрибут к текущей сессии
NewRelic.setAttribute("user_plan", value: "premium")
На Android аналогично:
NewRelic.recordCustomEvent(
"CheckoutCompleted",
mapOf("order_id" to orderId, "total" to total)
)
Кастомные события попадают в NRQL — язык запросов New Relic. Например:
SELECT count(*) FROM CheckoutCompleted
FACET payment_method
SINCE 7 days ago
TIMESERIES
Отслеживание ошибок и крэшей
New Relic Mobile собирает крэши автоматически. Handled exceptions записываем явно:
do {
try performPayment()
} catch {
NewRelic.recordError(error, attributes: ["context": "checkout"])
}
Крэш-репорты в New Relic включают Thread State для всех потоков, Application Not Responding события и Breadcrumb Trail — последовательность навигационных и сетевых событий до момента краша.
Дашборды и алерты
New Relic Alerts позволяет настроить NRQL-условия:
-- Алерт если crash-free rate упал ниже 99.5%
SELECT percentage(count(*), WHERE crashCount = 0)
FROM MobileSession
WHERE appName = 'MyApp'
В отличие от Firebase Crashlytics, здесь можно настроить алерт не просто на количество крэшей, а на бизнес-метрику — например, падение конверсии checkout коррелирующее с network error rate.
Что делаем
- Подключаем агент iOS/Android (или React Native через
@newrelic/react-native-agent) - Верифицируем корректность HTTP-автоинструментации
- Настраиваем Distributed Tracing с бэкенд-агентом
- Создаём кастомные события под бизнес-воронку
- Конфигурируем NRQL-алерты с нотификацией в Slack/PagerDuty
Сроки
Базовая интеграция с автоинструментацией: 1–2 дня. Кастомные события и дашборды: ещё 1 день. Стоимость рассчитывается индивидуально.







