【Prometheus】Prometheus如何监控Haproxy
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑
文章目录
- Prometheus如何监控Haproxy
- 1、监控案例介绍
- 1.1 监控场景描述
- 1.2 监控环境规划
- 2、Prometheus监控Haproxy
- 2.1 安装并配置Haproxy
- 2.2 配置Prometheus,将Haproxy纳入监控
- 2.3 Haproxy常用指标
- 2.4 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安装
yum install haproxy -y
看下systemd配置文件
2、配置Haproxy的stats功能
先将源文件备份
cat /etc/haproxy/haproxy.cfg
globalmaxconn 100000 # Haproxy支持最大的会话数,如果default没有配置则使用global# uid 99# gid 99user haproxygroup haproxydaemonlog 127.0.0.1 local2 infopidfile /var/lib/haproxy/haproxy.pidstats socket /var/lib/haproxy/haproxy.sock mode 600 level admin # 定义sock位置及权限
defaultsoption http-keep-aliveoption forwardformaxconn 5000 # Haproxy支持的最大会话数,默认是100000retries 3 # 连接后端服务器失败的次数如果超过这里设置的值,haproxy会将对应的后端服务器标记为不可用mode httptimeout connect 300stimeout client 300stimeout server 300s
# 打开负载均衡的状态页面
frontend statsbind *:9999stats enablestats uri /haproxy-statusstats auth jingtian:123456# Prometheus metrics 的路径http-request use-service prometheus-exporter if { path /metrics }# 允许每秒通过haproxy的新会话数限制为 100 个。如果超过这个数值,额外的新会话将被延迟或拒绝rate-limit sessions 100
# 定义负载均衡配置
frontend javabind *:80mode httprate-limit sessions 100default_backend javaserver
backend javaserverbalance roundrobinserver web1 127.0.0.1:8080 checkserver web2 127.0.0.1:8080 check
# 定义负载均衡配置
frontend webbind *:81mode httprate-limit sessions 200default_backend webservers
backend webserversbalance roundrobin# 后端支持最大的并发连接数(会话数)fullconn 1000server web3 10.10.0.30:9090 checkserver web4 127.0.0.1:8080 check
3、启动Haproxy
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
- job_name: "haproxy"static_configs:- targets: ["jingtian02:9999"]
2、重新加载Prometheus配置文件
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前端新建连接数的速率
rate(haproxy_frontend_connections_total[5m])
案例2:查询最近5分钟,Haproxy前端当前平均活跃的会话数,占总会话数上限的比率。 gauge类型的数据求一段时间的平均数可以用avg_over_time
计算公式:( 当前活跃的会话数 / 会话数的限制 * 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
2、haporxy fronted 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:查询 最近5分钟,HTTP 响应错误(4xx 和 5xx)占总请求比率,计算公式:(4xx|5xx的响应码增长率 / 总的请求数 )
我们先看下响应状态码都是什么样的
然后看下4xx 5xx响应速率和最近5分钟请求总数
可以看到上面是多的一方,并且多了code,所以要去除code,并且使用功能group_left,哪边是多的一方,group_哪边
ignoring或group_left都必须放在 加减乘除 操作符的右侧
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 )
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(code) 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
4、Haproxy监控状态相关指标
后端活跃的服务器数量
只有一个后端服务不是失败的,其他的都检测失败
案例1:查询Haroxy运行了多长时间,计算公式:( (当前时间 - haproxy运行时间) / 小时 )
time()得到的是当前的时间戳
(time() - haproxy_process_start_time_seconds ) / 3600
案例2:检查后端的活跃服务器小于1
haproxy_backend_active_servers < 1
案例3:查询Haproxy后端服务器是否有检测失败的
haproxy_server_check_failures_total == 1
2.4 Haproxy告警规则文件
1、编写告警规则文件
cat /etc/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 > 80for: 5mlabels:severity: warningannotations: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 > 80for: 5mlabels:severity: warningannotations: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_leftrate(haproxy_frontend_http_requests_total[5m]) * 100 > 20for: 5mlabels:severity: criticalannotations: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 > 80for: 5mlabels:severity: warningannotations: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> 10for: 5mlabels:severity: warningannotations: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> 10for: 5mlabels:severity: criticalannotations:summary: "实例:{{ $labels.instance }} Haproxy后端5xx错误率过高 "description: "Haproxy后端'{{ $labels.proxy }}' 的5xx响应错误率超过了10%,当前错误率为{{ $value }}%。"- alert: Haproxy后端无活跃服务器expr: haproxy_backend_active_servers < 1for: 5mlabels:severity: criticalannotations:summary: "实例:{{ $labels.instance }} 后端无活跃服务器"description: "Haproxy '{{ $labels.proxy }}' 后端活跃服务器数量小于1,这意味着整个后端服务不可用,立即检查后端服务器状态。"- alert: Haproxy后端服务器检测失败expr: haproxy_server_check_failures_total == 1for: 5mlabels:severity: warningannotations:summary: "实例:{{ $labels.instance }} 后端服务器检测失败"description: "Haproxy '{{ $labels.proxy }}' 后端的 '{{ $labels.server }}' 实例检测失败,可能存在连接问题或服务不稳定。"
重新加载prometheus配置
curl -X POST http://localhost:9090/-/reload
查看告警
2.5 Grafana导入Haproxy图形
导入haproxy的Grafana模板。ID为 12693 这个模板提供了 HAProxy 性能和状态的图表,包括请求数、响应时间、错误计数等。
在Grafana 仪表盘-新建-导入
输入12693,点击加载
选择数据源prometheus,点击导入
如果想看下某个图形,表达的是什么数据,可以点击右上角三个点,点击编辑
可以看到PromQL语句
相关文章:

