Плагин HAProxy

Мониторинг балансировщика нагрузки HAProxy с подробными метриками по статистике frontend/backend, состоянию серверов, частоте сессий, очередям и отслеживанию соединений.

Обзор

Плагин HAProxy собирает подробные метрики из stats-сокета HAProxy, в том числе:

  • Метрики frontend — входящие соединения, запросы, частота сессий, ошибки
  • Метрики backend — соединения с бэкендами, глубина очереди, времена отклика
  • Состояние серверов — статус серверов, проверки состояния, переходы up/down
  • Статистика сессий — активные сессии, частота сессий, лимиты соединений
  • Метрики очереди — текущая очередь, максимальная очередь, время в очереди
  • Статистика трафика — байты на вход/выход, частота запросов/ответов

Требования

Версия HAProxy

  • Минимум: HAProxy 1.8
  • Рекомендуется: HAProxy 2.4 или новее
  • Протестировано с: HAProxy 2.0, 2.4, 2.6, 2.8

Stats-сокет HAProxy

Обязательно: stats-сокет должен быть включён в конфигурации HAProxy.

Зависимости Python

Дополнительные пакеты Python не требуются — используется стандартный socket из библиотеки.

Доступ к сокету

Агенту нужен доступ на чтение к stats-сокету HAProxy.

Конфигурация

Базовая конфигурация

plugins:
  haproxy:
    enabled: true
    socket_path: /run/haproxy/admin.sock

С HTTP-страницей статистики

plugins:
  haproxy:
    enabled: true
    stats_url: http://localhost:8404/stats;csv
    username: admin
    password: password

Все параметры конфигурации

plugins:
  haproxy:
    enabled: true                              # Enable/disable plugin
    socket_path: /run/haproxy/admin.sock      # Stats socket path
    stats_url: ""                              # HTTP stats URL (alternative)
    username: ""                               # HTTP auth username
    password: ""                               # HTTP auth password
    timeout: 10                                # Socket/HTTP timeout (seconds)

Переменные окружения

Конфигурацию можно переопределить с помощью переменных окружения:

export HAPROXY_SOCKET="/run/haproxy/admin.sock"
export HAPROXY_STATS_URL="http://localhost:8404/stats;csv"

Настройка HAProxy

Установка

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install haproxy

# Start service
sudo systemctl start haproxy
sudo systemctl enable haproxy

CentOS/RHEL:

sudo yum install haproxy

# Start service
sudo systemctl start haproxy
sudo systemctl enable haproxy

Включение stats-сокета

Отредактируйте конфигурацию HAProxy:

sudo nano /etc/haproxy/haproxy.cfg

Добавьте stats-сокет в секцию global:

global
    stats socket /run/haproxy/admin.sock mode 660 level admin
    stats timeout 30s

Или включите HTTP-страницу статистики:

listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
    stats auth admin:password

Перезапустите HAProxy:

sudo systemctl restart haproxy

Предоставление доступа к сокету

По умолчанию агент работает от root — имеет доступ к сокету.

Для агента без root:

# Add user to haproxy group
sudo usermod -aG haproxy statusradar

# Or change socket permissions
# In haproxy.cfg:
# stats socket /run/haproxy/admin.sock mode 666 level admin

Собираемые метрики

Метрики frontend

Метрика Описание Единица Тип
frontend_sessions_current Текущие сессии Количество Gauge
frontend_sessions_max Максимум сессий Количество Gauge
frontend_sessions_total Всего сессий Количество Counter
frontend_request_rate Частота запросов Запросов/с Gauge
frontend_bytes_in Принятые байты Байты Counter
frontend_bytes_out Отправленные байты Байты Counter
frontend_requests_denied Отклонённые запросы Количество Counter
frontend_request_errors Ошибки запросов Количество Counter
frontend_http_1xx HTTP-ответы 1xx Количество Counter
frontend_http_2xx HTTP-ответы 2xx Количество Counter
frontend_http_3xx HTTP-ответы 3xx Количество Counter
frontend_http_4xx HTTP-ответы 4xx Количество Counter
frontend_http_5xx HTTP-ответы 5xx Количество Counter

Метрики backend

Метрика Описание Единица Тип
backend_sessions_current Текущие сессии Количество Gauge
backend_queue_current Текущая глубина очереди Количество Gauge
backend_queue_max Максимальная глубина очереди Количество Gauge
backend_response_time_avg Среднее время отклика мс Gauge
backend_connect_time_avg Среднее время подключения мс Gauge
backend_queue_time_avg Среднее время в очереди мс Gauge
backend_retries Повторы соединений Количество Counter
backend_redispatches Перенаправления Количество Counter
backend_connection_errors Ошибки соединений Количество Counter
backend_response_errors Ошибки ответов Количество Counter
backend_servers_up Серверов в состоянии UP Количество Gauge
backend_servers_down Серверов в состоянии DOWN Количество Gauge

Метрики серверов

