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

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

0121fd970672f1b76845f1ec805891bd.png

Terraform

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

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

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

d267a0673f440bef0df362054d2aa7f9.png

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

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

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

ee4d185ab8a0720e0b939546b19332ee.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

© Habrahabr.ru