prometheus常用监控以及告警规则编写
原创
©著作权归作者所有:来自51CTO博客作者羊草的原创作品,请联系作者获取转载授权,否则将追究法律责任
Node_exporter介绍
prometheus提供多种类型的Exporter用于采集各种不同的服务的运行状态。Node Exporter,主要用于采集底层服务器的各种运行参数。
目前node exporter支持几乎所有常见的监控点,比如conntrack,cpu,diskstats,file system,loadavg,meminfo,netstat等。
常用的参数统计表
名称 | 操作系统 |
arp | 从/proc/net/arp中收集ARP统计信息 |
conntrack | 从/proc/sys/net/netfilter/中收集conntrack统计信息 |
cpu | 收集cpu统计信息 |
diskstats | 从/proc/diskstats中收集磁盘I/O统计信息 |
filefd | 从/proc/sys/fs/file-nr中收集文件描述符统计信息 |
filesystem | 文件系统统计信息,例如磁盘已使用空间 |
infinband | 从infinBand配置中收集网络统计信息 |
loadavg | 收集系统负载信息 |
mdadm | 从/proc/mdstat中获取设备统计信息 |
netdev | 网口流量统计信息,单位bytes |
netstat | 从/porc/net/netstat收集网络统计数据,等同于netstat -s |
sockstat | 从/proc/net/sockstat中收集socket统计信息 |
stat | 从/proc/stat中收集各种统计信息,包含系统启动时间,forks,中断等。 |
time | 系统当前时间 |
uname | 通过uname系统调用,获取系统信息 |
vmstat | 从/proc/vmstat中收集统计信息 |
通过收集信息来进行数据获取
监控主机是否正常
- alert: node-up #监控项名称
expr: up{JOB="node-exporter"}==0 #正则表达式可以在prometheus查询,自定定义监控状态
for: 15s #for选项定义表达式持续时长,0的话代表以满足就触发
labels:
severtiy: critical # 定义标签,alertmanager基于标签进行路由
annatations: #邮件注释内容,可以引用变量
summary: "{{$labels.instance}} 已停止超过15s!"
CPU收集监控
1 收集cpu利用率:使用irate的函数,用于计算向量中的时间序列每秒瞬时增长率。
irate(node_cpu_seconds_total{job="localhost"}[5m]
2 使用avg求出这段时间算数平均值,添加by子句,可以通过示例标签聚合,这将产生三个新的指标,使用来自所有cpu和所有模式的值来平均主机CPU的使用情况。之后再使用mode="idle",只查询空闲数据,再乘以100,得出每5分钟平均空闲的百分比数值。
avg(irate(node_cpu_seconds_total{job="localhost",mode="idle"}[5m])) by (instance) * 100
3 得到了每台主机平均5分钟的空闲CPU百分比,在使用100减去它,则为已经使用的百分比。
100 - avg(irate(node_cpu_seconds_total{job="localhost",mode="idle"}[5m])) by (instance) * 100
4 使用round函数求出四舍五入的正整数
round(100 - avg(irate(node_cpu_seconds_total{job="localhost",mode="idle"}[5m])) by (instance) * 100 )
5 发现大于80的时候就告警
round(100 - avg(irate(node_cpu_seconds_total{job="localhost-node",mode="idle"}[5m])) by (instance) * 100 ) > 80
收集内存是使用率
需要收集node_memory度量的一些子集,以计算利用率量:
#收集内存使用率指标
node_memory_MemTotal_bytes - 主机上的总内存
node_memory_MemFree_bytes - 主机上的空闲内存
node_memory_Buffers_bytes_bytes - 缓冲区缓存中的内存
node_memory_Cached_bytes_bytes - 页面缓存中的内存
#计算内存百分比:(总内存-(空余内存+缓存+缓冲))/总内存*100
round((node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes)) / node_memory_MemTotal_bytes * 100)
告警表达式:当内存使用率超过80的时候就告警
round((node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes)) / node_memory_MemTotal_bytes * 100) > 80
磁盘利用率
#和内存类似,我们使用 (空闲的空间)/总空间 * 100 得出空闲空间的百分比
ode_filesystem_free_bytes{mountpoint="/",device="rootfs"} / node_filesystem_size_bytes{mountpoint="/",device="rootfs"} * 100
#然后使用100 减去空闲的百分比,就得到磁盘使用的百分比,由于可能有多个磁盘空间,所以我们这里使用正则表达式,表示所有分区:
100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100)
#告警表达式
round(100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100)) > 80
磁盘io使用率
#先求出5m之内磁盘IO的增长率:</p>
irate(node_disk_io_time_seconds_total[5m])
#根据avg行数求出这个时间段的平均值,也就是这个时间段的IO:
avg(irate(node_disk_io_time_seconds_total[5m])) by (instance) * 100
#100减去这个磁盘的IO使用率,就得到磁盘IO得空闲百分比,跟60相比较就得到如下表达式
100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
网络流量表达式
round(irate(node_network_receive_bytes_total{instance!~"data.*",device!~'tap.*|veth.*|br.*|docker.*|vir.*|lo.*|vnet.*'}[1m])/1024) > 2048
并发会话连接表达式:
node_netstat_Tcp_CurrEstab >500
alertmanager表达式
#vim monitor.yaml
groups:
- name: node-up #告警分组,一个组下的告警会整合在一个邮件中
rules:
- alert: node-up #监控项名称
expr: up{job="localhost-node"} == 0 #正则表达式,up{job:"linux"} 可以在prometheus查询,自己定义监控状态
for: 15s #for选项定义表达式持续时长,0的话代表一满足就触发
labels:
severity: critical #定义了一个标签,因为上面我们是基于标签进行路由
annotations: #邮件注释内存,可引用变量
summary: "{{ $labels.instance }} 已停止运行超过 15s!"
- alert: "内存使用率过高"
expr: round((node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes)) / node_memory_MemTotal_bytes * 100) > 80
for: 1m
labels:
severity: warning
annotations:
summary: "内存使用率过高"
description: "当前使用率{{ $value }}%"
- alert: "CPU使用率过高"
expr: round(100 - avg(irate(node_cpu_seconds_total{job="node-exporter",mode="idle"}[5m])) by (instance) * 100 ) > 80
for: 2m
labels:
severity: warning
annotations:
summary: "CPU使用率过高"
description: "当前使用率{{ $value }}%"
- alert: "磁盘使用率过高"
expr: round(100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100)) > 80
for: 15s
labels:
severity: warning
annotations:
summary: "磁盘使用率过高"
description: "当前磁盘{{$labels.mountpoint}} 使用率{{ $value }}%"
- alert: "IO使用率过高"
expr: 100-(avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) < 60
for: 15s
labels:
severity: warning
annotations:
summary: "IO使用率过高"
description: "当前使用率{{ $value }}%"
- alert: "网络流出速率过高"
expr: round(irate(node_network_receive_bytes_total{instance!~"data.*",device!~'tap.*|veth.*|br.*|docker.*|vir.*|lo.*|vnet.*'}[1m])/1024) > 2048
for: 1m
labels:
severity: warning
annotations:
summary: "网络流出速率过高"
description: "当前速率{{ $value }}KB/s"
- alert: "会话链接数过高"
expr: node_netstat_Tcp_CurrEstab > 500
for: 1m
labels:
severity: warning
annotations:
summary: "当前会话连接数过高"
description: "当前连接数{{ $value }}"
重启prometheus后,验证规则是否生效