1 Haproxy监控方式

在haproxy 2.0版本之前,prometheus提供了haproxy_exporter来对haproxy进行监控,haproxy从2.0版本开始不再需要使用haproxy_exporter进行监控,从haproxy 2.0 版本开始,HAProxy内置了对Prometheus的⽀持。这意味着HAProxy能够直接提供兼容Prometheus的指标格式,⽆需依赖任何额外的exporter 。(安装haproxy、然后修改stats,配置对外输出metrics接⼝)

1.1 安装并配置Haproxy

1.1.1 安装依赖环境

yum install gcc readline-devel openssl-devel systemd-devel -y

1.1.2 安装lua脚本

wget http://www.lua.org/ftp/lua-5.4.3.tar.gz
tar xf lua-5.4.3.tar.gz -C /usr/local/
cd /usr/local/lua-5.4.3/
make linux
make linux test
ln -s /usr/local/lua-5.4.3/ /usr/local/lua

1.1.3 编译Haproxy

下载地址
https://www.haproxy.org/download/2.4/src/
wget https://www.haproxy.org/download/2.4/src/haproxy-2.4.22.tar.gz

解压安装
tar xf haproxy-2.4.22.tar.gz
cd haproxy-2.4.22/
make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 \
USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 \
USE_PROMEX=1 \
LUA_INC=/usr/local/lua/src LUA_LIB=/usr/local/lua/src
#从2.0.0版开始,HAProxy包括一个Prometheus导出模块,可在构建时将其构建到二进制文件中。 
#对于HAProxy 2.4及更高版本,在make命令中传递USE_PROMEX标志:
make install PREFIX=/usr/local/haproxy-2.4.22

ln -s /usr/local/haproxy-2.4.22/ /usr/local/haproxy
mkdir -p /var/lib/haproxy

1.1.4 创建启动文件

vim /usr/lib/systemd/system/haproxy24.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target

[Service]
ExecStartPre=/usr/local/haproxy/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/local/haproxy/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

1.1.5 配置Haproxy的stats功能

mkdir /etc/haproxy/ -p
vim /etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    maxconn 100000 # Haproxy支持最大的会话数,如果default没有配置则使用global
    chroot      /var/lib/haproxy
    #user        haproxy
    #group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats mode 600 level admin # 定义sock位置及权限
defaults
    mode                    http
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    maxconn                 3000
# 打开负载均衡的状态页面
frontend stats
    bind *:9999
    stats enable
    stats uri /haproxy-status
    stats auth qingchen:123456
    # Prometheus metrics 的路径
    http-request use-service prometheus-exporter if { path /metrics }
    # 允许每秒通过haproxy的新会话数限制为 100 个。如果超过这个数值,额外的新会话将被延迟或拒绝
    rate-limit sessions 100
# 定义负载均衡配置
frontend java
    bind *:8888
    mode http
    rate-limit sessions 100
    default_backend javaserver
backend javaserver
    balance roundrobin
    server web1 127.0.0.1:8080 check
    server web2 127.0.0.1:8080 check
# 定义负载均衡配置
frontend web
    bind *:8889
    mode http
    rate-limit sessions 200
    default_backend webservers
backend webservers
    balance roundrobin
    # 后端支持最大的并发连接数(会话数)
    fullconn 1000
    server web3 127.0.0.1:8080 check
    server web4 127.0.0.1:8080 check

1.1.6 启动Haproxy

systemctl daemon-reload
systemctl start haproxy24

1.1.7 检查Haproxy的状态⻚⾯

http://192.168.137.131:9999/haproxy-status

Prometheus监控之Haproxy_后端服务

1.1.8 metrics接⼝暴露指标

Prometheus监控之Haproxy_lua_02

1.2 配置Prometheus

1、编辑Prometheus配置⽂件,将haproxy服务纳⼊监控
  - job_name: "haproxy"
    metrics_path: "/metrics"
    static_configs:
    - targets: ["192.168.137.131:9999"]

2、重新加载Prometheus配置⽂件 
curl -X POST http://192.168.137.131:9090/-/reload

1.3 Haproxy常用指标

对于(Rate)、请求失败数(Errors)、请求延迟(Duration)但是Haproxy作为负载均衡,他⼜分为了前端和后端:

Frontend 在 HAProxy 中指的是客户端连接到的部分,它负责接收来⾃客户端的请求并将它们转发到相应的 backend 集群。通常监控 frontend 以下信息:

  • 新建连接的速率
  • 每秒的请求速率
  • 当前活动连接数
  • 响应时间
  • 会话错误和拒绝

Backend 是由⼀个或多个服务器组成的集群,这些服务器⽤于处理frontend转发过来的请求。通常监控 backend 以下信息:

  • 会话数、当前活动连接
  • 后端服务器的响应时间
  • 后端服务器错误和超时等
  • 后端服务器的健康状态(⽐如是否在线、是否繁忙等)

1.3.1 haporxy fronted连接与会话相关指标

指标名称

指标类型

指标含义

haproxy_frontend_ connections_total

counter


HAProxy 前端的新建连接总数。

