CodeX
CodeX

Мы уже рассказывали в блоге об открытых разработках исследователей Университета ИТМО. Например, об инструменте для поиска генов устойчивости к антибиотикам и приложении, позволяющем  анализировать бизнес-процессы. 

В этот раз мы поговорим о 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 — это позволяло не забивать сразу же место на диске.

Чтобы решить проблемы высокой нагрузки, авторы программы переработали архитектуру с монолитной к микросервисной архитектуре. Она уменьшила связность сервисов и обеспечила устойчивость к нагрузке.

Новая архитектура Hawk
Новая архитектура Hawk

"Узкое место — сервис приемки ивентов "Коллектор" — делает минимум операций. Его задача получить ивент, валидировать структуру и передать в очередь на обработку. Коллектор написан на Go. Система воркеров позволяет создавать самостоятельные микро-сервисы для фоновой обработки задач. Воркеров можно масштабировать: увеличивать количество, выносить на мощные сервера. Трафик ивентов никак не влияет на работу клиентов (Web, Desktop, Mobile) Публичный API, уведомления, обработчики ошибок, Архивер и остальные части не влияют на работу друг друга. База ивентов и база аккаунтов (воркспейсов, проектов, настроек) разделены. У базы ивентов есть отдельные реплики для чтения", —  делится Виталий Гурын, проджект-менеджер и разработчик в CodeX.

Вместе с новой архитектурой сервиса и новым кодом появился и новый дизайн.

Новый дизайн Hawk
Новый дизайн Hawk

Новый подход к решению проблем воркспейсов

Авторы приложения решили две проблемы, которые присутствуют в большинстве сервисов, имеющих разделение на воркспейсы или подобные сущности.

В сервисах, где пользователь состоит в нескольких воркспейсах, присутствует проблема с потерей контекста при переключении. По умолчанию открыт один раздел (Воркспейс, Проект), при этом не видно, что происходит в соседних. Максимум, что видно — бейдж с количеством уведомлений. Мониторить активность сразу в нескольких рабочих пространствах не получится. А при переключении между ними теряется контекст предыдущего.

В Slack, Discord, Jira, Sentry и других приложениях присутствует эта проблема. Мы видим только то, что происходит в одном выбранном воркспейсе.
В Slack, Discord, Jira, Sentry и других приложениях присутствует эта проблема. Мы видим только то, что происходит в одном выбранном воркспейсе.

”Наше решение легче в подключении, работе, понимании и использовании. Если сравнивать Hawk с Sentry (сервис позволяет удаленно мониторить баги в фронтенд-приложениях, написанных на JavaScript), то последний —  бритва Спутник —  бреет, но с трудом и неудобством, а Hawk все равно что бритва Gillette — легкая, изящная, с красивым дизайном, движется под профиль хозяина, — говорит Виталий Гурын.

Разработчики Hawk дали возможность видеть сразу все воркспейсы одновременно. Лэйаут программы похож на мессенджер: слева выводится список проектов, которые поднимаются наверх при получении новых ивентов. Справа — список ивентов в проекте. Кнопки воркспейсов работают как фильтры — скрывают из списка проектов те, что не принадлежат воркспейсу.

Таким образом у нас появилось динамичное представление ситуации во всех проектах. Даже если ошибка произойдет в старом, давно добавленном проекте, мы ее увидим, так как проект "всплывет" наверх.

Ивенты в Hawk группируются по дням: видно, сколько раз событие выпало в конкретный день, как развивается ситуация сегодня.

Ивенты в 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 (Петр Савченко, хед команды).

Комментарии (1)


  1. edo1h
    31.03.2022 02:50

    Сервис обрабатывает до 100 000 ошибок в месяц бесплатно

    self-hosted варианта не планируется?


    Если сравнивать Hawk с Sentry (сервис позволяет удаленно мониторить баги в фронтенд-приложениях, написанных на JavaScript), то последний — бритва Спутник — бреет, но с трудом и неудобством, а Hawk все равно что бритва Gillette — легкая, изящная, с красивым дизайном, движется под профиль хозяина

    хотелось бы увидеть нормальное сравнение с sentry