Добавить в корзинуПозвонить
Найти в Дзене
ИнфоКомм

Проверка пропускной способности и задержки HTTP-сервера с помощью утилиты httping (разработка модуля мониторинга на Python)

Думаю, многие из вас, уважаемые читатели, сталкивались с утилитой проверки сетевой доступности – ping-ом. А с httping? Думаю, меньшинство! И далеко не всегда причина в отсутствии необходимости в том или ином инструменте. Зачастую причина в другом – в отсутствии знания о существовании того, что могло бы упростить задачу. Поэтому в данной статье я хочу познакомить вас с этой замечательной утилитой. Но это еще не все! Так как результаты httping важны не в моменте, а на временных интервалах, то мы напишем небольшой модуль на Python. Данный модуль, в связке с очень популярной библиотекой matplotlib будет предоставлять нам статистику отклика WEB сервиса. Кому это все может быть полезно? В первую очередь тем из вас кто метит в DevOps и SRE. Интересно и актуально? Тогда погнали 😊 Небольшое отступление! Если вы "пошли" смотреть кто такой SRE инженер, то вот ссылочка с описанием того, что он делает по работе- https://habr.com/ru/company/southbridge/blog/591149/ Сам недавно узнал :) Развелось же
Оглавление
График сгенерированный модулем matplotlib в программе написанной на Python
График сгенерированный модулем matplotlib в программе написанной на Python

Думаю, многие из вас, уважаемые читатели, сталкивались с утилитой проверки сетевой доступности – 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)

Вывод версии установленной утилиты
Вывод версии установленной утилиты

Простейший пример оценки задержки выглядит так:

Простейший пример оценки задержки главной страницы mail.ru
Простейший пример оценки задержки главной страницы mail.ru

Это не оценка длительности загрузки страницы, а оценка времени, необходимого серверу, чтобы ответить на запрос HEAD с учетом заголовков, без содержимого самой страницы.

Описание ключей предыдущей команды
Описание ключей предыдущей команды

Чтобы оценить загрузку всей страницы, с учетом статического содержимого и динамически подключаемого из CDN (при наличии) необходимо использовать ключ -G:

Пример оценки задержки при полной загрузке главной страницы mail.ru (опция -G)
Пример оценки задержки при полной загрузке главной страницы mail.ru (опция -G)
Описание ключей предыдущей команды
Описание ключей предыдущей команды

Чтобы выполнять разрешение имени хоста один раз и тем самым минимизировать задержки DNS добавляем параметр -r:

Параметр -r для однократного разрешения имени хоста в IP
Параметр -r для однократного разрешения имени хоста в IP

Если проверяемый сервис использует нестандартный порт (отличный от 443 в случае https, 80 в случае http), то добавляем его к URL через двоеточие:

Использование нестандартного порта
Использование нестандартного порта

В ряду самых часто используемых опций так же находится -s, для вывода кодов состояния. Они могут быть очень полезны при сборе статистики и поиске неисправности, так как коды состояний отличные от значения 200 указывают на то в какой плоскости необходимо искать проблему:

Вывод http кодов состояний
Вывод http кодов состояний

Комментарий

Выполнение данных команд принесет больше пользы если вы будете собирать данные на постоянной основе с периодичностью раз в минуту (к примеру). Элементарная математика поможет вычислить экстремумы и среднее значение отклика. Задав пороговые значения для вычисляемых значений можно определить реакции на те или иные отклонения. Самое простое это уведомить ответственного за работоспособность сервиса. Тот в свою очередь уже проведет более детальное изучение проблемы сбоя в производительности.

Важно

Утилита 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

Основное тело модуля delay.py
Основное тело модуля delay.py

Тут, для упрощения модуля, задан один единственный URL в переменной url.

В реальной работе, список URL-ов будет храниться в файле и подгружаться по необходимости в переменные типа list, tuple для дальнейшего обхода последовательности в цикле