haproxy_frontend_connections_rate_max

gauge

HaPorxy 前端每秒最⼤新建连接速率。

haproxy_frontend_sessions_total

gauge

HAProxy 前端接受的总会话数。

haproxy_frontend_current_sessions

gauge

HAProxy 前端当前活跃会话的数量。

haproxy_frontend_max_sessions

gauge

HAProxy当前最⼤并发会话数

haproxy_frontend_limit_sessions


gauge

HaProxy 前端会话数上限。这个值是静态配的,⽤来防⽌过载。在default字段下配置 maxconn 参数

haproxy_frontend_max_session_rate

gauge

HaProxy 前端每秒新建最⼤的会话速率。

haproxy_frontend_limit_session_rate


gauge

HaProxy 前端每秒新建会话速率上限。在frontend⾥⾯通过添加 rate-limit sessions参数进⾏配置

案例1:查询最近5分钟,Haproxy前端新建连接数的速率 
rate(haproxy_frontend_connections_total[5m]) 

案例2:查询最近5分钟,Haproxy前端当前平均活跃的会话数,占⽐的总限制的会话数⽐率。
计算公式:( 当前活跃的会话数 / 会话数的限制 * 100 )
avg_over_time(haproxy_frontend_current_sessions[5m]) / haproxy_frontend_limit_sessions * 100 

案例3:查询最近5分钟,haproxy前端平均每秒的新建最⼤的会话速率,占⽐总限制的新建会话⽐率。
计算公式:( 每秒新建的最⼤会话速率 / 每秒新建会话速率限制 * 100) 
avg_over_time(haproxy_frontend_max_session_rate[5m]) / haproxy_frontend_limit_session_rate * 100 

1.3.2 haporxy fronted http请求与响应相关指标

指标名称

指标类型

指标含义

haproxy_frontend_http_requests_total

counter


HAProxy 前端接收的 HTTP 请求的总数(仅统计有效的)。

haproxy_frontend_http_requests_rate_max

gauge

HAProxy 前端每秒最⼤新建的 HTTP 请求速率。


haproxy_frontend_request_errors_total

counter


HAProxy 前端接收到的请求错误总数,可能包括格式错误或协议错误等请求。

haproxy_frontend_http_responses_total

counter


HAProxy 前端发送的 HTTP 响应,按照HTTP 状态码进⾏分类统计。

案例1:查询 HAProxy 前端最近1分钟的 HTTP 每秒请求速率。
rate (haproxy_frontend_http_requests_total[1m]) 

案例2:查询 HAProxy 前端最近1分钟,最⼤的新建请求数量。 
max_over_time(haproxy_frontend_http_requests_rate_max[1m])

案例3:查询 HAProxy 前端最近1分钟,HTTP每秒的错误请求速率 
rate(haproxy_frontend_request_errors_total[1m])

案例4:查询 HTTP 响应错误(4xx 和 5xx)占总请求⽐率,
计算公式:(4xx|5xx的响应码增⻓率 / 总的请求数)
rate(haproxy_frontend_http_responses_total{code=~"4xx|5xx"}[5m]) 
/ ignoring(code) 
group_left 
rate(haproxy_frontend_http_requests_total[5m]) * 100 

1.3.3 HaproxyBackend相关指标

指标名称

指标类型

指标含义

haproxy_backend_sessions_total

counter


HAProxy 后端处理的总会话数,包括新连接的会话。

haproxy_backend_current_sessions

gauge

HAProxy 后端当前活跃的会话并发数量。

haproxy_backend_max_sessions

gauge

HAProxy 后端同时处理过的最⼤会话数量。

haproxy_backend_limit_sessions


gauge

HAProxy 后端限制最⼤会话限制,默认是500,可以通过配置fullconn number来修改这个限制。

haproxy_backend_http_requests_total

counter


HAProxy 后端接收到的 HTTP 总请求数。

haproxy_backend_http_responses_total

counter


HAProxy 后端的 HTTP 响应的数量,包括成功响应和错误响应。

案例1:计算最近5分钟,当前后端平均每秒的活跃的会话数,占总会话数限制的⽐率。
计算公式:( 当前并发活跃的会话数 / 最⼤限制的会话数 * 100 )
avg_over_time(haproxy_backend_current_sessions[5m]) / haproxy_backend_limit_sessions * 100 

案例2:计算最近5分钟,后端4xx响应的错误率:
计算公式:( 后端4xx响应数 / 后端总请求数 * 100 ) 
rate(haproxy_backend_http_responses_total{code="4xx"}[5m]) / ignoring(cod 
e) rate(haproxy_backend_http_requests_total[5m]) * 100

案例3:计算最近5分钟,后端5xx响应的错误率:
计算公式:( 后端5xx响应数 / 后端总请求数 * 100%) 
rate(haproxy_backend_http_responses_total{code="5xx"}[5m]) / ignoring(code) rate(haproxy_backend_http_requests_total[5m]) * 100

1.3.4 Haproxy监控状态相关指标

指标名称

指标类型

指标含义

haproxy_process_start_time_seconds

counter


