Помню в детстве, перед началом летних каникул, казалось, что лето никогда не кончится — 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 проверки!
Больше параметров богу параметров!
Разве необходимо много параметров, чтобы проверить работает ли сайт? Как оказалось — да, надо много! Сейчас их много, что аж на экран не помещается (классная метрика, достаточности «что аж на экран не помещается», да?):

Но надо еще больше. Как минимум сейчас не хватает:
-
Важности алертов (warning, critical)
-
Инверсивная проверка
-
Возможность принимать несколько статус кодов ответа
-
Авторизация.
Нет предела совершенству и есть куда развиваться.
Что-то вроде итога
Это конечно же не все изменения что были проделаны, но лишь то что может быть интересно пользователям. Что еще хотелось бы отметить:
-
Добавление поддержки PostgreSQL
-
Возможность писать логи в JSON
-
Пуш метрик в VictoriaMetrics
-
Свои CSS стили для Status pages
-
Стабилизация проекта и более читаемый вывод ошибок
-
Переписали всю документацию на сайте
Кто захочет попробовать и потестить, не смотрите на прайс, просто напишите мне ;).
ссылка на оригинал статьи https://habr.com/ru/articles/893082/
Добавить комментарий