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
1.1.8 metrics接⼝暴露指标
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 验证告警规则
1.5 导⼊Haproxy图形
导⼊haproxy的Grafana模板。ID为 12693 这个模板提供了HAProxy 性能和状态的图表,包括请求数、响应时间、错误计数等。
标签:Haproxy,haproxy,frontend,5m,Prometheus,监控,http,backend From: https://blog.51cto.com/u_13236892/11945210