Я создаю небольшую ферму веб-серверов (IIS7.5) для обслуживания внутреннего веб-сайта. Одна из вещей, которую я хочу измерить, - это время ответа HTTP между пользовательскими запросами и обслуживаемой страницей.
Учитывая, что я использую HAProxy в качестве внешнего балансировщика нагрузки, казалось бы естественным, что HAProxy будет идеальным местом для сбора этой информации, поскольку он находится между каждым запросом / ответом. Однако, глядя на страницу сгенерированной статистики, можно найти много полезной информации, но я ничего не вижу о времени ответа.
Как лучше всего это сделать? Может ли HAProxy выполнять эту функцию, или мне понадобится другое специализированное программное обеспечение для мониторинга?
HAProxy предоставляет очень подробная статистика по всем HTTP-запросам. Намного больше, чем вы видите на странице статистики.
Вам необходимо настроить сервер системного журнала, прослушивающий сообщения системного журнала UDP (например, на localhost). Этот сервер системного журнала должен быть настроен для записи сообщений журнала, полученных HAProxy, в файл (или в другое место). Пример конфигурации HAproxy может выглядеть так:
defaults
# send the logs to localhost:514 via UDP, using the local0 facility
log 127.0.0.1 local0 debug
option httplog
mode http
balance roundrobin
listen farm
bind 10.0.0.1:80
server iis1 10.0.1.1:80
server iis2 10.0.1.2:80
См. Раздел 8 руководство по настройке для получения подробной информации о формате журнала и о том, как его настроить.
Системный журнал не требуется, функция экспорта CSV со страницы статистики предоставляет все подробности.
$ lynx -source -auth=STATSUSER:STATSPASSWORD 'http://haproxy/stats;csv' | cut -d ',' -f 2,8,61
Поля 2,8 и 61 покажут имя серверной части, общее количество сеансов и среднее время ответа в мс для последних 1024 запросов.
я использую option httplog clf
для регистрации и захвата нескольких дополнительных полей, но вот регулярное выражение Python, которое я написал для этого (что может сэкономить вам некоторое время):
line_regex=re.compile('ny-lb[0-9]{2} (?P<HTTP_CLIENT_IP>[^ ]+) - - \[[^\]]*\] "(?P<HTTP_METHOD>[^ ]+) (?P<HTTP_URI>[^ ]+) (?P<HTTP_VERSION>\w+/\d+\.\d+)" (?P<HTTP_RESPONSE_CODE>\d{3}) (?P<HTTP_HAPROXY_BYTES_READ>\d+) "[^"]*" "[^"]*" [^ ]+ [^ ]+ "(?P<HTTP_HAPROXY_FRONTEND>[^"]+)" "(?P<HTTP_HAPROXY_BACKEND>[^"]+)" "(?P<HTTP_SERVER>[^"]+)" (?P<HTTP_HAPROXY_TQ>-?\d*) (?P<HTTP_HAPROXY_TW>-?\d*) (?P<HTTP_HAPROXY_TC>-?\d*) (?P<HTTP_HAPROXY_TR>-?\d*) (?P<HTTP_HAPROXY_TT>-?\d*) "(?P<HTTP_HAPROXY_TERM_STATE>[^"]*)" (?P<HTTP_HAPROXY_ACTCONN>-?\d*) (?P<HTTP_HAPROXY_FECONN>-?\d*) (?P<HTTP_HAPROXY_BECONN>-?\d*) (?P<HTTP_HAPROXY_SRV_CONN>-?\d*) (?P<HTTP_HAPROXY_RETRIES>-?\d*) (?P<HTTP_HAPROXY_SRV_QUEUE>-?\d*) (?P<HTTP_HAPROXY_BACKEND_QUEUE>-?\d*) "[^"]*" "[^"]*" "(?P<HTTP_REFERER>[^"]*)" "(?P<HTTP_UA>[^"]*)" "(?P<HTTP_HOST>[^"]*)" "(?P<HTTP_X_FORWARD_FOR>[^"]*)"')
Вероятно, вам нужно поле HTTP_HAPROXY_TR:
Tr: время ответа сервера (только в режиме HTTP). Это время, прошедшее с момента установления TCP-соединения с сервером до момента, когда сервер отправил полные заголовки ответа. Он просто показывает время обработки запроса без дополнительных затрат сети из-за передачи данных. Стоит отметить, что когда у клиента есть данные для отправки на сервер, например, во время запроса POST, время уже идет, и это может исказить очевидное время ответа. По этой причине, как правило, разумно не слишком доверять этому полю для запросов POST, инициированных от клиентов, находящихся в ненадежной сети. Значение «-1» здесь означает, что последний заголовок ответа (пустая строка) никогда не просматривался, скорее всего, из-за истечения тайм-аута сервера до того, как серверу удалось обработать запрос.