欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本文是《prometheus实战》系列的第三篇,一起来学习prometheus的告警功能,如下图所示,整个告警功能分为规则和通知两部分,本篇是有关规则的详细介绍,至于命中规则后如何向外部发出通知是下一篇的内容
- 本篇任务:如果指定机器的CPU使用率超过50%就告警
配置告警规则的基本流程
- 新增告警规则的操作有以下四步
配置告警规则
- 每个告警规则有五部分组成
- 名称(alert)
- 触发条件(expr),这是个PromQL表达式,例如CPU使用率超过50%,在触发条件被满足之前,告警的状态都是Inactive
- 持续时间(for),例如CPU使用率超过50%的时间持续30秒,在30秒之内,此告警状态为pending,超过30秒就进入firing状态
- 标签(labels),给告警打上标签,在使用时可以根据标签定位到指定告警
- 注解(annotations),对告警的描述,这些内容可以用来详明告警时刻的详细情况
- 接下来配置一个规则并验证其效果
- 首先用prometheus账号SSH登录prometheus服务器
- 新建告警规则文件,我这里完整路径是/home/prometheus/prometheus/rules/cpu.rules,内容如下,每个参数都有详细说明
# 告警规则分组,每一个组下有多个告警规则
groups:
# 组名
- name: cpuAlertGroup
# 告警规则数组
rules:
# 下面是一个具体的告警规则,名为hostCPUUsageTooHigh
- alert: hostCPUUsageTooHigh
# 基于PromQL的具体规则,这里是CPU使用率高于50%
expr: (1 - sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance) ) * 100 > 50
# 持续时间,实际情况满足expr后,规则从inactive
for: 30s
# 给规则自身设置标签
labels:
biz_type: cpu_usage
annotations:
# 告警内容摘要,可以用表达式获取变量的值
summary: "Instance {{ $labels.instance }} CPU usgae high"
# 告警内容详情,可以用表达式获取变量的值
description: "{{ $labels.instance }} CPU usage above 50% (current : {{ $value }})"
- 然后打开prometheus的配置文件prometheus.yml,通过配置rule_files参数的值,告诉prometheus在何处加载告警规则配置文件,具体配置如下图
- 重启prometheus服务(prometheus账号操作)
systemctl restart prometheus
- 打开prometheus的web UI,如下图,可以看到告警规则已加载成功
- 告警的三种状态:Incative、Pending、Firing,具体的关系,我这边画了个草图
- 配置完成,可以验证告警效果了
触发告警
- 由于这里配置的是CPU告警,接下来就想办法让应用服务器的CPU升高,这里继续用ffmpeg对视频文件转码,参考命令如下
~/bin/ffmpeg -i ~/videos/4kh264.mp4 -c:v libx265 -vtag hvc1 -c:a copy ./output.mp4
-
CPU使用率开始上涨,下图是还未达到阈值时的数据
-
此刻告警依然是inactive,未被触发
-
等到CPU利用率超过阈值的时候,应用服务器的实际情况如下图
-
再看prometheus的web UI,表达式显示也是超过了阈值,由于未满30秒,并未触发真正的告警(Firing),而是进入临时的Pending状态,此时annonation的内容中,配置的哪些变量已经被真实的值替换,显然,这样的内容可以帮我们定位到具体的故障信息
-
CPU使用率持续30秒都大于50%的时候,此告警进入Firing状态,如果配置了告警通知,此刻已触出发了告警通知(这部分下一篇会实现)
-
至此,常规告警规则的编写和使用的操作已全部完成,接下来将曾经遇到的问题列出,帮大家跳过小坑
问题记录
- 告警规则的label名不能用减号,但是可以用下划线
- 下图这样写会导致prometheus启动失败
- 可以这样写
- 咱们熟悉了告警规则,接下来就要进军告警通知了,毕竟prometheus产生的告警需要第一时间让相关人员感知到,下一篇的alertmanager就承担着这份重任
你不孤单,欣宸原创一路相伴
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列