22

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

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

365 дней спустя, или жизнь еще одного мониторинга IT, Linux, Программирование, Сайт, Тестирование, Длиннопост

Terraform

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

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

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

365 дней спустя, или жизнь еще одного мониторинга IT, Linux, Программирование, Сайт, Тестирование, Длиннопост

Переписали 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 проверки!

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

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

365 дней спустя, или жизнь еще одного мониторинга IT, Linux, Программирование, Сайт, Тестирование, Длиннопост

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лига Сисадминов

2.3K поста18.8K подписчиков

Правила сообщества

Мы здесь рады любым постам связанным с рабочими буднями специалистов нашей сферы деятельности.