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