На проекте принимаем порядка 450 тыс коннектов в секунду. Это короткие соединения но их много. Встала задача расчитать и реагировать на время ответа системы, если оно больше 180 мс. Параметр Ta который помог бы в этом, доступен только в логах Haproxy, только в http-mode. Метрики, что снимаю Prometheus через haproxy-exporter не дают мне такой детализации.
Логи... Логи haproxy генерит примерно 10-20 ГБ в минуту. У меня их 10 штук в кластере.
Я не нашел ничего лучшего как сделать связку на каждой машине с FluentD + Haproxy.
В haproxy.cfg:
global
log localhost:5140 local0 info
frontend
log-format "%ci:%cp [%tr] %f %b/%s %Th/%Ti/%TR/%Tw/%Tc/%Tr/%Ta %ST %B %ac/%fc/%bc/%sc/%rc %sq/%bq %{+Q}r %ID"
Идея в том, что бы логи гнать в fluentd через localhost, парсить сразу, создавать гистограммные бакеты и ждать пока прометей придет забрать метрики Ta а далее уже использовать прометеевскую встроенную функцию вычислять перцентиль и через графану показывать а через alertmanager реагировать на значение выше порогового.
td-agent.conf такой:
@type syslog
tag haproxy
port 5140
bind 127.0.0.1
format /(?[^ ]+) haproxy\[(?.+)\]: (?[\w\.]+):(?\d+) \[(?.+)\] (?[\w\-]+) (?[\w-]+)\/(?[^ ]+) (?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+)\/(?[^\/]+) (?
time_format %H:%M:%S
# Tag our log types.
@type rewrite_tag_filter
key frontend
pattern .
tag haproxy.http
Логи... Логи haproxy генерит примерно 10-20 ГБ в минуту. У меня их 10 штук в кластере.
Я не нашел ничего лучшего как сделать связку на каждой машине с FluentD + Haproxy.
В haproxy.cfg:
global
log localhost:5140 local0 info
frontend
log-format "%ci:%cp [%tr] %f %b/%s %Th/%Ti/%TR/%Tw/%Tc/%Tr/%Ta %ST %B %ac/%fc/%bc/%sc/%rc %sq/%bq %{+Q}r %ID"
Идея в том, что бы логи гнать в fluentd через localhost, парсить сразу, создавать гистограммные бакеты и ждать пока прометей придет забрать метрики Ta а далее уже использовать прометеевскую встроенную функцию вычислять перцентиль и через графану показывать а через alertmanager реагировать на значение выше порогового.
td-agent.conf такой:
@type syslog
tag haproxy
port 5140
bind 127.0.0.1
format /(?
\d+) (?\d+) (?\d+)\/(?\d+)\/(?\d+)\/(?\d+)\/(?\d+) (?\d+)\/(?\d+) "(?[^ "]+) (?[^\?]+)(\?.*)? (?[^"]*)" (?[^"]*)/
time_format %H:%M:%S
# Tag our log types.
@type rewrite_tag_filter
key frontend
pattern .
tag haproxy.http
@type prometheus
bind 0.0.0.0
port 9104
metrics_path /metrics
@type record_modifier
ta_active_time_seconds ${record["ta_active_time"].to_f / 1000}
# Create the histogram.
@type prometheus
name http_request_duration_seconds
type histogram
desc A histogram of the request duration.
key ta_active_time_seconds
buckets "0.1 0.2 0.5 1 2 5"
frontend ${frontend}
backend ${backend}
code ${code}
url ${url}
После запуска связки дернуть метрики:
curl localhost:9104/metrics
# TYPE http_request_duration_seconds histogram
# HELP http_request_duration_seconds A histogram of the request duration.
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.01"} 2886576115.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.02"} 2906399338.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.05"} 2941083200.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.1"} 2962511593.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.2"} 2980901517.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="0.5"} 2989548197.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="1"} 2990110356.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="5"} 2990648684.0
http_request_duration_seconds_bucket{frontend="b1-http",backend="b1",code="204",url="/bid/pub_us",le="+Inf"} 2993973686.0
таких блоков будет много, они делятся по кодам ответа (200, 204, 500, 503, 301, 505 и так далее), по URL, Backend и Frontend.
Нагрузки на CPU такая связка добавит примерно процентов 20!!! Хочу сделать в будущем просто передачу логов на хаб где и парсить уже все скопом.
Вторая задача - сертификаты letsencrypt для haproxy https-frontend.
В секцию frontend-http добавим
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend letsencrypt-backend if letsencrypt-acl
добавим новый бэкенд:
backend letsencrypt-backend
server letsencrypt 127.0.0.1:8889
и запускаем certbot:
certbot certonly --standalone \
-d my-domain.com \
--non-interactive --agree-tos --email email@com.com --http-01-port=8889
После отработки получим сертификат на домен на три месяца но бесплатно.
Мейджик...
Комментариев нет:
Отправить комментарий