атрибуты модуля логирования logging, такие как basicConfig и getLogger позволяют провести первичную настройку подсистемы логирования. В нашем случае производятся следующие настойки basicConfig: имя файла, создаваемого для записи в него лог сообщений, формат записи, уровень логирования, стиль записи временной метки. В getLogger мы задаем уровень WARNING. Отсутствие данной настройки приводит к появлению в лог файле большого количества не нужной диагностической информации по работе библиотеки matplotlib.

Вот как выглядит лог файл, который ежеминутно наполняется лог сообщениями заданного нами формата:

Содержание лог файла chk_sedo_delay.log
Содержание лог файла chk_sedo_delay.log

В конце блока if ___name__ == "__main__" происходит вызов функции check_sedo_delay(). В ней то и происходит часть основной магии.

3. Функция check_sedo_delay()

Содержимое функции check_sedo_delay()
Содержимое функции check_sedo_delay()

Функция check_sedo_delay() принимает в качестве аргумента проверяемый URL - sedo_url (строка 10). С помощью функции run модуля subprocess (строка 12) операционной системы на выполнение передается команда httping, а вывод полученный в результате данного выполнения записывается в переменную result. Для понимания как это происходит покажу процесс в интерактивном режиме исполнения:

Подготовку регулярного выражения я обычно произвожу с помощью наглядного сервиса https://regex101.com/. Процесс выглядит примерно так:

Исполнение httping в режиме исполнения модуля
Исполнение httping в режиме исполнения модуля

В result.stdout мы видим результат выполнения команды httping.

Далее необходимо распарсить полученный вывод. Для этого в переменную regexp помещаем скомпилированное регулярное выражение (строка 11).

Подготовку регулярного выражения я обычно произвожу с помощью наглядного сервиса https://regex101.com/.

Процесс выглядит примерно так:

Пример работы с regex101
Пример работы с regex101

Помещаю текст который требуется парсить в окошко test string и в окошке Regular expression начинаю подбирать выражение. Результат совпадения тут же отражается в виде подсветки и конкретных значений в окне Match information.

Строки 13 - 14: получаем текущие значения совпадений и распаковываем их в рабочие переменные code (код ответа) и delay (задержка):

Строки 13 - 14: наполняем переменные code и delay
Строки 13 - 14: наполняем переменные code и delay

Далее выполняются простейшие проверки: Если код ответа = 200, то отправляем в лог файл сообщение INFO. Если код не равен 200, то пишем в лог сообщение о наличии проблемы.

Ну и в самом конце запускаем функцию create_plot().

4. Функция create_plot()

1-я часть функции create_plot()
1-я часть функции create_plot()
2-я часть функции create_plot()
2-я часть функции create_plot()

Данная функция парсит log файл chk_sedo_delay.log и создает три списка: x_time, y1_value, y2_value.

x_time - временные метка httping пробы;

y1_value - значения задержек;

y2_value - коды http ответов.

Процесс выглядит так:

Строки 29, 32 - компиляция regexp. Строка 34 - распаковка совпадений.
Строки 29, 32 - компиляция regexp. Строка 34 - распаковка совпадений.

Далее идет работа с библиотекой matplotlib (строки 47 -73). В результате получается график такого вида:

График задержек (delays) и кодов ответов (codes) за последний час
График задержек (delays) и кодов ответов (codes) за последний час

Подробности работы и типовые кейсы описаны в книге "Библиотека Matplotlib" Абдрахманов М.И. Поищите сами, либо подписывайтесь на канал в телеграмме - https://t.me/info_comm и заходите в чат https://t.me/ICchat, там попросите - поделюсь...

Код на гите:

check_web/delay.py at master · alex944591/check_web

Как сделать данный график обновляемым ежеминутно и опубликовать в сеть расскажу отдельной статейкой в телеграмм канале, поэтому кому интересно - велкоме!

Спасибо за внимание. Да прибудет с Вами сила духа!)