Метрика Описание Единица Тип
server_total Всего серверов Количество Gauge
server_active Активные серверы Количество Gauge
server_backup Резервные серверы Количество Gauge
server_check_failures Сбои проверок состояния Количество Counter

Метаданные-метрики

Метрика Описание Единица Тип
frontend_count Число frontend'ов Количество Gauge
backend_count Число backend'ов Количество Gauge

Метрики на дашборде

Дашборд StatusRadar отображает:

Карточка обзора

  • Active Sessions — текущие сессии frontend
  • Backend Status — число здоровых бэкендов
  • Queue Depth — текущая очередь backend
  • Request Rate — запросов в секунду

График трафика frontend

  • Частота входящих запросов
  • Частота сессий
  • Байты на вход/выход

График состояния backend

  • Статус backend (UP/DOWN)
  • Глубина очереди во времени
  • Ошибки соединений

Таблица статуса серверов

  • Имя и статус сервера
  • Текущие сессии
  • Глубина очереди
  • Статус проверки состояния
  • Время отклика

График частоты сессий

  • Частота сессий frontend
  • Частота сессий backend
  • Лимит максимума сессий

График частоты ошибок

  • Ошибки соединений
  • Ошибки ответов
  • Отклонённые запросы

Установка

Быстрая установка

PLUGINS='haproxy' \
TOKEN='your-agent-token' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Включите stats-сокет HAProxy (см. выше)

  2. Настройте агент:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      haproxy:
        enabled: true
        socket_path: /run/haproxy/admin.sock
  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  4. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep haproxy

    Ожидается:

    INFO: Plugin haproxy: Metrics collected successfully
    INFO: Plugin haproxy: 3 frontends, 5 backends, 2 servers UP

Тестирование

Ручной тест плагина

cd /opt/statusradar
python3 plugins/haproxy_plugin.py

Ожидаемый вывод:

Plugin: haproxy
Enabled: True
Available: True

Collecting metrics...
{
  "frontends": {
    "http": {
      "sessions": 45,
      "sessions_rate": 12.5,
      "requests_total": 123456
    }
  },
  "backends": {
    "web_servers": {
      "sessions": 42,
      "queue_current": 0,
      "status": "UP"
    }
  },
  "servers": {
    "web1": {
      "status": "UP",
      "sessions": 21,
      "check_status": "L7OK"
    }
  }
}

Проверка сокета HAProxy

# Query stats via socket
echo "show stat" | sudo socat stdio /run/haproxy/admin.sock

# Show info
echo "show info" | sudo socat stdio /run/haproxy/admin.sock

# Show servers state
echo "show servers state" | sudo socat stdio /run/haproxy/admin.sock

Устранение неполадок

Плагин не собирает метрики

Проверка 1: Запущен ли HAProxy?

sudo systemctl status haproxy

Проверка 2: Включён ли stats-сокет?

grep "stats socket" /etc/haproxy/haproxy.cfg

Проверка 3: Может ли агент получить доступ к сокету?

sudo ls -la /run/haproxy/admin.sock
echo "show info" | sudo socat stdio /run/haproxy/admin.sock

Проверка 4: Проверьте логи агента

sudo journalctl -u statusradar-agent -n 100 --no-pager | grep haproxy

Распространённые ошибки

"Stats socket not found"

Ошибка:

ERROR: Plugin haproxy: Stats socket not found at /run/haproxy/admin.sock

Решение:

Включите stats-сокет в haproxy.cfg:

global
    stats socket /run/haproxy/admin.sock mode 660 level admin

Перезапустите HAProxy:

sudo systemctl restart haproxy

"Permission denied"

Ошибка:

ERROR: Plugin haproxy: Permission denied accessing stats socket

Решение:

# Add agent user to haproxy group
sudo usermod -aG haproxy statusradar

# Or change socket permissions (less secure)
# In haproxy.cfg:
# stats socket /run/haproxy/admin.sock mode 666 level admin

"socat not found"

Ошибка:

ERROR: Plugin haproxy: socat command not found

Решение:

# Install socat
sudo apt-get install socat  # Ubuntu/Debian
sudo yum install socat      # CentOS/RHEL

Влияние на производительность

На HAProxy

Минимальное влияние:

  • stats-сокет читает из разделяемой памяти
  • Нет влияния на обработку запросов
  • Время отклика: < 10 мс

Бенчмарк:

  • Накладные расходы: < 0.01% CPU
  • Нет измеримой деградации производительности

На агент

Использование ресурсов:

  • Память: +8 МБ
  • CPU: +2% во время сбора
  • Сеть: +1 КБ за сбор

Время сбора: < 0.1 секунды

Сценарии использования

1. Мониторинг состояния backend

Отслеживайте:

  • Статус серверов (UP/DOWN)
  • Сбои проверок состояния
  • Простой серверов

Оповещение при:

  • Сервере в состоянии DOWN
  • Сбоях проверок состояния
  • Частых переходах up/down

