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])
排查建议顺序(执行清单)#
- 端口与权限可达性(
ss、curl、socat) - Exporter 服务状态与日志
- Prometheus 采集配置与目标
- 告警规则与静默策略
- 与 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
练习#
- 关闭 exporter 服务,观察 Prometheus 目标状态变化并记录告警触发时间。
- 修改 stats socket 权限为 600,观察指标变为空的现象并恢复权限。
- 在 Prometheus 中创建告警规则,模拟连接数突增并验证 Alertmanager 通知。