13.9.5 常见监控故障与排查

本节聚焦 HAProxy 监控链路中的常见故障与排查路径,覆盖日志采集、统计页、Prometheus Exporter 与告警链路,提供可执行示例、命令解释与练习。

文章图片

0. 快速准备(示例安装与基线验证)#

以 Linux 单机为例,确保 haproxy 与 exporter 版本兼容。

# 安装 HAProxy(示例)
sudo apt-get update
sudo apt-get install -y haproxy

# 安装 exporter(二进制示例)
sudo useradd -r -s /sbin/nologin haproxy_exporter
curl -L -o /tmp/haproxy_exporter.tar.gz \
  https://github.com/prometheus/haproxy_exporter/releases/download/v0.14.0/haproxy_exporter-0.14.0.linux-amd64.tar.gz
tar -xf /tmp/haproxy_exporter.tar.gz -C /tmp
sudo mv /tmp/haproxy_exporter-*/haproxy_exporter /usr/local/bin/
sudo chown haproxy_exporter:haproxy_exporter /usr/local/bin/haproxy_exporter

# 关键验证:确认 HAProxy 已启用 stats socket
sudo grep -n "stats socket" /etc/haproxy/haproxy.cfg

# 预期:输出类似
# 12: stats socket /run/haproxy/admin.sock mode 660 level admin

HAProxy stats 示例配置#

# /etc/haproxy/haproxy.cfg
global
  log /dev/log local0
  stats socket /run/haproxy/admin.sock mode 660 level admin

listen stats
  bind :8404
  stats enable
  stats uri /stats
  stats auth admin:StrongPass

Exporter 启动示例#

# 以 systemd 启动 exporter
cat <<'EOF' | sudo tee /etc/systemd/system/haproxy_exporter.service
[Unit]
Description=HAProxy Exporter
After=network.target

[Service]
User=haproxy_exporter
ExecStart=/usr/local/bin/haproxy_exporter \
  --haproxy.scrape-uri=unix:/run/haproxy/admin.sock \
  --web.listen-address=:9101
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now haproxy_exporter

# 验证 exporter
curl -s http://127.0.0.1:9101/metrics | head

1. 指标采集为空或缺失#

现象:Prometheus 目标状态 UP,但关键指标为空。
核心原因:stats socket/uri 未启用、权限不足、版本不兼容。

排查与命令

# 1) 检查 socket 是否存在
ls -l /run/haproxy/admin.sock

# 2) 检查 haproxy_exporter 进程用户是否有权限读 socket
# 预期:socket 组权限包含 exporter 用户所在组
getfacl /run/haproxy/admin.sock

# 3) 直接查询 HAProxy 统计
echo "show stat" | socat /run/haproxy/admin.sock stdio | head

修复示例

# 将 socket 组权限赋给 haproxy_exporter 所在组
sudo usermod -aG haproxy haproxy_exporter
sudo systemctl restart haproxy_exporter

2. Exporter 不可用或频繁重启#

现象:Prometheus 报 connection refused 或 exporter 重启。
可能原因:端口占用、资源限制、启动参数错误。

排查与命令

# 1) 端口占用
ss -ltnp | grep 9101

# 2) 查看服务状态与最近日志
systemctl status haproxy_exporter
journalctl -u haproxy_exporter -n 50 --no-pager

# 3) 手动验证 /metrics
curl -v http://127.0.0.1:9101/metrics

修复示例

# 修改监听端口并重启
sudo sed -i 's/9101/9110/g' /etc/systemd/system/haproxy_exporter.service
sudo systemctl daemon-reload
sudo systemctl restart haproxy_exporter

3. 统计页面不可访问#

现象/stats 返回 403/404 或无响应。
原因:未启用 stats、未绑定端口、ACL 拦截。

排查与命令

# 1) 配置核对
grep -n "stats" /etc/haproxy/haproxy.cfg

# 2) 访问验证
curl -u admin:StrongPass http://127.0.0.1:8404/stats

修复示例

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

4. 日志缺失或格式异常#

现象:rsyslog 未收到 haproxy 日志或字段缺失。
原因:log 指向错误、rsyslog 规则不匹配。

排查与命令

# 1) HAProxy 日志输出配置检查
grep -n "^ *log" /etc/haproxy/haproxy.cfg

# 2) rsyslog 规则检查
grep -R "haproxy" /etc/rsyslog.d/

# 3) 观察系统日志
sudo tail -f /var/log/syslog

rsyslog 示例

# /etc/rsyslog.d/49-haproxy.conf
if ($programname == 'haproxy') then /var/log/haproxy.log
& stop

预期效果

# 生成访问,日志落盘
curl -I http://127.0.0.1/
tail -n 5 /var/log/haproxy.log

5. Prometheus 目标状态 DOWN#

现象:目标显示 DOWN。
原因:网络不通、Service 映射错误、端口冲突。

排查与命令

# 1) 从 Prometheus 机器验证可达性
curl -v http://<exporter_ip>:9101/metrics

# 2) 检查 Prometheus 配置
grep -n "haproxy" /etc/prometheus/prometheus.yml

Prometheus 配置示例

# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: 'haproxy'
    static_configs:
      - targets: ['10.0.0.10:9101']

6. 告警延迟或不触发#

现象:服务异常但未告警。
原因:采集间隔过长、告警表达式过严、静默规则。

排查与命令

# 1) 检查采集间隔
grep -n "scrape_interval" /etc/prometheus/prometheus.yml

# 2) 检查 Alertmanager 静默
curl -s http://<alertmanager>:9093/api/v2/silences | jq '.[].status'

告警示例(触发连接数过高)

# /etc/prometheus/rules/haproxy.yml
groups:
- name: haproxy
  rules:
  - alert: HAProxyHighConn
    expr: haproxy_frontend_current_sessions > 1000
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "HAProxy 当前连接数过高"

7. 指标值异常波动#

现象:QPS、连接数跳变。
原因:重启导致 counter 重置、采集间隔过短、健康检查流量干扰。

排查与命令

# 1) 对比内部统计输出
echo "show stat" | socat /run/haproxy/admin.sock stdio | grep FRONTEND

# 2) 检查是否重启
systemctl status haproxy | grep Active

# 3) 计算速率时使用 rate()
# 示例:PromQL
# rate(haproxy_frontend_http_responses_total[5m])

排查建议顺序(执行清单)#

  1. 端口与权限可达性(sscurlsocat
  2. Exporter 服务状态与日志
  3. Prometheus 采集配置与目标
  4. 告警规则与静默策略
  5. 与 HAProxy 内部统计对比

常用命令速查(含解释)#

# 查看端口监听:定位 exporter 是否在监听
ss -ltnp | grep 9101

# socket 统计:直接从 haproxy 获取原始指标
echo "show stat" | socat /run/haproxy/admin.sock stdio

# 查看服务日志:定位 exporter 启动错误
journalctl -u haproxy_exporter -n 50 --no-pager

练习#

  1. 关闭 exporter 服务,观察 Prometheus 目标状态变化并记录告警触发时间。
  2. 修改 stats socket 权限为 600,观察指标变为空的现象并恢复权限。
  3. 在 Prometheus 中创建告警规则,模拟连接数突增并验证 Alertmanager 通知。