2. Мониторинг очереди

Отслеживайте:

  • Глубину очереди backend
  • Глубину очереди сервера
  • Время в очереди

Оповещение при:

  • Глубине очереди > 0 (backend насыщен)
  • Росте очереди
  • Достижении максимальной очереди

3. Отслеживание сессий

Отслеживайте:

  • Текущие сессии против максимума
  • Частоту сессий
  • Достижение лимита сессий

Оповещение при:

  • Сессиях > 80% от максимума
  • Всплеске частоты сессий
  • Отклонённых соединениях

4. Мониторинг частоты ошибок

Отслеживайте:

  • Ошибки соединений
  • Ошибки ответов
  • Повторы и перенаправления

Оповещение при:

  • Частоте ошибок > 1%
  • Росте ошибок соединений
  • Высокой частоте повторов

Лучшие практики

1. Настройте проверки состояния

backend web_servers
    option httpchk GET /health HTTP/1.1
    http-check expect status 200

    server web1 10.0.0.10:80 check inter 5s fall 3 rise 2
    server web2 10.0.0.11:80 check inter 5s fall 3 rise 2

Параметры:

  • inter: Интервал проверки (5s)
  • fall: Число сбоев перед пометкой DOWN (3)
  • rise: Число успехов перед пометкой UP (2)

2. Установите лимиты сессий

frontend http
    maxconn 10000

backend web_servers
    maxconn 5000

server web1 10.0.0.10:80 maxconn 1000

3. Включите лимиты очереди

backend web_servers
    timeout queue 30s

Оповещение при глубине очереди > 0 — указывает на насыщение backend.

4. Отслеживайте времена отклика

backend web_servers
    timeout server 30s

Отслеживайте response_time_avg и оповещайте при росте.

5. Используйте stick-таблицы для ограничения частоты

frontend http
    stick-table type ip size 100k expire 30s store http_req_rate(10s)
    http-request track-sc0 src
    http-request deny if { sc_http_req_rate(0) gt 100 }

6. Включите логирование

global
    log /dev/log local0
    log /dev/log local1 notice

frontend http
    option httplog

Тонкая настройка производительности HAProxy

Настройка соединений

global
    maxconn 100000
    tune.maxaccept 1000

defaults
    timeout connect 5s
    timeout client 30s
    timeout server 30s

Настройка буферов

global
    tune.bufsize 32768
    tune.maxrewrite 8192

Конфигурация потоков (HAProxy 2.0+)

global
    nbthread 4  # Number of threads = number of CPU cores

Расширенная конфигурация

Несколько экземпляров HAProxy

plugins:
  haproxy_lb1:
    enabled: true
    socket_path: /run/haproxy/lb1.sock

  haproxy_lb2:
    enabled: true
    socket_path: /run/haproxy/lb2.sock

HTTP-статистика (альтернатива сокету)

plugins:
  haproxy:
    enabled: true
    stats_url: http://localhost:8404/stats;csv
    username: admin
    password: ${HAPROXY_PASSWORD}

Docker-контейнер

Мониторинг HAProxy в Docker:

plugins:
  haproxy:
    enabled: true
    socket_path: /var/run/haproxy/admin.sock

Запуск Docker с монтированием сокета:

docker run -d --name haproxy \
  -v /var/run/haproxy:/var/run/haproxy \
  haproxy:latest

Примеры конфигураций

Базовая production-конфигурация

plugins:
  haproxy:
    enabled: true
    socket_path: /run/haproxy/admin.sock

С HTTP-статистикой

plugins:
  haproxy:
    enabled: true
    stats_url: http://127.0.0.1:8404/stats;csv
    username: admin
    password: ${HAPROXY_ADMIN_PASSWORD}

HA-кластер

plugins:
  haproxy_master:
    enabled: true
    socket_path: /run/haproxy/master.sock

  haproxy_backup:
    enabled: true
    socket_path: /run/haproxy/backup.sock

Ограничения

Текущие ограничения

  1. Нет метрик по отдельным URL — только агрегированная статистика
  2. Нет метрик stick-таблиц — таблицы ограничения частоты не отслеживаются
  3. Нет метрик ACL — статистика ACL не собирается

Масштабируемость

Протестировано с:

  • 100 000+ одновременных соединений
  • 10 000+ req/sec
  • 100+ бэкендами

Производительность:

  • Накладные расходы stats-сокета постоянны независимо от нагрузки

Чек-лист мониторинга

Критично:

  1. Сервер в состоянии DOWN
  2. Очередь backend > 0
  3. Ошибки соединений > 0
  4. Сессии на лимите

Важно: 5. Сбои проверок состояния 6. Ошибки ответов 7. Высокая частота повторов 8. Растущее время отклика

Пороги оповещений

server_status: == DOWN
backend_queue_current: > 0
backend_errors_conn_rate: > 0.01
frontend_sessions_percent: > 90
response_time_avg: > 1000

Следующие шаги

On this page