Одним жарким зимним вечером нам пришла в голову идея написать приложение для проверки карты сайта компании, в которой мы работаем, с возможностью уведомлять нас при возникновении ошибки.
Постепенно эта идея перешла к реализации, появились идеи по улучшению, возник мониторинг хоста, затем мониторинг приложений и, как вишенка на торте, инциденты с уведомлениями.
В результате мы получили полноценную систему мониторинга, которая представляет собой полностью самостоятельное решение с открытым исходным кодом, без внешних коммуникаций, с полностью определяемыми пользователем инцидентами.
И в этом посте мы хотим познакомить вас с получившимся продуктом.
Технические детали
Для разработки была выбрана микросервисная архитектура.Бэкенд разработан на 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 была разработана демо-версия, которая контролирует собственный сервер и позволяет следить за системой на приборной панели: https://demo.squzy.app/ .
Некоторые функции, такие как добавление/удаление новых объектов, в демо-версии отключены, но она позволяет вам видеть и трогать все части системы.
Ниже мы остановимся подробнее на каждом виде мониторинга.
Эта часть системы отвечает за внешние/внутренние проверки.
На данный момент он позволяет отправлять запросы и ждать ответов к следующим типам конечных точек:
- TCP – проверка открытого порта;
- gRPC – проверьте протокол ;
- Http — проверка на соответствие кода состояния;
- SiteMap — проверяет, отвечают ли все URL-адреса из файла Sitemap. 200 ОК ;
- JsonValue — собирает конкретные значения из ответа JSON.
Интерфейс добавления проверки через дашборд Squzy выглядит следующим образом:
Здесь интервал — это интервал между проверками в секундах, а таймаут — время, по истечении которого проверка считается неудавшейся.
После создания пользователю доступна конфигурация чекера:
Для каждого типа проверки можно написать правило инцидента.
Подробнее инциденты будут описаны ниже, а здесь просто приведем пример:
В этом случае мы измеряем значение курса доллара с сайта, и если оно больше 80, создаём инцидент. Ссылка на демо.
Инциденты могут быть созданы:
- Длительность проверки (время получения ответа от сервера);
- Статус (возвращаемый код состояния);
- Значение (информация, передаваемая в чекере).
Скузи-агент
Для мониторинга хостов в системе используется Squzy Agent, установленный на сервере.На данный момент он собирает следующую статистику:
- CPU – загрузка процессора;
- Память — используемая/свободная/общая/общая;
- Диск — использовано/свободно/всего для каждого диска;
- Net — для каждого сетевого интерфейса.
- Агент регистрируется на Сервере Агентов и получает идентификатор (при регистрации можно указать интервал мониторинга и имя агента);
- Агент отправляет статистику на сервер через определенный интервал;
- ….
- Агент уведомляет сервер о завершении работы.
Демо-версию агента можно посмотреть здесь: https://demo.squzy.app/agents/5f142b6141a1c6518723483a/live
Агент также может иметь набор правил проверки инцидентов:
Мониторинг приложений Squzy
Для мониторинга приложений разработаны интеграции с популярными фреймворками.Идти / NodeJs (как говорят успешные маркетологи, это еще не все).
Интеграции определяют тип транзакции ( HTTP / Маршрутизатор / gRPC / Вебсокет /etc) и анализировать ответы от движков/запросов.
Squzy также поддерживает трассировку транзакций, которая позволяет отслеживать взаимосвязанные транзакции нескольких серверов/сервисов.
Пример мониторинга таких транзакций на Dashboard: https://demo.squzy.app/transactions/om8l8LP96PRsvx67UxkES .
Библиотеки для интеграции в Go и Node Js.
- Идти - https://github.com/squzy/squzy_go (ГИН/gRPC/Http);
- NodeJs — https://github.com/squzy/squzy_node (Экспресс) + FE (Угловой + ванильный).
Для этого используйте пакет Core. Для удобства поддержки продукта во всех языках будут использоваться одни и те же имена для пакетов, определяющих поведение.
Вы можете создавать инциденты транзакций на основе следующих данных:
- Продолжительность транзакции;
- Статус транзакции;
- Получены ошибки;
- Тип операции.
Squzy Менеджер инцидентов + Менеджер уведомлений
Инциденты в Squzy основаны на правилах.При добавлении новой сущности в Хранилище проверяется выполнение описанного правила и, если оно удовлетворено, создается инцидент (если он еще не создан).
Правила представляют собой расширенную версию выражение , к которым добавляются определенные правила, учитывающие спецификацию системы, такие как Последний (берёт последние n записей из хранилища), Использовать (используйте определенный фильтр) и так далее.
Подробное описание всех правил можно найти на сайте https://squzy.app/usage/squzy-incident/incident-rules , здесь мы остановимся на наглядном примере.
Давайте представим, что у вас есть сервер с 1792 процессорами, 256 ГБ оперативной памяти и 16 ТБ места на жестком диске.
И вы действительно хотите проверить, что ваш DevOps не запускает Doom на мониторе использования ЦП.
Вы знаете, что поддержание одностраничного сайта, который обслуживает ваш сервер, никогда не загружает более 8 процессоров на 100 процентов более минуты.
Кроме того, оперативная память свободна более чем наполовину.
Пока на жестком диске остался целый ТБ свободного места (не храните дома известные архивы — жена увидит).
В этом случае, зная, что метрики собираются раз в 10 секунд, вы можете определить следующее правило для проверки корректности работы вашего сервера:
Аналогично, Squzy позволяет описывать различные шаблоны нежелательного поведения системы.any(Last(7, UseType(All)), {all(.
CpuInfo.Cpus, {.
Load > 80}) && .
MemoryInfo.Mem.UsedPercent < 50 && .
DiskInfo.Disks["System"].
Free > 1000000000000} )
После успешной (точнее, неудачной) проверки правила создается инцидент и уведомляется пользователь, если это настроено.
Активный инцидент, то есть инцидент, который еще не проверен пользователем, может быть закрыт автоматически, то есть если он в какой-то момент не прошел проверку, если выбрана соответствующая опция.
Для каждой проверяемой сущности, будь то приложение/проверщик/агент, вы можете создавать свои уведомления об инцидентах.
Заключение
Сейчас мы находимся на этапе сбора отзывов и комментариев IT-сообщества.У нас уже есть ряд планов по развитию продукта:
- добавление интеграции Java/PHP;
- средства проверки базы данных;
- переход с Postgres на ClickHouse;
- больше способов уведомления;
- интеграция с Kubernetes;
- улучшенная документация;
- GQL API;
- Интеграционные и E2E-тесты;
- мониторинг мобильных приложений.
- Автозаполнение правил инцидентов в пользовательском интерфейсе
Ссылки
- Бэкэнд-системы: https://github.com/squzy/squzy
- Фронтенд-системы: https://github.com/squzy/squzy-dashboard
- Демо-панель: https://demo.squzy.app/
- Документация: https://squzy.app/
- Авторы: PxyUp МечтаИБарабан
-
Знанецкий Флориан Витольд
19 Oct, 24 -
История Программного Обеспечения Qt
19 Oct, 24 -
Скажите Доброе Слово О Высокой Зарплате
19 Oct, 24 -
Opencl 2.0 И Драйверы От Amd И Intel
19 Oct, 24