Squzy — Бесплатная Система Самостоятельного Мониторинга С Открытым Исходным Кодом, Инцидентами И Уведомлениями.

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

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

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

И в этом посте мы хотим познакомить вас с получившимся продуктом.



Технические детали

Для разработки была выбрана микросервисная архитектура.

Бэкенд разработан на GoLang — быстром и удобном языке разработки микросервисов.

Мы использовали gRPC для связи между сервисами.

Помимо того, что gRPC работает по HTTP/2 со всеми вытекающими, описание сервисных интерфейсов через proto позволит вам как пользователям создавать собственные реализации отдельных частей системы, если возникнет такая необходимость.

Проект использует Mongo в качестве базы данных быстрого доступа и Postgres для хранения собранной статистики.

Для сборки и развертывания использовался Базель.

Bazel позволяет декларативно описывать зависимости и отношения между пакетами в Golang. Кроме того, мы начали тестировать Bazel с удаленным кэшем, что положительно сказывается на скорости работы системы.

Также Bazel собирает все приложения в Docker и организует Unit-тестирование.

Все это интегрировано в действия Github. Панель управления системы написана на Angular 9. Мы стараемся держать высокую планку в модульных тестах; на данный момент охвачена каждая сущность.

В ближайшее время мы планируем реализовать интеграционные и E2E-тесты для обеспечения максимально полной поддержки системы.



Описание системы

Как уже говорилось выше, Squzy — это набор взаимодействующих друг с другом микросервисов, каждый из которых занимается отдельной задачей.

Список услуг:

  • Agent Client — клиент, развернутый на устройстве.

    Собирает информацию о процессоре, загрузке памяти и сетевых связях.

    Отправляет информацию на сервер агентов.

  • Сервер агентов — это процессор информации, поступающей от клиента.

    Собирает список клиентов в Mongo и передает информацию от агентов в Storage.

  • Мониторинг приложений — мониторинг приложений, осуществляемый путем добавления модулей/пакетов Squzy в приложения, собирающие информацию о транзакциях.

    В настоящее время поддерживаются GoLang и NodeJS, в краткосрочной перспективе — реализации PHP и Java.

  • Мониторинг - мониторинг внешних/внутренних сервисов.

  • Хранилище — сервис для доступа к собранной статистике.

    Текущая реализация использует Postgres, но в будущем планируется переход на ClickHouse.

  • Incident Manager – обработка инцидентов.

    Система позволяет пользователю создавать собственные правила обработки нештатных ситуаций (подробнее об этом мы расскажем чуть позже).

    Сами правила хранятся в Mongo, а инциденты, если они происходят, переносятся в Storage.

  • Notification Manager — сервис для оповещения пользователей в случае инцидента.

    В настоящее время поддерживает уведомления в Webhook и Slack.

  • API - это API-шлюз для системы.

Схема взаимодействия сервиса выглядит следующим образом:

Squzy — бесплатная система самостоятельного мониторинга с открытым исходным кодом, инцидентами и уведомлениями.
</p><p>

Для демонстрации возможностей Squzy была разработана демо-версия, которая контролирует собственный сервер и позволяет следить за системой на приборной панели: https://demo.squzy.app/ .

Некоторые функции, такие как добавление/удаление новых объектов, в демо-версии отключены, но она позволяет вам видеть и трогать все части системы.

Ниже мы остановимся подробнее на каждом виде мониторинга.

Эта часть системы отвечает за внешние/внутренние проверки.

На данный момент он позволяет отправлять запросы и ждать ответов к следующим типам конечных точек:

  1. TCP – проверка открытого порта;
  2. gRPC – проверьте протокол ;
  3. Http — проверка на соответствие кода состояния;
  4. SiteMap — проверяет, отвечают ли все URL-адреса из файла Sitemap. 200 ОК ;
  5. JsonValue — собирает конкретные значения из ответа JSON.
Squzy позволяет добавлять собственные заголовки ко всем типам HTTP-проверок.

Интерфейс добавления проверки через дашборд Squzy выглядит следующим образом:

Squzy — бесплатная система самостоятельного мониторинга с открытым исходным кодом, инцидентами и уведомлениями.
</p><p>

Здесь интервал — это интервал между проверками в секундах, а таймаут — время, по истечении которого проверка считается неудавшейся.

После создания пользователю доступна конфигурация чекера:

Squzy — бесплатная система самостоятельного мониторинга с открытым исходным кодом, инцидентами и уведомлениями.
</p><p>

Для каждого типа проверки можно написать правило инцидента.

Подробнее инциденты будут описаны ниже, а здесь просто приведем пример:

Squzy — бесплатная система самостоятельного мониторинга с открытым исходным кодом, инцидентами и уведомлениями.
</p><p>

В этом случае мы измеряем значение курса доллара с сайта, и если оно больше 80, создаём инцидент. Ссылка на демо.

Инциденты могут быть созданы:

  • Длительность проверки (время получения ответа от сервера);
  • Статус (возвращаемый код состояния);
  • Значение (информация, передаваемая в чекере).



