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]

prometheus常用监控以及告警规则编写_缓存

2 使用avg求出这段时间算数平均值,添加by子句,可以通过示例标签聚合,这将产生三个新的指标,使用来自所有cpu和所有模式的值来平均主机CPU的使用情况。之后再使用mode="idle",只查询空闲数据,再乘以100,得出每5分钟平均空闲的百分比数值。

avg(irate(node_cpu_seconds_total{job="localhost",mode="idle"}[5m])) by (instance) * 100

prometheus常用监控以及告警规则编写_正则表达式_02

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 )

prometheus常用监控以及告警规则编写_缓存_03

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

prometheus常用监控以及告警规则编写_正则表达式_04

磁盘利用率

#和内存类似,我们使用 (空闲的空间)/总空间 * 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后,验证规则是否生效

prometheus常用监控以及告警规则编写_引用变量_05