Как стать автором
Обновить

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

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров997

Помню в детстве, перед началом летних каникул, казалось, что лето никогда не кончится - 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. Переписали всю документацию на сайте

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

Теги:
Хабы:
+7
Комментарии0

Публикации

Истории

Работа

DevOps инженер
16 вакансий
Data Scientist
56 вакансий

Ближайшие события

4 – 5 апреля
Геймтон «DatsCity»
Онлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область