Скузи-агент

Для мониторинга хостов в системе используется Squzy Agent, установленный на сервере.

На данный момент он собирает следующую статистику:

  • CPU – загрузка процессора;
  • Память — используемая/свободная/общая/общая;
  • Диск — использовано/свободно/всего для каждого диска;
  • Net — для каждого сетевого интерфейса.

Хронология агента:
  1. Агент регистрируется на Сервере Агентов и получает идентификатор (при регистрации можно указать интервал мониторинга и имя агента);
  2. Агент отправляет статистику на сервер через определенный интервал;
  3. ….

  4. Агент уведомляет сервер о завершении работы.

Если соединения с сервером нет, агент продолжает собирать статистику и она будет отправлена при восстановлении соединения.

Демо-версию агента можно посмотреть здесь: https://demo.squzy.app/agents/5f142b6141a1c6518723483a/live Агент также может иметь набор правил проверки инцидентов:

Squzy — бесплатная система самостоятельного мониторинга с открытым исходным кодом, инцидентами и уведомлениями.
</p><p>



Мониторинг приложений Squzy

Для мониторинга приложений разработаны интеграции с популярными фреймворками.

Идти / NodeJs (как говорят успешные маркетологи, это еще не все).

Интеграции определяют тип транзакции ( HTTP / Маршрутизатор / gRPC / Вебсокет /etc) и анализировать ответы от движков/запросов.

Squzy также поддерживает трассировку транзакций, которая позволяет отслеживать взаимосвязанные транзакции нескольких серверов/сервисов.

Пример мониторинга таких транзакций на Dashboard: https://demo.squzy.app/transactions/om8l8LP96PRsvx67UxkES .

Библиотеки для интеграции в Go и Node Js.

По своей сути библиотеки представляют собой промежуточное программное обеспечение, которое записывает время до отправки транзакции и время после ее обработки и анализирует ответ. Также мы написали пример приложения GO для мониторинга: https://github.com/squzy/test_tracing. Вы можете создавать свои собственные транзакции и измерять время их выполнения, статусы и ошибки.

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

Вы можете создавать инциденты транзакций на основе следующих данных:

  • Продолжительность транзакции;
  • Статус транзакции;
  • Получены ошибки;
  • Тип операции.



Squzy Менеджер инцидентов + Менеджер уведомлений

Инциденты в Squzy основаны на правилах.

При добавлении новой сущности в Хранилище проверяется выполнение описанного правила и, если оно удовлетворено, создается инцидент (если он еще не создан).

Правила представляют собой расширенную версию выражение , к которым добавляются определенные правила, учитывающие спецификацию системы, такие как Последний (берёт последние n записей из хранилища), Использовать (используйте определенный фильтр) и так далее.

Подробное описание всех правил можно найти на сайте https://squzy.app/usage/squzy-incident/incident-rules , здесь мы остановимся на наглядном примере.

Давайте представим, что у вас есть сервер с 1792 процессорами, 256 ГБ оперативной памяти и 16 ТБ места на жестком диске.

И вы действительно хотите проверить, что ваш DevOps не запускает Doom на мониторе использования ЦП.

Вы знаете, что поддержание одностраничного сайта, который обслуживает ваш сервер, никогда не загружает более 8 процессоров на 100 процентов более минуты.

Кроме того, оперативная память свободна более чем наполовину.

Пока на жестком диске остался целый ТБ свободного места (не храните дома известные архивы — жена увидит).

В этом случае, зная, что метрики собираются раз в 10 секунд, вы можете определить следующее правило для проверки корректности работы вашего сервера:

   

any(Last(7, UseType(All)), {all(.

CpuInfo.Cpus, {.

Load > 80}) && .

MemoryInfo.Mem.UsedPercent < 50 && .

DiskInfo.Disks["System"].

Free > 1000000000000} )

Аналогично, Squzy позволяет описывать различные шаблоны нежелательного поведения системы.

После успешной (точнее, неудачной) проверки правила создается инцидент и уведомляется пользователь, если это настроено.

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

Для каждой проверяемой сущности, будь то приложение/проверщик/агент, вы можете создавать свои уведомления об инцидентах.



Заключение

Сейчас мы находимся на этапе сбора отзывов и комментариев IT-сообщества.

У нас уже есть ряд планов по развитию продукта:

  1. добавление интеграции Java/PHP;
  2. средства проверки базы данных;
  3. переход с Postgres на ClickHouse;
  4. больше способов уведомления;
  5. интеграция с Kubernetes;
  6. улучшенная документация;
  7. GQL API;
  8. Интеграционные и E2E-тесты;
  9. мониторинг мобильных приложений.

  10. Автозаполнение правил инцидентов в пользовательском интерфейсе
Будем рады любым отзывам и предложениям.



Ссылки

P.S.: Спасибо за статью Вонотиракс Попробуйте в 1 клик Теги: #программирование #Системное администрирование #открытый код #DevOps #Go #мониторинг #метрики #агент #агент #Агент
Вместе с данным постом часто просматривают: