prometheus实战之三:告警规则

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):github.com/zq2599/blog...

本篇概览

  • 本文是《prometheus实战》系列的第三篇,一起来学习prometheus的告警功能,如下图所示,整个告警功能分为规则和通知两部分,本篇是有关规则的详细介绍,至于命中规则后如何向外部发出通知是下一篇的内容
  • 本篇任务:如果指定机器的CPU使用率超过50%就告警

配置告警规则的基本流程

  • 新增告警规则的操作有以下四步
graph TD A(1. 新建规则配置文件) --> B(2. 编写规则) --> C(3. 配置prometheus,使用新规则配置文件) --> D(4. 重启prometheus,使规则生效)

配置告警规则

  • 每个告警规则有五部分组成
  1. 名称(alert)
  2. 触发条件(expr),这是个PromQL表达式,例如CPU使用率超过50%,在触发条件被满足之前,告警的状态都是Inactive
  3. 持续时间(for),例如CPU使用率超过50%的时间持续30秒,在30秒之内,此告警状态为pending,超过30秒就进入firing状态
  4. 标签(labels),给告警打上标签,在使用时可以根据标签定位到指定告警
  5. 注解(annotations),对告警的描述,这些内容可以用来详明告警时刻的详细情况
  • 接下来配置一个规则并验证其效果
  • 首先用prometheus账号SSH登录prometheus服务器
  • 新建告警规则文件,我这里完整路径是/home/prometheus/prometheus/rules/cpu.rules,内容如下,每个参数都有详细说明
yml 复制代码
# 告警规则分组,每一个组下有多个告警规则
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账号操作)
shell 复制代码
systemctl restart prometheus
  • 打开prometheus的web UI,如下图,可以看到告警规则已加载成功
  • 告警的三种状态:Incative、Pending、Firing,具体的关系,我这边画了个草图
  • 配置完成,可以验证告警效果了

触发告警

  • 由于这里配置的是CPU告警,接下来就想办法让应用服务器的CPU升高,这里继续用ffmpeg对视频文件转码,参考命令如下
shell 复制代码
~/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就承担着这份重任

欢迎关注掘金:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

相关推荐
9***P3344 分钟前
Rust在网络中的Rocket
开发语言·后端·rust
Wzx19801237 分钟前
go聊天室
开发语言·后端·golang
chenyuhao20241 小时前
MySQL索引特性
开发语言·数据库·c++·后端·mysql
oouy1 小时前
《Java泛型:给你的代码装上“快递分拣系统”,再也不会拆出一双鞋!》
后端
Python私教1 小时前
别再瞎折腾 LangChain 了:从 0 到 1 搭建 RAG 知识库的架构决策实录
后端
微学AI1 小时前
openGauss在AI时代的向量数据库应用实践与技术演进深度解析
后端
前端伪大叔1 小时前
第29篇:99% 的量化新手死在挂单上:Freqtrade 隐藏技能揭秘
后端·python·github
白衣鸽子1 小时前
【基础数据篇】数据格式化妆师:Formatter模式
后端·设计模式
随风飘的云1 小时前
redis的qps从100飙升到10000的全流程解决方案
后端
用户345848285051 小时前
java除了AtomicInteger,还有哪些常用的原子类?
后端