以下是生产环境中prometheus.rules.yml告警规则用例,在此记录一下,相关信息已做脱敏处理。
prometheus默认的instance是ip:port格式的,无法知道主机名。而主机名(nodename)在指标node_uname_info中,且node_uname_info的值恰巧为1,所以我们可以在PromQL中通过node_uname_info提取,只需要在原有PromQL后添加
* on(instance) group_left(nodename) (node_uname_info)
这样,在prometheus告警的labels中,就可以通过nodename获取主机名了
特别的,up==0的值是0,做乘法是不会得到结果的,目前还没想到这个指标得到主机名的办法
groups:
- name: 成都服务器告警
rules:
- alert: 服务器宕机告警
expr: up == 0
for: 3m
labels:
region: 成都
annotations:
summary: "{{$labels.instance}}宕机!"
description: "服务器{{$labels.instance}}已宕机!"
- alert: cpu使用率过高告警
expr: (100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100))* on(instance) group_left(nodename) (node_uname_info) > 85
for: 5m
labels:
region: 成都
annotations:
summary: "{{$labels.instance}}({{$labels.nodename}})CPU使用率过高!"
description: '服务器{{$labels.instance}}({{$labels.nodename}})CPU使用率超过85%(目前使用:{{printf "%.2f" $value}}%)'
- alert: 系统负载过高
expr: (node_load1/count without (cpu, mode) (node_cpu_seconds_total{mode="system"}))* on(instance) group_left(nodename) (node_uname_info)>1.1
for: 3m
labels:
region: 成都
annotations:
summary: "{{$labels.instance}}({{$labels.nodename}})系统负载过高!"
description: '{{$labels.instance}}({{$labels.nodename}})当前负载超标率 {{printf "%.2f" $value}}'
- alert: 内存不足告警
expr: (100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)* on(instance) group_left(nodename) (node_uname_info) > 80
for: 3m
labels:
region: 成都
annotations:
summary: "{{$labels.instance}}({{$labels.nodename}})内存使用率过高!"
description: '服务器{{$labels.instance}}({{$labels.nodename}})内存使用率超过80%(目前使用:{{printf "%.2f" $value}}%)'
- alert: 硬盘空间不足告警
expr: (100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) )* on(instance) group_left(nodename) (node_uname_info)> 80
for: 3m
labels:
region: 成都
annotations:
summary: "{{$labels.instance}}({{$labels.nodename}})硬盘使用率过高!"
description: '服务器{{$labels.instance}}({{$labels.nodename}})硬盘使用率超过80%(目前使用:{{printf "%.2f" $value}}%)'