Tracer — модульный инструмент для аналитики ошибок в мобильных приложениях от OK.Tech, который мы представили год назад. За это время в Tracer зарегистрировалось более 1500 организаций и 5000 пользователей. Сейчас решение обрабатывает более 1 млрд событий в день и обслуживает приложения, которые имеют суммарный DAU в 20 млн пользователей. Опыт наших клиентов показывает, что Tracer успешно справляется с поставленными задачами, но мы всё равно не останавливаемся на достигнутом.
Меня зовут Кирилл Попов. Я руководитель направления Android-разработки в ОК. В этой статье я расскажу, какие возможности получил инструмент за последний год, и что мы планируем реализовывать в перспективе.
Немного о Tracer
Tracer — инструмент для аналитики ошибок в мобильных приложениях. С его помощью можно собирать данные о крешах и зависаниях приложений, находить утечки памяти в приложении и на диске. Tracer также умеет профилировать приложения в проде для поиска критических мест в производительности. Причем Tracer ориентирован не только на выявление проблем, но и на обнаружение их причин. То есть, показывает не просто, что есть ошибка, но и где она локализуется и как ее можно исправить.
Примечательно, что Tracer — модульный инструмент. То есть можно по выбору использовать его конкретные компоненты, чтобы наиболее эффективно решать каждую возникающую проблему с ее особенностями.
При этом, инструмент — мультиплатформенный:
в паблике уже доступны версии для Android и iOS;
для внутренних задач ОК и бизнес-юнитов VK уже используются версии под Java, JS и С/С++ (Windows, Linux, Mac);
В части функциональности Tracer закрывает все основные сценарии аналитики ошибок в мобильных приложениях.
Креши
Инструмент показывает место падения и дополнительную информацию, которая помогает в устранении ошибки. При этом Tracer значительно быстрее и функциональнее конкурентов в части поиска, анализа, агрегации, группировки ошибок.
Утечки памяти
Решение помогает обнаруживать критические утечки оперативной памяти в приложении.
Причем в инструменте реализована аналитика двух видов:
можем с помощью Leak Canary показывать конкретные утечки, приводящие к крешам у пользователей;
умеем собирать дамп памяти с конечных устройств пользователя, удалять приватную информацию и формировать граф объекта для дальнейшего анализа.
Профилирование
В Tracer также есть два вида профайлеров.
В первом случае это классический профайлер у пользователя. То есть, возможность подключения к конкретному устройству для поиска проблем с производительностью.
Второй вид — сэмплирующий профайлер, с помощью которого можно даже анализировать и отображать методы, которые работают в приложении медленнее остальных.
Утечки файлов
Помимо прочего, Tracer умеет находить утечки файлов. Это особенно полезно, если в процессе разработки команда забывает «чистить лишние» файлы, из-за которых неоправданно растет размер приложения на пользовательских устройствах.
Важно, что это далеко не весь функционал Tracer, но основная и наиболее востребованная его часть, которой клиенты могли пользоваться с момента первого релиза.
Теперь же перейдем к тому, что появилось в Tracer в течение прошедшего года.
Что нового в Tracer
В процессе развития Tracer мы определяли приоритеты, исходя из запросов реальных пользователей инструмента. Поэтому каждая добавленная функция сделана не «для галочки», а имеет прикладное значение.
Поддержка A/B-экспериментов
Теперь в Tracer реализована поддержка A/B-экспериментов. Так, можно указать через инструмент название экспериментов, пользователей и группы, к которым они относятся, а дальше сравнить ошибки в тестовой и контрольной группе.
На выходе решение формирует подробные отчеты, по которым можно легко оценить, как тестируемые фичи или гипотезы влияют на отказоустойчивость приложения и количество ошибок: какие ошибки появляются, где возникают проблемы, что именно меняется.
Фильтры по ключ/значение
Tracer получил обновленный алгоритм фильтрации по ключ/значению. Он был изначально, еще в момент первого релиза, но пользоваться механизмом было неудобно — нужно было писать запросы с помощью специфического синтаксиса.
Теперь механика изменилась — мы изначально показываем все ключи, значения и проперти, которые есть в приложении, и позволяем отфильтровывать их в соответствии с задачей.
Это удобнее. Более того, значения для фильтров пересчитываются на основании уже активных фильтров. Таким образом можно исследовать, какая есть зависимость между ошибками и установками из конкретных магазинов приложений, устройствами, вендорами и так далее.
Модификатор «В фоне»
Зачастую ошибки ANR (Application Not Responding) фиксируются при старте приложения, когда стартует объект application. Это обусловлено тем, что application стартует при любом обращении системы к приложению. И, так как приложение запускается в фоне, ему дают меньше ресурсов CPU и ограниченный квант времени. В результате, если приложение не успело запуститься — оно получает ANR.
Изначально Tracer и аналогичные решения умели отлавливать все ANR. Но никто не умел отделять некритичные зависания «В фоне» от критичных, видимых юзеру. Теперь Tracer это умеет.
Для этого в Tracer был добавлен отдельный фильтр «В фоне», с помощью которого можно показать только те ANR, которые видел пользователь.
Причем фильтр работает в обе стороны:
значение «В фоне: True» — показываются ANR в фоне;
значение «В фоне: False» — показываются ANR в видимых пользователю экранах.
Примечательно, что эта функция помогла нам самим выявить несколько довольно существенных для наших пользователей проблем и заблаговременно устранить их.
Stack-графики
Также мы прокачали графики. Теперь они рисуются в виде стека — то есть каждый последующий «накладывается» поверх предыдущего. Это упрощает отслеживание динамики изменения показателей на каждом из этапов.
Помимо этого, в инструменте появилась группировка — можно смотреть не только на версии приложений, которые аффектят ошибку, но и на другие срезы. Например, на срезы по вендорам и версиям операционной системы. Причем поддерживаются даже кастомные поля, которые нужны в конкретном проекте.
Поиск по userID
Среди прочего мы прокачали и поиск по userID. Так, раньше (с момента первого релиза) можно было указывать фильтр по пользователю и отображать на главном экране ошибки, которые относятся к нему. Но мы решили пойти дальше.
Теперь у нас появился отдельный экран как из главного приложения, так и из списка данных конкретного креша.
Из этой «точки входа» можно попасть в специальный экран, где ошибки расположены в хронологическом порядке.
Стоит отметить, что в отличие от конкурентных решений, Tracer отображает не только креши, но и ошибки любого типа, связанные с конкретным пользователем. Благодаря этому можно отследить, с какими ошибками и когда сталкивался пользователь, что очень полезно, например, для расследования инцидентов.
Crash variants
Изначально в Tracer не была реализована функциональность для работы с crash variants — мы считали, что предоставленного анализа ошибок будет достаточно. Но на практике оказалось, что иногда даже обнаружение ошибки не позволяет определить ее первопричину — для этого надо «откатываться» в стек-трейсе на предыдущие шаги и перебирать множество вариантов «реальных виновников» креша.
Соответственно, для этого нужна фича crash variants, которую мы и реализовали в Tracer. Теперь пользователям доступны подробные отчеты по каждой ошибке.
Для наглядности в каждую ошибку можно зайти и подробно изучить все варианты первопричин ее появления.
Советы от LLM
Помимо непосредственно технических доработок и новых функций, пользователям Tracer стал доступен встроенный «интеллектуальный помощник» с нейросетями «под капотом». К нему можно обратиться за разъяснением по поводу сути обнаруженной проблемы и даже вариантов ее устранения.
Причем помощник понимает вопросы и может давать ответы как на русском, так и на английском языке. Безусловно, полностью полагаться на ответы помощника не стоит, но это отличный способ сократить время на поиск нужной информации.
Примечание: Из-за разной скорости обучения нейросети, ответы на русском и английском языке могут отличаться — это не баг, а особенность машинного обучения.
Поддержка TraceProcessor
В рамках расширения возможностей Tracer мы научились выгружать внутренние представления в формате, который понимает утилита TraceProcessor от Google, чем обеспечили совместимость с инструментом.
Поскольку TraceProcessor позволяет делать SQL-запросы к выбранному дампу профилирования, теперь по данным из Tracer легко отслеживать все проблемы и зависания — например, методы и секции, которые работали дольше установленного времени.
Примечательно, что набор методов в TraceProcessor довольно большой, поэтому возможности анализа выгруженных из Tracer данных практически не ограничены.
Сервисные аккаунты
Среди новых опций Tracer, пока еще не выгруженных в публичный доступ, — возможность создания сервисных аккаунтов (ботов), через которые можно напрямую общаться с нашим API.
Что это дает? Например, в Firebase Crashlytics, чтобы делать сложные запросы для поиска по данным, нужно настроить выгрузку ошибок в Google Cloud, а после еще и платить за Cloud Functions. Это избыточно сложно и не всегда дешево.
С внедрением поддержки сервисных аккаунтов в Tracer необходимость выгрузки ошибок «вовне» отпадает — инструмент позволяет сразу делать практически любые поисковые запросы, независимо от их сложности.
Примечание: Формат внедрения фичи и доступа к ней (платный или бесплатный) пока не определен — пользователи Tracer будут уведомлены об этом дополнительно.
Единый раздел пользователей
Среди новых опций инструмент также получил единый раздел пользователей. Так, раньше человека надо было приглашать в каждый конкретный проект, что не всегда удобно и быстро. Сейчас алгоритм изменился — теперь у администратора есть отдельная вкладка, где можно посмотреть всех пользователей и, при необходимости пригласить их во все нужные приложения или вообще во всю организацию.
Это значительно упрощает администрирование и коллективную работу с инструментом.
Краткие итоги и планы на будущее
Tracer динамично развивается на протяжении всего года — в этот процесс активно вовлечена вся команда продукта. И это дает результаты — инструмент уже использует большинство бизнес-юнитов VK и множество внешних клиентов.
Сейчас мы продолжаем работать над расширением возможностей Tracer. Приоритетными задачами для нас являются:
поддержка новых языков и платформ (в первую очередь, Python, Go и Flutter);
внедрение новых инструментов аналитики ошибок (например, для анализа работы с базой, аккумулятором, сетью и другими);
добавление новых методов аналитики производительности и не только;
разработка on-premise-версии Tracer, которую компании смогут разворачивать на своем железе (если хотите поучаствовать в закрытой бете — пишите мне в телеге @sk1talec).
О том, как мы будем справляться с поставленными задачами и что еще привнесем в Tracer, обязательно напишем отдельно — следите за нашими публикациями.
Если ты хочешь стать частью нашей команды и внести вклад в разработку Tracer — милости просим. Все актуальные вакансии можно найти здесь.