【Prometheus】Prometheus如何监控Haproxy
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别
目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言,Python也是高级编程语言;不是框架(框架:一般用于大型复杂需求项目,用于快速开发)具有三大特性,所谓Jav…...
HTML5 常用事件详解
在现代 Web 开发中,用户交互是提升用户体验的关键。HTML5 提供了丰富的事件机制,允许开发者监听用户的操作(如点击、拖动、键盘输入等),并触发相应的逻辑处理。本文将详细介绍 HTML5 中的常用事件,包括鼠标…...

TCP全连接队列
1. 理解 int listen(int sockfd, int backlog) 第二个参数的作用 backlog:表示tcp全连接队列的连接个数1。 如果连接个数等于backlog1,后续连接就会失败,假设tcp连接个数为0,最大连接个数就为1,并且不accept获取连接…...

统计文本文件中单词频率的 Swift 与 Bash 实现详解
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

iOS 权限管理:同时请求相机和麦克风权限的最佳实践
引言 在开发视频类应用时,我们常常会遇到需要同时请求相机和麦克风权限的场景。比如,在用户发布视频动态时,相机用于捕捉画面,麦克风用于录制声音;又或者在直播功能中,只有获得这两项权限,用户…...
Excel 实现文本拼接方法
1. 使用 & 运算符 这是最常见和简单的拼接方法。你只需使用 & 来连接多个文本单元格或文本字符串。 示例公式: A1 & B1这个公式会将 A1 和 B1 单元格中的文本合并为一个字符串。 如果你希望在文本之间加入分隔符(如空格、逗号等…...
软考信安27~Windows操作系统安全相关
1、Windows账户与组管理 1.1、用户账户查看 whoami #查看当前登录的用户名称 whoami /all #查看当前系统的用户名和组信息,以及SID whoami /user #查看当前用户的SID net user #查看系统中包含哪些用户 wmic useraccount get name,sid #查看…...

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型
作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…...
WordPress Hunk Companion插件节点逻辑缺陷导致Rce漏洞复现(CVE-2024-9707)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

使用 HTML 开发 Portal 页全解析
前言 在当今数字化时代,网站作为企业和个人展示信息、提供服务的重要窗口,其重要性不言而喻。而 Portal 页,作为网站的核心页面之一,承担着引导用户、整合信息等关键任务。那么,如何使用 HTML 开发一个功能齐全、界面…...

机器学习(二)
一,Multiple features(多类特征) 多元线性回归: 1,多类特征的符号表示: (可以类比二维数组) 2,多元线性回归模型: 二,Vectorization(向量化) (简化代码&缩短运行速度): 向量化实现多元线性回归模型: 向量化实现多…...
Laravel 实战:用Carbon筛选最近15分钟内的数据
在开发基于时间的特性时,常常需要筛选出在特定时间范围内的记录。例如,在一个设备报告系统中,你可能需要获取最近15分钟内的设备报告。本文将介绍如何在 Laravel 中实现这一功能,包括如何使用 Carbon 和 Eloquent 查询来筛选 crea…...
Ubuntu20.04 文件系统打不开
问题描述: 电脑中安装了相关的工具, 删除了一些东西之后,Linux 电脑操作系统为 Ubuntu20.04突然打不开文件系统了,命令 sudo nautilus 可以正常进入, 显示了很多权限问题。 使用过: killall nautilus 不起作用,后查原因:我无法作为普通用户…...
vue3的组件v-model(defineModel()宏)
这里展示的是vue3.4版本之前的如何在组件上使用以实现双向绑定 <template><p>我是子组件</p><input :value"props.modelValue" input"handelInput"/> </template><script lang"ts" setup>const props def…...

在 Ubuntu 22.04 上安装 Kubernetes(Kubeadm 安装方式)
使用 Kubeadm、Containerd 和 Calico 网络插件搭建 Kubernetes 集群教程 1.安装前准备(所有节点执行) 关闭防火墙 sudo systemctl disable --now ufw设置服务时区 # 设置为亚洲的上海时区 sudo timedatectl set-timezone Asia/Shanghai # 重启时间同…...

2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计
一、高并发内存池框架设计 高并发池框架设计,特别是针对内存池的设计,需要充分考虑多线程环境下: 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率,减少锁竞争和内存碎片。 高并发内存…...
Java算法——排序
目录 引言1. 插入排序1.1 基本思想1.2 直接插入排序1.3 希尔排序 2. 选择排序2.1 基本思想2.2 直接选择排序2.3 直接选择排序变种2.4 堆排序 3. 交换排序3.1 基本思想3.2 冒泡排序3.3 快速排序3.3.1 快速排序的基本结构3.3.2 Hoare法3.3.3 挖坑法3.3.4 双指针法 3.4 快速排序非…...

【Python・机器学习】多元回归模型(原理及代码)
前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…...
mysql数据被误删的恢复方案
文章目录 一、使用备份恢复二、使用二进制日志(Binary Log)三、使用InnoDB表空间恢复四、使用第三方工具预防措施 数据误删是一个严重的数据库管理问题,但通过合理的备份策略和使用适当的恢复工具,可以有效地减少数据丢失的风险…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...

【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...