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) 练习(动手任务)#

  1. 将 stats 端口从 8404 改为 8500,并更新 Exporter 与 Prometheus 配置。
  2. 使用 curl 验证 /metrics 输出中包含 haproxy_server_up
  3. 故意停掉一个后端服务,观察 PromQL sum(1 - haproxy_server_up) 的变化。
  4. 使用 systemctl restart haproxy_exporter 验证自动重启是否生效。