NON_FATAL aka пользовательские ошибки

За работу с NON_FATAL или пользовательскими ошибками отвечает FeatureConfiguration.assertReporter.

Подключение зависимостей к проекту

Для cocoapods Podfile:

source 'https://github.com/odnoklassniki/tracer-ios.git' pod 'OKTracer'

Способы инициализации

Для создания и запуска Tracer используются TracerFactory – статическая фабрика для удобства создания типовых настроек, и TracerService – он объединяет все сервисы и возможности и обрабатывает их делегаты. Существует несколько способов добавления .assertReporter в Configuration при создании TracerService.

  • Через стандартные опции TracerFactory:

Данный метод неявно добавляет .assertReporter в Configuration.

let tracerService = TracerFactory.tracerServiceForCrashReporting(token: "Ваш appToken")
  • Через список опций features:

Можно передать явно .assertReporter в параметр features при создании TracerService:

let tracerService = TracerFactory.tracerService(token: "Ваш appToken", features: [.assertReporter()])
  • Через создание Configuration:

Создайте собственный Configuration с необходимыми настройками и передайте его в качестве параметра в TracerService:

let configuration = Configuration(token: "Ваш appToken", features: [.assertReporter()]) let tracerService = TracerFactory.tracerService(configuration: configuration)

Описание FeatureConfiguration.assertReporter()

За инициализацию .assertReporter отвечает TracerAssertReporterConfiguration – в ней есть несколько параметров, отвечающих за отправку событий определенных типов.

ПараметрТипОписание
maxUploadsCountIntМаксимальное количество отчетов в вытесняющейся очереди. По умолчанию 10.
sendEveryIntОтвечает за фильтрацию событий на случай, если за сессию фиксируется несколько эквивалентных друг другу событий. По умолчанию 0, что эквивалентно включению фичи – будет отправлен каждый NON_FATAL.

Отправка событий NON_FATAL

Для отправки NON_FATAL-ов используется метод send(), принимающий в качестве параметра объект TracerNonFatalModel.

Существует несколько способов использования метода send():

let nonFatal = TracerNonFatalModel(message: "User error") tracerService.send(nonFatal: nonFatal)

Вариант #2 полезен в том случае, если какое-либо из полей fileName, function или line модели может оказаться nil. При таком сценарии nil-параметр перезапишется соответствующим параметром метода.

ВАЖНО! На текущий момент в Tracer есть лимит в 1 млн событий в день. Поэтому рекомендуется не злоупотреблять этим методом.

Описание TracerNonFatalModel

ПараметрТипОписание
messageStringСообщение, которое будет передано вместе с событием.
tags[String: String] = [:]Дополнительная информация в формате «Ключ – Значение». Отображается во вкладке Ключи внутри события.
properties[String: String] = [:]Дополнительная информация в формате «Ключ – Значение». Отображается во вкладке Данные внутри события.
fileNameString?Имя файла, при выполнении которого зафиксирована ошибка.
functionString?Имя функции, при выполнении которой зафиксирована ошибка.
lineInt?Номер строки, при выполнении которой зафиксирована ошибка.
issueKeyString?Специальный ключ, влияющий на группировку событий в общем списке.
traceTypeInternalTraceTypeИсточник информации о выполняемом потоке, в котором зафиксирована ошибка. По умолчанию current.

Параметр traceType

ТипОписание
currentИспользует текущее имя потока и текущий стектрейс, обрезая несколько фреймов с начала.
customИспользуется, когда у Вас уже есть стектрейс и его нужно обернуть в событие. К стектрейсу также можно добавить символы (есть нюансы, подробнее в статье Символизация).

dropFirstSymbols работает аналогично current, только теперь применяется и к символам, и к стектрейсу. Помимо этого есть возможность задать своё имя потока. Если этого не сделать, будет использоваться текущее, как в current.

Параметр issueKey

По умолчанию все сбои группируются по общим частям стектрейса, но в случае non-fatal'ов такая группировка является на самой эффективной. Дело в том, что не всегда стектрейс и место, в котором залогировали ошибку, связаны между собой. Чтобы избежать замусирования сбоев большим количеством non-fatal'ов существует способ повлиять на эту группировку и собрать все non-fatal'ы одного вида ошибки в одну группу при помощи специального ключа issueKey. Этот параметр также будет отображаться в названии события.

Преимущество issueKey в том, что не только вы сможете легко найти non-fatal'ы, относящиеся к конкретной проблеме, но и другие разработчики смогут легко найти по ключу точку логирования этой ошибки (и удалить при необходимости) и отследить его в вашем issue-трекере.

Для того чтобы все NON_FATAL-ы попали в одну группу вне зависимости от стектрейса, можно передать специальный ключ issueKey отдельным параметром или в числе properties. После этого появится возможность фильтровать события по данному ключу в общем списке событий.

issueKey как самостоятельный параметр:

let nonFatal = TracerNonFatalModel(message: "User error", issueKey: "IOS-100100") tracerService.send(nonFatal: nonFatal)

issueKey как элемент properties:

let properties = ["issueKey": "IOS-100100", "someProperty": "someValue"] let nonFatal = TracerNonFatalModel(message: "User error", properties) tracerService.send(nonFatal: nonFatal)

Дополнительные возможности

После создания модели на этапе отправки происходит дополнительный процессинг properties на стороне SDK. В связи с этим следует избегать использования некоторых названий ключей, так как вследствие обработки они могут быть перезаписаны:

  • Ключ message - сюда SDK всегда записывает message события.
  • Ключ file - сюда SDK может записывать комбинацию из fileName, function и line. Необходимым условием является наличие хотя бы одного из перечисленных параметров.
  • Ключ issueKey.