Думаю, многие из вас, уважаемые читатели, сталкивались с утилитой проверки сетевой доступности – ping-ом. А с httping? Думаю, меньшинство! И далеко не всегда причина в отсутствии необходимости в том или ином инструменте. Зачастую причина в другом – в отсутствии знания о существовании того, что могло бы упростить задачу. Поэтому в данной статье я хочу познакомить вас с этой замечательной утилитой. Но это еще не все! Так как результаты httping важны не в моменте, а на временных интервалах, то мы напишем небольшой модуль на Python. Данный модуль, в связке с очень популярной библиотекой matplotlib будет предоставлять нам статистику отклика WEB сервиса. Кому это все может быть полезно? В первую очередь тем из вас кто метит в DevOps и SRE. Интересно и актуально? Тогда погнали 😊
Небольшое отступление!
Если вы "пошли" смотреть кто такой SRE инженер, то вот ссылочка с описанием того, что он делает по работе- https://habr.com/ru/company/southbridge/blog/591149/
Сам недавно узнал :) Развелось же: DevOps, NetOps и вот теперь просят любить и жаловать SRE инженеров...
Знакомство с httping
Для своих экспериментов я использую Ubuntu 22.04 LTS (GNU/Linux 5.15.0-41-generic x86_64)
Простейший пример оценки задержки выглядит так:
Это не оценка длительности загрузки страницы, а оценка времени, необходимого серверу, чтобы ответить на запрос HEAD с учетом заголовков, без содержимого самой страницы.
Чтобы оценить загрузку всей страницы, с учетом статического содержимого и динамически подключаемого из CDN (при наличии) необходимо использовать ключ -G:
Чтобы выполнять разрешение имени хоста один раз и тем самым минимизировать задержки DNS добавляем параметр -r:
Если проверяемый сервис использует нестандартный порт (отличный от 443 в случае https, 80 в случае http), то добавляем его к URL через двоеточие:
В ряду самых часто используемых опций так же находится -s, для вывода кодов состояния. Они могут быть очень полезны при сборе статистики и поиске неисправности, так как коды состояний отличные от значения 200 указывают на то в какой плоскости необходимо искать проблему:
Комментарий
Выполнение данных команд принесет больше пользы если вы будете собирать данные на постоянной основе с периодичностью раз в минуту (к примеру). Элементарная математика поможет вычислить экстремумы и среднее значение отклика. Задав пороговые значения для вычисляемых значений можно определить реакции на те или иные отклонения. Самое простое это уведомить ответственного за работоспособность сервиса. Тот в свою очередь уже проведет более детальное изучение проблемы сбоя в производительности.
Важно
Утилита httping не является глубоким инструментом тестирования, способным выявлять узкие места в производительности вашего сервиса. Тем не менее, данный инструмент позволяет быстро, без дополнительных ресурсов, получить статистическую информацию о самочувствии вашего сайта (сервиса).
Пишем небольшой модуль на Python для сбора статистики и построения графика
Итак, у нас есть инструмент операционной системы Linux. С помощью этого инструмента мы получаем код ответа сервиса и время отклика (задержки) веб ресурса. Имея базовые навыки использования в своей работе Python я написал простой модуль delay.py - https://github.com/alex944591/check_web/blob/master/delay.py
Кратко разберу назначение, логику каждого блока небольшого модуля:
1. Импорт необходимых модулей
re - модуль для работы с регулярными выражениями
subprocess - модуль, позволяющий использовать утилиты ОС и получать результат для дальнейшей обработки в своем коде;
logging - модуль для работы с системой логирования;
matplotlib - библиотека на языке программирования Python для визуализации данных двумерной и трёхмерной графикой;
datetime - модуль для работы с временем.
2. Основное тело модуля delay.py
Тут, для упрощения модуля, задан один единственный URL в переменной url.
В реальной работе, список URL-ов будет храниться в файле и подгружаться по необходимости в переменные типа list, tuple для дальнейшего обхода последовательности в цикле
атрибуты модуля логирования logging, такие как basicConfig и getLogger позволяют провести первичную настройку подсистемы логирования. В нашем случае производятся следующие настойки basicConfig: имя файла, создаваемого для записи в него лог сообщений, формат записи, уровень логирования, стиль записи временной метки. В getLogger мы задаем уровень WARNING. Отсутствие данной настройки приводит к появлению в лог файле большого количества не нужной диагностической информации по работе библиотеки matplotlib.
Вот как выглядит лог файл, который ежеминутно наполняется лог сообщениями заданного нами формата:
В конце блока if ___name__ == "__main__" происходит вызов функции check_sedo_delay(). В ней то и происходит часть основной магии.
3. Функция check_sedo_delay()
Функция check_sedo_delay() принимает в качестве аргумента проверяемый URL - sedo_url (строка 10). С помощью функции run модуля subprocess (строка 12) операционной системы на выполнение передается команда httping, а вывод полученный в результате данного выполнения записывается в переменную result. Для понимания как это происходит покажу процесс в интерактивном режиме исполнения:
Подготовку регулярного выражения я обычно произвожу с помощью наглядного сервиса https://regex101.com/. Процесс выглядит примерно так:
В result.stdout мы видим результат выполнения команды httping.
Далее необходимо распарсить полученный вывод. Для этого в переменную regexp помещаем скомпилированное регулярное выражение (строка 11).
Подготовку регулярного выражения я обычно произвожу с помощью наглядного сервиса https://regex101.com/.
Процесс выглядит примерно так:
Помещаю текст который требуется парсить в окошко test string и в окошке Regular expression начинаю подбирать выражение. Результат совпадения тут же отражается в виде подсветки и конкретных значений в окне Match information.
Строки 13 - 14: получаем текущие значения совпадений и распаковываем их в рабочие переменные code (код ответа) и delay (задержка):
Далее выполняются простейшие проверки: Если код ответа = 200, то отправляем в лог файл сообщение INFO. Если код не равен 200, то пишем в лог сообщение о наличии проблемы.
Ну и в самом конце запускаем функцию create_plot().
4. Функция create_plot()
Данная функция парсит log файл chk_sedo_delay.log и создает три списка: x_time, y1_value, y2_value.
x_time - временные метка httping пробы;
y1_value - значения задержек;
y2_value - коды http ответов.
Процесс выглядит так:
Далее идет работа с библиотекой matplotlib (строки 47 -73). В результате получается график такого вида:
Подробности работы и типовые кейсы описаны в книге "Библиотека Matplotlib" Абдрахманов М.И. Поищите сами, либо подписывайтесь на канал в телеграмме - https://t.me/info_comm и заходите в чат https://t.me/ICchat, там попросите - поделюсь...
Код на гите:
Как сделать данный график обновляемым ежеминутно и опубликовать в сеть расскажу отдельной статейкой в телеграмм канале, поэтому кому интересно - велкоме!
Спасибо за внимание. Да прибудет с Вами сила духа!)