【Prometheus】Prometheus如何监控Haproxy

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏: Prometheus监控系统零基础到进阶
景天的主页: 景天科技苑

文章目录

  • Prometheus如何监控Haproxy
    • 1、监控案例介绍
      • [1.1 监控场景描述](#1.1 监控场景描述)
      • [1.2 监控环境规划](#1.2 监控环境规划)
    • 2、Prometheus监控Haproxy
      • [2.1 安装并配置Haproxy](#2.1 安装并配置Haproxy)
      • [2.2 配置Prometheus,将Haproxy纳入监控](#2.2 配置Prometheus,将Haproxy纳入监控)
      • [2.3 Haproxy常用指标](#2.3 Haproxy常用指标)
      • [2.4 Haproxy告警规则文件](#2.4 Haproxy告警规则文件)
      • [2.5 Grafana导入Haproxy图形](#2.5 Grafana导入Haproxy图形)

Prometheus如何监控Haproxy

1、监控案例介绍

1.1 监控场景描述

在前⾯的章节中,我们已经学习了如何使用 Prometheus 结合node_exporter 来监控系统资源的CPU、内存、磁盘、网络等,

同时我们还通过"监控的方法论"找出了不同资源的重要的指标,并编写PromQL查询表达式和告警规则。

但是,系统资源的监控只是监控的一部分。因此我们还需要关注运行在这些节点上的应用程序。

接下来,我们将深入探讨如何通过应用程序暴露的指标来直接监控它们,或者通过 Exporter 来间接收集不同应用的指标数据。

同时我们还会逐一介绍每个应用的关键性能指标,并讲解如何利用PromQL 对这些指标进行查询。

此外,我们对应的PromQL制作为告警规则,以便在系统出现异常时,能第一时间进行通知。

我们先看下监控案例的场景

有些应用程序自带metrics,像Haprox,RabitMQ,kubernetes等,

有些需要我们借助exporter进行暴露metrics,很多应用都有对应的exporter

有些需要服务发现,

有些需要push数据给网关,

还有些黑盒监控,如何通过http探测网站,通过tcp去探测相关服务

我们针对不同类型,都有详细讲解如何监控。

1、应用自带Metrics如何监控:

2、应用无法自带Metrics,借助Exporter如何监控;

3、黑盒监控BlackBox;

4、PushGateway如何使用;

掌握这些监控的资源的重要指标,以及PromQL的查询表达式编写,PromQL告警规则文件;

告警:

AlertManager

图形:

Grafana

1.2 监控环境规划

2、Prometheus监控Haproxy

从 HAProxy 2.0 版本开始,HAProxy 内置了对 Prometheus 的支持。

这意味着 HAProxy 能够直接提供兼容Prometheus的指标格式,无需依赖任何额外的 exporter 。(安装Haproxy、然后修改stats,配置对外输出metrics接口)

2.1 安装并配置Haproxy

1、使用yum安装Haproxy,centos7默认安装的是1.5版本,无法安装2.0以上的版本。我们使用功能rocketlinux9.5系统可以yum安装

bash 复制代码
yum install haproxy -y

看下systemd配置文件

2、配置Haproxy的stats功能

先将源文件备份

bash 复制代码
cat /etc/haproxy/haproxy.cfg
yaml 复制代码
global
  maxconn 100000 # Haproxy支持最大的会话数,如果default没有配置则使用global
  # uid 99
  # gid 99
  user haproxy
  group haproxy
  daemon
  log 127.0.0.1 local2 info
  pidfile /var/lib/haproxy/haproxy.pid
  stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin # 定义sock位置及权限
defaults
  option http-keep-alive
  option forwardfor
  maxconn 5000 # Haproxy支持的最大会话数,默认是100000
  retries 3 # 连接后端服务器失败的次数如果超过这里设置的值,haproxy会将对应的后端服务器标记为不可用
  mode http
  timeout connect 300s
  timeout client 300s
  timeout server 300s
# 打开负载均衡的状态页面
frontend stats
  bind *:9999
  stats enable
  stats uri /haproxy-status
  stats auth jingtian:123456
 
  # Prometheus metrics 的路径
  http-request use-service prometheus-exporter if { path /metrics }
  # 允许每秒通过haproxy的新会话数限制为 100 个。如果超过这个数值,额外的新会话将被延迟或拒绝
  rate-limit sessions 100
# 定义负载均衡配置
frontend java
  bind *:80
  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 *:81
  mode http
  rate-limit sessions 200
  default_backend webservers
backend webservers
  balance roundrobin
  # 后端支持最大的并发连接数(会话数)
  fullconn 1000
  server web3 10.10.0.30:9090 check
  server web4 127.0.0.1:8080 check

3、启动Haproxy

bash 复制代码
systemctl enable haproxy.service --now

查看运行状态

我们看到haproxy开启了两个负载均衡组,分别为80和81两个端口号

一个haproxy可以有很多个负载均衡组

4、检查Haproxy的状态页面

http://10.10.0.31:9999/haproxy-status

刚进去需要先登录

5、检查Haproxy的metrics接口是否能暴露指标

http://10.10.0.31:9999/metrics

能访问这个metrics获取数据,依托于这个配置

2.2 配置Prometheus,将Haproxy纳入监控

1、编辑Prometheus配置文件,将Haproxy服务纳入监控

vim prometheus.yml

yaml 复制代码
  - job_name: "haproxy"
    static_configs:
      - targets: ["jingtian02:9999"]

2、重新加载Prometheus配置文件

bash 复制代码
curl -X POST http://localhost:9090/-/reload

3、检查Prometheus的Status->Targets页面,验证Haproxy是否已经成功纳入监控中

在prometheus查询中,输入haproxy,可以查到相关指标

并且可以查询到结果

2.3 Haproxy常用指标

对于 HAProxy,通常会使用 RED 方法,监控:请求速率(Rate)、请求失败数(Errors)、请求延迟(Duration)

但是Haproxy作为负载均衡,他又分为了前端和后端:
Frontend 在 HAProxy 中指的是客户端连接到的部分,它负责接收来⾃客户端的请求并将它们转发到相应的 backend 集群。

通常监控 frontend 以下信息:

新建连接的速率

每秒的请求速率

当前活动连接数

响应时间

会话错误和拒绝

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

会话数、当前活动连接

后端服务器的响应时间

后端服务器错误和超时等

后端服务器的健康状态(比如是否在线、是否繁忙等)

1、haporxy fronted 连接与会话相关指标

haproxy_frontend_limit_session_rate 这个是需要在配置haproxy的配置文件中配置的

案例1:查询最近5分钟,Haproxy前端新建连接数的速率

bash 复制代码
rate(haproxy_frontend_connections_total[5m])

案例2:查询最近5分钟,Haproxy前端当前平均活跃的会话数,占总会话数上限的比率。 gauge类型的数据求一段时间的平均数可以用avg_over_time

计算公式:( 当前活跃的会话数 / 会话数的限制 * 100 )

bash 复制代码
avg_over_time(haproxy_frontend_current_sessions[5m]) / haproxy_frontend_limit_sessions * 100

案例3:查询最近5分钟,haproxy前端平均每秒的新建最大的会话速率,占比总限制的新建会话比率。

计算公式:( 每秒新建的最大会话速率 / 每秒新建会话速率限制 * 100)

bash 复制代码
avg_over_time(haproxy_frontend_max_session_rate[5m]) / haproxy_frontend_limit_session_rate * 100

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

案例1:查询 HAProxy 前端最近1分钟的 HTTP 每秒请求速率。

bash 复制代码
rate (haproxy_frontend_http_requests_total[1m])

案例2:查询 HAProxy 前端最近1分钟,最⼤的新建请求数量。

bash 复制代码
max_over_time(haproxy_frontend_http_requests_rate_max[1m])

案例3:查询 HAProxy 前端最近1分钟,HTTP每秒的错误请求速率

bash 复制代码
rate(haproxy_frontend_request_errors_total[1m])

案例4:查询 最近5分钟,HTTP 响应错误(4xx 和 5xx)占总请求比率,计算公式:(4xx|5xx的响应码增长率 / 总的请求数 )

我们先看下响应状态码都是什么样的

然后看下4xx 5xx响应速率和最近5分钟请求总数

可以看到上面是多的一方,并且多了code,所以要去除code,并且使用功能group_left,哪边是多的一方,group_哪边

ignoring或group_left都必须放在 加减乘除 操作符的右侧

bash 复制代码
rate(haproxy_frontend_http_responses_total{code=~"4xx|5xx"}[5m])
/ ignoring(code)
 group_left
rate(haproxy_frontend_http_requests_total[5m]) * 100

3、HaproxyBackend 相关指标

后端限制最大会话数

案例1:计算最近5分钟,当前后端平均每秒的活跃的会话数,占总会话数限制的比率。

计算公式:( 当前并发活跃的会话数 / 最大限制的会话数 * 100 )

bash 复制代码
avg_over_time(haproxy_backend_current_sessions[5m]) / haproxy_backend_limit_sessions * 100

案例2:计算最近5分钟,后端4xx响应的错误率:计算公式:( 后端4xx响应数 / 后端总请求数 * 100 )

bash 复制代码
rate(haproxy_backend_http_responses_total{code="4xx"}[5m]) / ignoring(code) rate(haproxy_backend_http_requests_total[5m]) * 100

案例3:计算最近5分钟,后端5xx响应的错误率:计算公式:( 后端5xx响应数 / 后端总请求数 * 100%)

bash 复制代码
rate(haproxy_backend_http_responses_total{code="5xx"}[5m]) / ignoring(code) rate(haproxy_backend_http_requests_total[5m]) * 100

4、Haproxy监控状态相关指标

后端活跃的服务器数量

只有一个后端服务不是失败的,其他的都检测失败

案例1:查询Haroxy运行了多长时间,计算公式:( (当前时间 - haproxy运行时间) / 小时 )

time()得到的是当前的时间戳

bash 复制代码
(time() - haproxy_process_start_time_seconds ) / 3600

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

bash 复制代码
haproxy_backend_active_servers < 1

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

bash 复制代码
haproxy_server_check_failures_total == 1

2.4 Haproxy告警规则文件

1、编写告警规则文件

bash 复制代码
cat /etc/prometheus/rules/haproxy_rules.yml
yaml 复制代码
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 }}' 实例检测失败,可能存在连接问题或服务不稳定。"

重新加载prometheus配置

bash 复制代码
curl -X POST http://localhost:9090/-/reload

查看告警

2.5 Grafana导入Haproxy图形

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

在Grafana 仪表盘-新建-导入

输入12693,点击加载

选择数据源prometheus,点击导入


如果想看下某个图形,表达的是什么数据,可以点击右上角三个点,点击编辑


可以看到PromQL语句

相关推荐
liuyunshengsir3 小时前
Spring Boot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能
java·spring boot·prometheus
古人诚不我欺2 天前
Prometheus部署及linux、mysql、monog、redis、RocketMQ、java_jvm监控配置
prometheus
stars3 天前
grafana + Prometheus + node_exporter搭建监控大屏
grafana·prometheus
johnny2333 天前
Grafana系列之Dashboard:新增仪表板、新增变量、过滤变量、变量查询、导入仪表板、变量联动、Grafana Alert
grafana·prometheus
夜莺云原生监控3 天前
Grafana 统一可视化了,告警如何统一?
grafana·prometheus·flashduty·统一告警
大熊程序猿3 天前
node_exporter 集成Prometheus+Grafana
java·grafana·prometheus
johnny2333 天前
Grafana系列之面板接入Prometheus Alertmanager
grafana·prometheus
aashuii4 天前
简单prometheus+grafana+pushgateway采集GPU利用率和交换机流量
grafana·prometheus
黑马金牌编程4 天前
Prometheus+Grafana监控Nginx服务
linux·nginx·grafana·prometheus·监控