HaProxy 进程的启动时间,可以⽤它来确定HAProxy 运⾏了多久。

haproxy_backend_active_servers


gauge

HaProxy 当前活跃的后端服务器数量,如果为0则表示整个后端服务器全部不可⽤。

haproxy_server_check_failures_total

counter


HaProxy 后端服务器健康检查失败的实例,1表示检测失败、0表示没有失败

案例1:查询Haroxy运⾏了多⻓时间,
计算公式:( (当前时间 - haproxy运⾏时⻓) / ⼩时 )
(time() - haproxy_process_start_time_seconds ) / 3600 

案例2:检查后端的活跃服务器⼩于1 
haproxy_backend_active_servers < 1 

案例3:查询Haproxy后端服务器是否有检测失败的。
haproxy_server_check_failures_total == 1

1.4 Haproxy告警规则文件

1.4.1 告警规则⽂件

vim /app/module/prometheus/rules/haproxy_rules.yml
groups:
- name: "Haproxy告警规则"
  rules:
  - alert: Haproxy前端活跃会话数过高
    expr: |
      avg_over_time(haproxy_frontend_current_sessions[5m]) 
	  / 
	  haproxy_frontend_limit_sessions * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "实例:{{ $labels.instance }} Haproxy前端活跃会话数占限制比率过高"
      description: "Haproxy前端'{{ $labels.proxy }}' 活跃会话数占限制的会话数比率超过了80%,当前值为{{ $value }}%。"
  - alert: Haproxy前端新建会话速率过高
    expr: |
      avg_over_time(haproxy_frontend_max_session_rate[5m])
      /
      haproxy_frontend_limit_session_rate * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "实例:{{ $labels.instance }} Haproxy前端新建会话速率占限制比率过高"
      description: "Haproxy前端'{{ $labels.proxy }}' 每秒新建的会话速率占限制比率已经超过80%,当前值为{{ $value }}%。"
  - alert: Haproxy前端HTTP响应4xx\5xx错误率过高
    expr: |
      rate(haproxy_frontend_http_responses_total{code=~"4xx|5xx"}[5m])
      /ignoring(code)
      group_left
      rate(haproxy_frontend_http_requests_total[5m]) * 100 > 20
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "实例:{{ $labels.instance }} Haproxy前端HTTP响应错误率过高"
      description: "Haproxy前端'{{ $labels.proxy }}' 的 {{ $labels.code }}状态码占总请求的比率已经超过20%,当前错误率为{{ $value }}%。"
  - alert: Haproxy后端活跃会话数占限制比率过高
    expr: |
      avg_over_time(haproxy_backend_current_sessions[5m])
      /
      haproxy_backend_limit_sessions * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "实例:{{ $labels.instance }} Haproxy后端活跃会话数占限制比率过高"
      description: "Haproxy后端'{{ $labels.proxy }}' 活跃会话数占总会话数限制的比率超过了80%,当前值为{{ $value }}%。"
  - alert: Haproxy后端4xx错误率过高
    expr: |
      rate(haproxy_backend_http_responses_total{code="4xx"}[5m])
      /
      ignoring(code) rate(haproxy_backend_http_requests_total[5m]) * 100 > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "实例:{{ $labels.instance }} Haproxy后端4xx错误率过高 "
      description: "Haproxy后端'{{ $labels.proxy }}' 的4xx响应错误率超过了10%,当前错误率为{{ $value }}%。"
  - alert: Haproxy后端5xx错误率过高
    expr: |
      rate(haproxy_backend_http_responses_total{code="5xx"}[5m])
      /
      ignoring(code) rate(haproxy_backend_http_requests_total[5m]) * 100 > 10
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "实例:{{ $labels.instance }} Haproxy后端5xx错误率过高 "
      description: "Haproxy后端'{{ $labels.proxy }}' 的5xx响应错误率超过了10%,当前错误率为{{ $value }}%。"
  - alert: Haproxy后端无活跃服务器
    expr: haproxy_backend_active_servers < 1
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "实例:{{ $labels.instance }} 后端无活跃服务器"
      description: "Haproxy '{{ $labels.proxy }}' 后端活跃服务器数量小于1,这意味着整个后端服务不可用,立即检查后端服务器状态。"
  - alert: Haproxy后端服务器检测失败
    expr: haproxy_server_check_failures_total == 1
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "实例:{{ $labels.instance }} 后端服务器检测失败"
      description: "Haproxy '{{ $labels.proxy }}' 后端的 '{{ $labels.server }}' 实例检测失败,可能存在连接问题或服务不稳定。"

1.4.2 检查rules语法

/app/module/prometheus/promtool check rules /app/module/prometheus/rules/haproxy_rules.yml

1.4.3 重新加载Prometheus

curl -X POST http://192.168.137.131:9090/-/reload

1.4.4 验证告警规则

Prometheus监控之Haproxy_lua_03

1.5 导⼊Haproxy图形

导⼊haproxy的Grafana模板。ID为 12693 这个模板提供了HAProxy 性能和状态的图表,包括请求数、响应时间、错误计数等。

Prometheus监控之Haproxy_lua_04