365 дней спустя, или жизнь еще одного мониторинга

от автора

Помню в детстве, перед началом летних каникул, казалось, что лето никогда не кончится — 3 месяца где-то рядом с бесконечностью. А сейчас… Оказывается мы уже больше года разрабатываем RMON, первый коммит в Github был 15 марта 2024 года. Вжух и один год жизни пролетел. Ладно, хватит разговаривать на скуфском — это было маленькое вступление для подведения небольшого итога года работы. Вперед!

Terraform

Изначально мы его не планировали, но впереди была большая инсталляция и показалось, что настраивать кучу агентов руками и серверов, такое себе. Создавать проверки через Terraform оказалось очень удобно.

Одна проверка с нескольких агентов

Изначально мы планировали эту возможность, но реализовали, только, спустя полгода. У фичи достаточно сложная логика, по этому прокрастинировали, как можно дольше :). Получилось, вроде неплохо:

Переписали HTTP проверки на libcurl

Изначально использовали Python requests, так как было проще всего начать с нее, но мы сразу понимали, что requests не подходит из-за скорости работы и не возможности снимать HTTP метрики. В поисках решения нашли libcurl. Оказывается, curl — это не просто консольная утилита, с помощью, которой можно скачать файл и дернуть ifconfig.io, но и мощная библиотека для выполнения разных запросов. Кто ж знал.

С помощью Pycurl с libcurl достаточно легко и удобно работать из Python:

class CurlHttp:     def __init__(self, **kwargs) -> None:         ...      def curl(self):         try:             buf = io.BytesIO()  # We need to measure download time.             c = pycurl.Curl()             self.set_http_method(c)             self.set_curl_options(c, buf)         except pycurl.error as e:             raise Exception(f'Cannot set curl http_{self.check_id} {e.args[1]}')         try:             c.perform()         except pycurl.error as e:             self.reset_http_results(e.args[1])         except Exception as e:             self.reset_http_results(e)          return c, buf      def set_http_method(self, c):         http_methods = {             'get': c.HTTPGET,             'post': c.POST,             'put': c.PUT,             'head': c.NOBODY         }         custom_http_methods = {             'patch': "PATCH",             'delete': "DELETE",             'options': "OPTIONS"         }         if self.http_method in http_methods:             c.setopt(http_methods[self.http_method], 1)         else:             c.setopt(c.CUSTOMREQUEST, custom_http_methods[self.http_method])      def set_curl_options(self, c, buf):         c.setopt(c.URL, self.url)         c.setopt(c.DNS_CACHE_TIMEOUT, 0)  # disable dns cache.         c.setopt(c.FORBID_REUSE, 1)  # disable dns cache.         c.setopt(c.FRESH_CONNECT, 1)  # disable dns cache.         c.setopt(c.HEADERFUNCTION, self.headers.write)         c.setopt(c.WRITEFUNCTION, buf.write)         c.setopt(c.TIMEOUT, self.timeout)         c.setopt(c.USERAGENT, 'RMON-bot')         # c.setopt(pycurl.VERBOSE, 1)         # c.setopt(pycurl.DEBUGFUNCTION, self.debug_curl)         ...          if self.is_https == 'https':             c.setopt(c.OPT_CERTINFO, 1)          if self.ignore_ssl_error:             c.setopt(c.SSL_VERIFYPEER, 0)             c.setopt(c.SSL_VERIFYHOST, 0)

При переходе на libcurl удалось запустить несколько тысяч HTTP проверок на довольно слабенькой ВМ, вместо сотен на requests. Кстати, так же с помощью libcurl удалось реализовать SMTP проверки!

Больше параметров богу параметров!

Разве необходимо много параметров, чтобы проверить работает ли сайт? Как оказалось — да, надо много! Сейчас их много, что аж на экран не помещается (классная метрика, достаточности «что аж на экран не помещается», да?):

Но надо еще больше. Как минимум сейчас не хватает:

  1. Важности алертов (warning, critical)

  2. Инверсивная проверка

  3. Возможность принимать несколько статус кодов ответа

  4. Авторизация.

Нет предела совершенству и есть куда развиваться.

Что-то вроде итога

Это конечно же не все изменения что были проделаны, но лишь то что может быть интересно пользователям. Что еще хотелось бы отметить:

  1. Добавление поддержки PostgreSQL

  2. Возможность писать логи в JSON

  3. Пуш метрик в VictoriaMetrics

  4. Свои CSS стили для Status pages

  5. Стабилизация проекта и более читаемый вывод ошибок

  6. Переписали всю документацию на сайте

Кто захочет попробовать и потестить, не смотрите на прайс, просто напишите мне ;).


ссылка на оригинал статьи https://habr.com/ru/articles/893082/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *