13.9.3 Prometheus与Exporters集成
Prometheus 与 HAProxy 集成的核心是通过 stats 接口与 Exporter 将运行指标转为 /metrics 时序数据。本节给出原理、安装、配置、采集、排错与练习的完整流程。
原理草图(数据流):
1) 启用 HAProxy stats 接口(示例)#
编辑 /etc/haproxy/haproxy.cfg,加入 stats 配置(建议独立 listen):
listen stats
bind 10.0.0.10:8404
mode http
stats enable
stats uri /stats
stats refresh 10s
stats auth admin:StrongPass123
若使用 Unix Socket(更安全、性能更好):
global
stats socket /run/haproxy/admin.sock mode 660 level admin
重载配置并确认端口/Socket:
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl reload haproxy
ss -lntp | grep 8404
ls -l /run/haproxy/admin.sock
命令解释:
- haproxy -c -f:仅检查配置语法,不启动服务
- systemctl reload:平滑重载不中断连接
- ss -lntp:确认 stats 监听端口是否存在
2) 安装与启动 haproxy_exporter#
以二进制方式安装(适合裸机):
# 下载
curl -L -o /usr/local/bin/haproxy_exporter \
https://github.com/prometheus/haproxy_exporter/releases/download/v0.14.0/haproxy_exporter
chmod +x /usr/local/bin/haproxy_exporter
# 以 stats http 为例
/usr/local/bin/haproxy_exporter \
--haproxy.scrape-uri="http://admin:StrongPass123@10.0.0.10:8404/stats;csv" \
--web.listen-address="0.0.0.0:9101" &
使用 systemd 管理(推荐):
# /etc/systemd/system/haproxy_exporter.service
[Unit]
Description=HAProxy Exporter
After=network.target
[Service]
ExecStart=/usr/local/bin/haproxy_exporter \
--haproxy.scrape-uri="http://admin:StrongPass123@10.0.0.10:8404/stats;csv" \
--web.listen-address="0.0.0.0:9101"
Restart=always
User=haproxy
Group=haproxy
[Install]
WantedBy=multi-user.target
启用服务:
systemctl daemon-reload
systemctl enable --now haproxy_exporter
curl -s http://127.0.0.1:9101/metrics | head
若改用 Unix Socket:
/usr/local/bin/haproxy_exporter \
--haproxy.scrape-uri="unix:/run/haproxy/admin.sock" \
--web.listen-address="0.0.0.0:9101"
3) Prometheus 抓取配置#
在 prometheus.yml 中添加:
scrape_configs:
- job_name: 'haproxy'
metrics_path: /metrics
scrape_interval: 15s
scrape_timeout: 5s
static_configs:
- targets: ['10.0.0.10:9101']
重载 Prometheus:
curl -X POST http://10.0.0.20:9090/-/reload
预期效果:
- Prometheus UI 中出现 haproxy job
- 指标可查询,如 haproxy_server_up
4) 关键指标示例与查询#
常用指标:
- haproxy_frontend_current_sessions
- haproxy_backend_current_sessions
- haproxy_server_up
- haproxy_server_response_time_average_seconds
- haproxy_frontend_bytes_in_total
PromQL 示例:
# 后端不可用节点数
sum(1 - haproxy_server_up)
# 5 分钟平均响应时间
avg_over_time(haproxy_server_response_time_average_seconds[5m])
# 前端当前会话
sum(haproxy_frontend_current_sessions)
5) 常见排错步骤(必须执行)#
1) Exporter 无数据:
curl -v http://10.0.0.10:8404/stats
# 若 401,检查 stats auth
2) /metrics 为空或错误:
journalctl -u haproxy_exporter -n 100 --no-pager
3) Prometheus 报 context deadline exceeded:
- 降低 scrape_timeout 或提高 scrape_interval
- 使用 Unix Socket 减少开销
4) 权限问题(Socket):
ls -l /run/haproxy/admin.sock
id haproxy
# 确保 exporter 进程用户有读权限
6) 架构与安全建议#
- stats 接口只绑定管理网段
- 开启 basic auth
- Exporter 与 HAProxy 版本兼容性在升级前验证
- 高并发建议使用 socket 方式
7) 练习(动手任务)#
- 将 stats 端口从 8404 改为 8500,并更新 Exporter 与 Prometheus 配置。
- 使用
curl验证/metrics输出中包含haproxy_server_up。 - 故意停掉一个后端服务,观察 PromQL
sum(1 - haproxy_server_up)的变化。 - 使用
systemctl restart haproxy_exporter验证自动重启是否生效。