Мы уже рассказывали в блоге об открытых разработках исследователей Университета ИТМО. Например, об инструменте для поиска генов устойчивости к антибиотикам и приложении, позволяющем анализировать бизнес-процессы.
В этот раз мы поговорим о Hawk ― сервисе, который автоматически анализирует код и отслеживает в нем ошибки.
Как все начиналось
Больше 7 лет назад студенты ИТМО и других петербургских вузов объединились, чтобы научиться не только программировать, но и создавать полноценные продукты, грамотно их упаковывать и выводить на рынок. На этой площадке выросла команда CodeХ ― сообщество энтузиастов, создающих open sourсe решения. Ядро команды состоит из студентов и преподавателей факультета безопасности информационных технологий (под руководством декана факультета Данила Заколдаева) ИТМО и компании “Комитет”.
Один из главных продуктов разработчиков ― Hawk ― программа, позволяющая мониторить работу и эмулирующая режим run-time.
Поговорим подробнее об этом приложении.
В общей сложности работа над сервисом заняла пять лет. Первая версия Hawk появилась в 2017 году в результате одного из хакатонов, которые CodeX регулярно устраивал в образовательных целях.
Как рассказывают авторы проекта, им был нужен «отловщик» ошибок в коде, а покупать и использовать готовое решение (например, Sentry) было неинтересно. Позже они пришли к выводу, что такой сервис был бы полезен не только внутри команды, но и для сторонних разработчиков.
Первая версия сервиса оказалась не слишком удобной и при первом же тестировании на сторонних ресурсах не выдержала нагрузки от пользователей (Тогда количество приходящих в Hawk событий начало очень сильно расти ― это тормозило работу и делало его неустойчивым. Так что команде пришлось полностью переписать его архитектуру). На реализацию полноценного продукта ушло несколько лет: работать над новой версией начали в 2018 году, закончили – в 2022. По словам команды, очень много времени ушло на разработку функционала, добавление и доработку кэтчеров, а потом на выстраивание работы и организации архитектуры.
Hawk ловит ошибки любого характера ― синтаксис, логика, аргументы, компиляция, runtime ― иными словами, все которые могут появиться в коде.
После обнаружения, владельцу проекта приходит уведомление внутри Hawk, также можно подключить уведомления через бота в Телеграм, в Slack или на электронную почту. В уведомлении отображено название ошибки и части проекта, в котором она обнаружена. Внутри Hawk ― детализированная информация вплоть до строки, времени и первопричины.
Как устроен сервис
Изначально идея выглядела просто: специальный скрипт (кэтчер) вешает глобальный обработчик ошибок в приложении и отправляет пойманные события в Гараж — сервис для просмотра собранной информации. Прототип был готов за два дня. Это было монолитное node.js приложение, а также несколько кэтчеров под основные языки программирования. Затем разработчики добавили авторизацию, систему воркспейсов и проектов, настройки команд для упорядочивания работы пользователей, попутно они создали кэтчеры под базовые языки: PHP, JavaScript, Node.js, Python, Scala, Java и Kotlin.
Также был разработан Архивер, инструмент, который удаляет выходящие за лимит ошибки по принципу FIFO — это позволяло не забивать сразу же место на диске.
Чтобы решить проблемы высокой нагрузки, авторы программы переработали архитектуру с монолитной к микросервисной архитектуре. Она уменьшила связность сервисов и обеспечила устойчивость к нагрузке.
"Узкое место — сервис приемки ивентов "Коллектор" — делает минимум операций. Его задача получить ивент, валидировать структуру и передать в очередь на обработку. Коллектор написан на Go. Система воркеров позволяет создавать самостоятельные микро-сервисы для фоновой обработки задач. Воркеров можно масштабировать: увеличивать количество, выносить на мощные сервера. Трафик ивентов никак не влияет на работу клиентов (Web, Desktop, Mobile) Публичный API, уведомления, обработчики ошибок, Архивер и остальные части не влияют на работу друг друга. База ивентов и база аккаунтов (воркспейсов, проектов, настроек) разделены. У базы ивентов есть отдельные реплики для чтения", — делится Виталий Гурын, проджект-менеджер и разработчик в CodeX.
Вместе с новой архитектурой сервиса и новым кодом появился и новый дизайн.
Новый подход к решению проблем воркспейсов
Авторы приложения решили две проблемы, которые присутствуют в большинстве сервисов, имеющих разделение на воркспейсы или подобные сущности.
В сервисах, где пользователь состоит в нескольких воркспейсах, присутствует проблема с потерей контекста при переключении. По умолчанию открыт один раздел (Воркспейс, Проект), при этом не видно, что происходит в соседних. Максимум, что видно — бейдж с количеством уведомлений. Мониторить активность сразу в нескольких рабочих пространствах не получится. А при переключении между ними теряется контекст предыдущего.
”Наше решение легче в подключении, работе, понимании и использовании. Если сравнивать Hawk с Sentry (сервис позволяет удаленно мониторить баги в фронтенд-приложениях, написанных на JavaScript), то последний — бритва Спутник — бреет, но с трудом и неудобством, а Hawk все равно что бритва Gillette — легкая, изящная, с красивым дизайном, движется под профиль хозяина”, — говорит Виталий Гурын.
Разработчики Hawk дали возможность видеть сразу все воркспейсы одновременно. Лэйаут программы похож на мессенджер: слева выводится список проектов, которые поднимаются наверх при получении новых ивентов. Справа — список ивентов в проекте. Кнопки воркспейсов работают как фильтры — скрывают из списка проектов те, что не принадлежат воркспейсу.
Таким образом у нас появилось динамичное представление ситуации во всех проектах. Даже если ошибка произойдет в старом, давно добавленном проекте, мы ее увидим, так как проект "всплывет" наверх.
Ивенты в Hawk группируются по дням: видно, сколько раз событие выпало в конкретный день, как развивается ситуация сегодня.
Просмотр информации об ивенте тоже был доработан. Здесь выводятся собранные данные, которые помогают найти и устранить проблему.
«Надо отметить, что это не какой-то статический сканер, который анализирует код и говорит: вот здесь ошибка. Это происходит в режиме run-time. То есть пользователь заходит на сайт, нажимает что-то и видит, что ничего не происходит. Его действия фиксируются в логах ― Hawk может отловить эту информацию и показать разработчикам, на какой странице произошла ошибка, что пользователь делал и так далее. По сути, программа заменяет репорты от пользователей или работу тестировщиков. Это позволяет производить мониторинг ошибок и получать уведомления в автоматическом режиме», ― объясняет Никита Мельников, devops-разработчик в CodeX.
С ростом количества обрабатываемых ошибок растет и стоимость поддержки инфраструктуры. Чтобы проект окупал затраты, была разработана система тарифных планов. Сервис обрабатывает до 100 000 ошибок в месяц бесплатно — это подойдет для большинства небольших проектов. А для крупных клиентов, ощутимо влияющих на инфраструктуру, предусмотрены несколько платных планов.
Команда тестировала программы на продуктах компании “Комитет” ― сайтах TJ, DTF, Coub, VC. В этих проектах Hawk ловил системные и серверные ошибки – неверное отображение контента, тормоза в загрузке. Кроме того, CodeX интегрировала приложение в другой собственный проект, редактор Editor.js. Это позволило понять, как можно объединять функционалы разных сервисов и найти ошибки, о которых раньше разработчики могли и не узнать.
Планы на будущее
На данный момент решение поддерживает JS, Ruby, PHP, GO, Node.js, Scala, Python, Kotlin, в скором времени авторы проекта планируют добавить поддержку Java и Swift.
CodeX открыта к обратной связи и готова развивать Hawk, если он найдет отклик у пользователей. Также разработчики готовы сотрудничать и обсуждать совместные проекты. Оставляем контакты команды для связи: team@codex.so и peter@codex.so (Петр Савченко, хед команды).
edo1h
self-hosted варианта не планируется?
хотелось бы увидеть нормальное сравнение с sentry