Критические сбои (CRASH
) и блокировки основного потока (ANR
) являются двумя самыми распространенными проблемами в Android-приложениях. События типа CRASH обозначают неожиданное или аварийное завершение работы приложения из-за ошибки или необработанного исключения. ANR возникает, когда основной поток (UI-поток) приложения блокируется на длительное время и не отвечает на определенные действия (для Android-приложений это обычно 5 секунд). Возникнуть такая ситуация может, например, из-за долгой операции ввода-вывода или блокирующего запроса к базе данных. Помимо негативного пользовательского опыта возникновение таких проблем может привести к потере данных, а потому требует эффективных механизмов и инструментов для их обнаружения и решения.
Tracer предоставляет набор инструментов, которые позволяют отслеживать не только сбои и блокировки основного потока вашего приложения, но и ошибки, возникшие в коде на языке нативного программирования (NATIVE
), и некритические сбои или ошибки загрузки данных (NON_FATAL
). За отправку данных о событиях типа CRASH, ANR и NATIVE отвечает CrashReportConfiguration. Для репортинга NON_FATAL-ов есть отдельный инструмент.
Для того, чтобы оценить надежность приложения и его способность сохранять работоспособность в течение продолжительного периода, Tracer позволяет рассчитывать crash-free
– процент пользователей, у которых не возникало сбоев в работе приложения за выбранный период. Отвечает за фичу CrashFreeConfiguration. Рассчитывается метрика как (1 - (Пользователи со сбоем / Все пользователи)) * 100%
. При этом важно понимать, что использование приложения на разных устройствах одного пользователя или переустановка приложения на текущем устройстве будут обозначены ка к самостоятельные единицы при расчётах. Отчёты о полученных Tracer-ом сбоях и графики по событиям можно найти в разделе «Сбои».
ВАЖНО! Tracer хранит данные о событиях за последние 90 дней.
В вашем <project>/<app-module>/build.gradle.kts
:
dependencies { implementation(platform("ru.ok.tracer:tracer-platform:0.5.1")) implementation("ru.ok.tracer:tracer-crash-report") }
Если вы хотите дополнительно поддержать сбор и анализ нативных крэшей, следует подключить соответствующую зависимость:
В вашем <project>/<app-module>/build.gradle.kts
:
dependencies { implementation(platform("ru.ok.tracer:tracer-platform:0.5.1")) implementation("ru.ok.tracer:tracer-crash-report-native") }
Чтобы Tracer генерировал человекочитаемые стектрейсы, необходимо включить загрузку отладочной информации из нативных библиотек. Подробнее о зависимостях и включении загрузки символов из библиотек — на странице Быстрый старт
После подключения зависимостей следует установить плагины в конфигурацию Tracer:
В вашем Application.kt
:
class MyApplication : Application(), HasTracerConfiguration { override val tracerConfiguration: List<TracerConfiguration> get() = listOf( CrashReportConfiguration.build { // ваши опции }, CrashFreeConfiguration.build { // ваши опции }, ) }
На данный момент в CrashReportConfiguration
есть несколько параметров, отвечающих за отправку событий определенных типов. Настроить эти параметры можно при помощи опций CrashReportConfiguration.Builder
:
Опция | Описание |
---|---|
setEnabled | Отвечает за включение/выключение отправки сбоев (CRASH). По умолчанию включена. |
setSendAnr | Отвечает за включение/выключение отправки ANR. По умолчанию включена. |
setNativeEnabled | Отвечает за включение/выключение отправки нативных крэшей (NATIVE). Значение по умолчанию зависит от того, подключена ли зависимость tracer-crash-report-native . Если подключена, то и репортинг по умолчанию включен. Если не подключена – выключен. ВАЖНО! Включить репортинг нативных крэшей без подключения соответствующей зависимости не выйдет, а вот выключить репортинг при наличии зависимости – пожалуйста. |
Пер ед настройкой CrashFreeConfiguration
убедитесь, что вы включили отправку крэшей в CrashReportConfiguration
, иначе использование этого плагина будет бесполезно.
Опции CrashFreeConfiguration.Builder
:
Опция | Описание |
---|---|
setEnabled | Отвечает за включение/выключение подсчёта crash-free users . По умолчанию включен. |
Опасные опции CrashFreeConfiguration.Builder
– используйте с умом:
Опция | Описание |
---|---|
setExperimentalMaxSessionsToUpload | Позволяет установить количество сессий, которое должно накопиться для отправки батча. По умолчанию установлено 10. Рекомендуется использовать только для тестов! |
setExperimentalMaxSessionTimeSpanToUpload | Позволяет указать, как долго следует копить сессии для отправки батча. По умолчанию установлено 4 часа (в ms). Рекомендуется использовать только для тестов! |
setExperimentalUploadSessionsFromYesterday | Устарела и больше не используется |
Для отправки NON_FATAL
-ов используется метод TracerCrashReport.report
, принимающий в качестве параметра объект Throwable
:
// Залоггировать не фатальную ошибку. TracerCrashReport.report(NonFatalException("I'll be ok soon"))
По умолчанию все сбои группируются по общим частям стектрейса, но в случае non-fatal'ов такая групп ировка является на самой эффективной. Дело в том, что не всегда стектрейс и место, в котором залогировали ошибку, связаны между собой. Чтобы избежать замусирования сбоев большим количеством non-fatal'ов существует способ повлиять на эту группировку и собрать все non-fatal'ы одного вида ошибки в одну группу при помощи специального ключа issueKey
. Этот параметр также будет отображаться в названии события.
Преимущество issueKey в том, что не только вы сможете легко найти non-fatal'ы, относящиеся к конкретной проблеме, но и другие разработчики смогут легко найти по ключу точку логирования этой ошибки (и удалить при необходимости) и отследить его в вашем issue-трекере.
Чтобы установить ключ, воспользуйтесь методом TracerCrashReport.report
с параметром issueKey
:
// Залогировать нефатальную ошибку с ключом ISSUE-001 TracerCrashReport.report(NonFatalException("What a terrible failure"), issueKey = "ISSUE-001")
ВАЖНО! На текущий момент в Tracer есть лимит в 1 млн событий в день. Поэтому рекомендуется не злоупотреблять этим методом.
Tracer также предоставляет ряд инструментов, позволяющих расширить объем данных, которые вы можете отправлять вместе с событиями. Подробнее о том, как добавить дополнительную информацию, читайте тут.