【Prometheus】PromQL进阶用法
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生k8s,Prometheus监控,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Prometheus监控系统零基础到进阶
景天的主页:景天科技苑
PromQL进阶用法
1、PromQL资源监控案例
资源监控无外乎CPU,内存,磁盘,网络等。
怎么监控呢?需要找到具体的指标,寻找指标又要用到方法论,如下:
1.1 监控系统资源方法论
1、Google 的四个黄金指标着眼点在“服务监控”,这四个指标分别是“延迟、
流量、错误、饱和度”
2、RED方法主要着眼点在“用户体验”,它基于Google的黄金指标,细化了
三个关键指标,“请求率、错误数、请求处理时间”
3、USE方法主要着眼点在“系统资源”,的使用情况,这三个指标分别是“使
用率、饱和度、错误”。因此USE方法是最适合系统资源监控的
1.2 使用USE监控系统资源
在监控CPU、内存、磁盘和⽹络等系统资源时,使⽤USE的⽅法论是最为合适
的,它要求我们针对每个资源(也就是CPU、内存 、⽹络等)分别检查三个关键
方面:使用率、饱和度和错误。
使用率:表示资源在占作时占用的平均时间,例如,CPU在过去的60秒内有
30秒被用来执行指令,那么我们可以说这个CPU的使用率是50%。
饱和度:指明资源已经到达或接近其处理能力极限的程度,表明无法再处理
更多的工作量。这通常通过队列长度等指标来衡量。
错误:记录了资源在运行过程中发生的错误事件的次数。网络监控用的比较多
2、CPU监控案例实践
2.1 CPU重点监控的维度
对于CPU资源的监控,采用USE方法论通常关注以下几点:
CPU使用率:衡量CPU在一段时间内处于活跃状态的百分比。高使用率可能表明系统正在密集执行任务。
CPU饱和度:反映了在某一时间点等待CPU时间的进程数量。高饱和度可能意味着有很多任务在争夺CPU资源。
错误:通常对CPU不太有影响;
案例1:监控CPU1分钟的平均使用率;
案例2:监控CPU的饱和度;
2.2 计算CPU平均使用率
计算CPU平均使用率的公式: (1 - CPU 空闲率) * 100 = CPU 使用率
第一步:获取每个CPU模式的变化率,使用irate函数灵敏度更高,反映更接近实际使用率。
rate(node_cpu_seconds_total[1m])
第二步:查询CPU的空闲时间比率,即CPU处于空闲状态的时间比例。
irate(node_cpu_seconds_total{mode="idle"}[1m])
第三步:系统可能会有多个CPU核心,因此我们需要通过avg聚合函数来计算CPU平均空闲率,最后按照实例进行分组统计。
avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)
第四步:使用1减去每个核心的平均空闲率,得到平均使用率,然后将此值乘以100,转换为百分比,最终得出CPU的整体平均使用率
(1 - avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) ) *100
2.3 计算CPU饱和度
评估主机的CPU饱和度,最常用的方法是跟踪系统的平均负载。通常情况下,如
果这个负载的值低于CPU核心的数量,可以认为系统运行正常。然而,当平均负
载持续高于CPU核心数量的两倍时,这通常是CPU已经非常饱和了。
计算CPU饱和度的公式:1分钟平均负载 / (CPU核⼼数*2) * 100 = CPU饱和度
的百分比,当大于80%则认为CPU已经接近处理能力的极限。
第一步:获取1分钟平均负载值,然后按照实例和job进行分组计算。
sum(node_load1) by (instance,job)
第二步:获取CPU的核心数,然后乘以2,按实例进行分组计算每个实例的核心数。 这个mode找空闲的还是其他的都可以,因为是要查找CPU核心数
(count(node_cpu_seconds_total{mode="idle"}) by (instance,job) * 2)
第三步:计算CPU饱和度百分比,如果这个百分比大于80%,我们认为CPU已经
非常饱和,并且已经达到了处理能力的极限。
sum(node_load1) by (instance,job) / (count(node_cpu_seconds_total{mode="idle"}) by (instance,job) * 2) * 100 > 80
2.4 配置CPU告警规则
1、定义CPU告警规则组,然后注入两条规则
cat /etc/prometheus/rules/node_rules.yml
以groups开头
groups:
- name: CPU告警规则
rules:
- alert: 节点CPU使用率超过80%
expr: ( 1 - avg(irate(node_cpu_seconds_total{mode="idle"}[1m])) by (instance,job) ) * 100 > 80
for: 1m
labels:
severity: warning
annotations:
summary: "主机CPU利用率过高,实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"
description: "该实例的CPU利用率高于80%,当前利用率:{{ $value }}%。请及时检查。"
- alert: CPU饱和度过高
expr: sum(node_load1) by (instance,job) / (count(node_cpu_seconds_total{mode="idle"}) by (instance,job) * 2) * 100 > 80
for: 2m
labels:
severity: critical
annotations:
summary: "CPU饱和度过高,实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"
description: "该实例的1分钟平均CPU负载超过了核心数的两倍,已经持续2分钟,当前CPU饱和度:{{ $value }}%。需要立即检查系统负载情况。"
如果想要prometheus读取到我们配置的告警规则,需要让prometheus能够读取到该配置文件
我们先看下默认的prometheus.yml配置文件写法
需要指定告警规则的yml文件路径
如果告警规则比较多,我们可以指定某个路径下的所有yml文件
然后执行prometheus热加载
curl -X POST http://localhost:9090/-/reload
检查配置文件格式是否正确
./promtool check config prometheus.yml
然后在prometheus的alert界面,就可以看到我们配置的告警规则
3、内存监控案例实践
3.1 内存重点监控的维度
对于内存资源的监控,采用USE方法论通常关注以下几点:
1、内存使用率:衡量系统内存被使用的程度。
2、内存饱和度:表明系统内存的负载程度。内存饱和度,通常监控SWAP的使用率来评估。
3、内存错误:通常较少发生。
案例1:计算内存使用率;
案例2:计算内存饱和度;
3.2 计算内存使用率
计算内存使用率百分比公式: ( 总内存 - 可用内存)/ 总内存 * 100 = 内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
3.3 计算内存饱和度
计算内存饱和度百分比公式: (总SWAP - 未使用的SWAP) / 总SWAP * 100> 20
(node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100
3.4 配置内存告警规则
1、定义内存告警规则组,然后注入两条规则
[root@prom-node01 ~]# cat /etc/prometheus/rules/node_rules.yml
groups:
- name: 内存告警规则
rules:
- alert: 主机内存不足
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80
for: 2m
labels:
severity: warning
annotations:
summary: "主机内存使用率较高, 实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"
description: "该实例的内存使用率持续2分钟高于80%,当前利用率:{{ $value}}%"
- alert: 内存饱和度高
expr: (node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes * 100 > 10
for: 2m
labels:
severity: warning
annotations:
summary: "主机内存内存饱和度高, 实例:{{ $labels.instance }}, 任务:{{ $labels.job }}"
description: "SWAP内存使用率已连续2分钟超过10%,表明内存饱和度过高,当前SWAP使用率为:{{ $value }}%。"
我们可以去掉–name 和rules
这样,告警规则就在一个分组下
如果我们加上,就单独是一个分组
4、磁盘监控案例实践
4.1 磁盘重点监控的维度
对于磁盘,我们不光需要度量磁盘使用率,甚至还需要度量 磁盘IO读写吞吐量、以及磁盘IOPS
1、磁盘使用率:衡量磁盘空间使用率、Inode使用率;
2、磁盘延迟:有些磁盘明确标注了延迟,我们可以监控磁盘的读写延迟,而后进行判定;
3、磁盘饱和度:通过监控I/O吞吐量和IOPS,可以衡量磁盘在繁忙时段的饱和度情况。
案例1:计算磁盘空间使用率、磁盘Inode空间使用率;
案例2:计算磁盘的IO吞吐量的饱和度;
案例3:计算IOPS每秒读写次数的饱和度;
常规磁盘的每秒的IOPS能力和IO吞吐量,有标准后,就好基于标准进行触发器设定,例如当IOPS每秒读写次数的饱和度超过80%则需要关注了
4.2 计算磁盘空间使用率
计算磁盘空间使用率:(总的磁盘空间 - 可用的磁盘空间 = 已用的磁盘空间) / 总的磁盘空间 * 100
计算Inode空间使用率:( 总的Inode数 - 可用的inode数) / 总的inode数 * 100
1、计算不同分区的磁盘空间使用率(排除tmpfs的分区)
( node_filesystem_size_bytes{device!="tmpfs"} - node_filesystem_avail_bytes{device!="tmpfs"} ) / node_filesystem_size_bytes{device!="tmpfs"} * 100
2、计算inode使用率(排除tmpfs的分区)
(node_filesystem_files{device!="tmpfs"} - node_filesystem_files_free{device!="tmpfs"} ) / node_filesystem_files{device!="tmpfs"} * 100
4.3 计算磁盘IO吞吐量
I/O吞吐量:衡量在单位时间内磁盘能够读写多少数据量,通常以MB/s(兆字节每秒)为单位。
I/O吞吐量饱和度(%)=(当前IO吞吐量 / 磁盘的最大IO吞吐量能力)× 100
要根据不同的磁盘类型来确定磁盘的最大IO吞吐能力,如果使用云主机,厂商告诉你磁盘的最大吞吐能力为多大
磁盘吞吐量指标
1、模拟IO写入吞吐量,并限制写入IO最大20MB/s
yum install pv -y
dd if=/dev/zero bs=1M count=10000 | pv -L 20M > /tmp/bigdata
2、获取当前磁盘最近1分钟的,写入吞吐量最大的值,然后按实例进行分组计算,最后将结果转为MB
max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024 /1024
3、使用当前IO写入吞吐量 除以 磁盘最大写入I/O吞吐量30MB/s,而后乘以100,获取I/O吞吐的饱和度百分比
(max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024 /1024) / 30 * 100
# 告警(当IO写入吞吐大于80%则触发告警),round四舍五入取整数
round(max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024/1024 / 30 * 100) > 60
4、模拟IO读取吞吐量,并限制读取IO最大20MB/s
# yum install pv -y
pv -L 20M /tmp/bigdata > /dev/null
在这里插入图片描述
5、获取当前磁盘最近1分钟的,读取吞吐量最大的值,然后按实例进行分组计算,最后将结果转为MB
max(rate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024
6、使用当前IO读取吞吐量 除以 磁盘最大读取I/O吞吐量30MB/s,而后乘以100,获取I/O吞吐的饱和度百分比
max(rate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024 /30 * 100
# 告警(当IO读取吞吐大于60%则触发告警)
round(max(irate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024 /30 * 100 ) > 60
4.4 计算磁盘IOPS
IOPS:衡量在单位时间内磁盘能够读写操作的次数。
IOPS饱和度(%)=(当前IOPS / 磁盘的最大IOPS能力)× 100
iops指标
1、模拟IO写入,也相当于有大量IOPS
dd if=/dev/zero bs=1M count=10000 | pv -L 100M > /tmp/bigdata
2、获取当前磁盘最近1分钟的,IOPS写入次数的最大的值,然后按实例进行分组计算
max(irate(node_disk_writes_completed_total[1m])) by (instance,job)
3、使用当前IOPS写入次数 除以 磁盘最大IOPS,这里是120,而后乘以100,获取IOPS写入的饱和度百分比
max(irate(node_disk_writes_completed_total[1m])) by (instance,job) / 120 *100
# 告警(当IOPS饱和度大于60%则触发告警)
round(max(irate(node_disk_writes_completed_total[1m])) by (instance,job) /120 * 100) > 60
4、模拟IO读取,也相当于有大量IOPS
yum install pv -y
pv -L 50M /tmp/bigdata > /dev/null
5、获取当前磁盘最近1分钟的,读取IOPS最大次数的值,然后按实例进行分组计算
max(irate(node_disk_reads_completed_total[1m])) by (instance,job)
6、使用当前IO读取吞吐量 除以 磁盘最大读取I/O吞吐量,而后乘以100,获取IOPS读取的饱和度百分比
max(irate(node_disk_reads_completed_total[1m])) by (instance,job) / 120 * 100
# 告警(当IOPS读取大于60%则触发告警)
round(max(irate(node_disk_reads_completed_total[1m])) by (instance,job) / 120 * 100) > 60
4.5 配置磁盘告警规则
1、编写磁盘告警规则文件
groups:
- name: 磁盘告警规则
rules:
- alert: 磁盘空间告急
expr: ( node_filesystem_size_bytes{device!="tmpfs"} - node_filesystem_avail_bytes{device!="tmpfs"} ) / node_filesystem_size_bytes{device!="tmpfs"} * 100 > 70
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint }}分区空间不足"
description: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint}} 分区空间使用率已超过 70%,当前使用率为 {{ $value }}%,请及时处理。"
- alert: 磁盘Inode空间告急
expr: (node_filesystem_files{device!="tmpfs"} - node_filesystem_files_free{device!="tmpfs"} ) / node_filesystem_files{device!="tmpfs"} * 100 > 70
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint }}分区Inode空间不足"
description: "实例 {{ $labels.instance }} 磁盘 {{ $labels.mountpoint}} 分区的Inode空间使用率已超过 70%,当前使用率为 {{ $value }}%,请及时处理。"
- alert: 磁盘IOPS写入较高
#expr: sum(rate(node_disk_writes_completed_total[1m])) by (instance,job) / 120 * 100 >60
#round函数可以对值进行四舍五入
expr: round(max(irate(node_disk_writes_completed_total[1m])) by (instance,job) / 120 * 100,0.01) > 60
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} IOPS每秒写入次数超过120次/s"
description: 目前磁盘IOPS写入饱和度是 {{ $value }}%,目前磁盘IOPS每秒写入最大 {{ printf `max(rate(node_disk_writes_completed_total{instance="%s",job="%s"}[1m]))` $labels.instance $labels.job | query | first | value | printf "%.2f" }} 次/s
- alert: 磁盘IOPS读取较高
expr: round(max(irate(node_disk_reads_completed_total[1m])) by (instance,job) / 120 * 100) > 60
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} IOPS每秒读取次数超过120次/s"
description: 目前磁盘IOPS读取饱和度是 {{ $value }}%,目前磁盘IOPS每秒读取最大{{ printf `max(rate(node_disk_reads_completed_total{instance="%s",job="%s"}[1m]))` $labels.instance $labels.job | query | first | value | printf "%.2f" }} 次/s
- alert: 磁盘IO写入吞吐较高
expr: round(max(rate(node_disk_written_bytes_total[1m])) by (instance,job) / 1024 /1024 / 30 * 100) > 60
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 磁盘IO写入每秒超过最大30MB/s"
description: 目前磁盘IO写⼊吞吐量的饱和度是 {{ $value }}%。目前磁盘IO写入吞吐量每秒最大是 {{ printf `max(rate(node_disk_written_bytes_total{instance="%s",job="%s"}[1m])) /1024/1024` $labels.instance $labels.job | query | first | value | printf "%.2f" }}MB/s
- alert: 磁盘IO读取吞吐较高
expr: round(max(rate(node_disk_read_bytes_total[1m])) by (instance,job) / 1024 /1024 /30 * 100 ) > 60
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 磁盘IO读取每秒超过最大30MB/s"
description: 目前磁盘IO读取吞吐量的饱和度是 {{ $value }}%。目前磁盘IO读取吞吐量每秒最大是 {{ printf `max(rate(node_disk_read_bytes_total{instance="%s",job="%s"}[1m])) /1024/1024` $labels.instance $labels.job | query | first | value | printf "%.2f" }}MB/s
5、网络监控案例实践
5.1 网络重点监控的维度
对于网络,通常使用USE方法监控如下几个维度:
1、网络传输速率:即当前网络每秒传输的带宽。
2、网络饱和度:对于网络饱和度,通常查看网络是否丢包严重,如果持续有丢包情况则认为目前网络比较饱和;
3、网络错误率:可以通过监控网络发送和接收的错误来获得;
案例1:计算网络每秒传输带宽;
案例2:计算网络饱和度,例如:当带宽速率达到100%,并且发送和接收的丢包率持续上升则告警 node_network_transmit_drop_total、node_network_receive_drop_total
案例3:计算网络TCP连接数使用率;
5.2 计算网络传输速率
网络传输速率 = irate(网络接口 “发送/接收” 的总数据量) * 8 /1024 /1024 =Mbps
1、模拟带宽
# 1、在两个测试的节点上安装:yum install iperf -y
# 2、服务端运行并指定端口:iperf -s -p 9999
3、客户端模拟带宽发送命令,-b指定发送大小,-t指定发送持续时间:iperf -c -p 9999 -b 300M -t 60
2、获取最大的下载带宽,也就是每秒能接收多少Mbps
max(irate(node_network_receive_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device)
3、获取最大的上传带宽,也就是每秒能上传多少Mbps
max(irate(node_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device)
4、假设公司带宽是500Mbps,我希望达到400Mbps时则触发告警,计算公式: 网络每秒传输带宽 / 网络最大带宽 * 100 >= 80
下载
max(irate(node_network_receive_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 500 * 100 >= 80
上传
max(irate(node_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 500 * 100 >= 80
5.3 计算网络连接数使用率
网络连接率 = 当前活跃TCP连接数 / 系统内核最大支持的TCP连接数 * 100
(node_nf_conntrack_entries / node_nf_conntrack_entries_limit) * 100
# 告警
(node_nf_conntrack_entries / node_nf_conntrack_entries_limit) * 100 > 80
5.4 配置网络告警规则
1、配置网络告警规则
- name: 网络告警规则
rules:
- alert: 网络下载带宽占用过高,超过80%
expr: max(irate(node_network_receive_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 50 * 100 >= 80
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 的 {{ $labels.device }} 接口下载流量即将超过公司实际50Mbps"
description: 目前下载带宽已经达到 {{ printf `(irate(node_network_receive_bytes_total{instance="%s",job="%s",device="%s"}[1m]) * 8 / 1024 / 1024)` $labels.instance $labels.job $labels.device | query | first | value | printf "%.2f"}} Mbps/s 目前下载带宽使用率在 {{ $value }}%
- alert: 网络上传带宽占用过高,超过80%
expr: max(irate(node_network_transmit_bytes_total[1m]) * 8 / 1024 / 1024) by (instance,job,device) / 50 * 100 >= 80
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 的 {{ $labels.device }} 接口上传流量即将超过公司实际50Mbps"
description: 目前上传带宽已经达到 {{ printf `(irate(node_network_transmit_bytes_total{instance="%s",job="%s",device="%s"}[1m]) * 8 / 1024 / 1024)` $labels.instance $labels.job $labels.device | query | first | value | printf "%.2f"}} Mbps/s 目前上传带宽使用率在 {{ $value }}%
- alert: 网络TCP连接数过高,超过80%
expr: node_nf_conntrack_entries / node_nf_conntrack_entries_limit * 100 > 80
for: 1m
labels:
severity: critical
annotations:
summary: "实例 {{ $labels.instance }} 的 tcp连接数超过80%"
description: 目前TCP连接数是 {{ printf `node_nf_conntrack_entries{instance="%s",job="%s"}` $labels.instance $labels.job | query | first | value" }} 目前TCP连接使用率是 {{ $value }}%
最后一个TCP的没法用,我们先去掉
原文地址:https://blog.csdn.net/littlefun591/article/details/145286910
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!