Skip to content

1. 告警模板

yaml
* 告警模板是指在告警中的标签和注解上引用时间序列的标签和样本值的方法;
* 它使用标准的Go模板语法,并暴露一些包含时间序列标签和值的变量;
  * 标签引用: {{ $labels.<label_name> }}
  * 指标样本值引用: {{ $value }}
* 若要在description注解中引用触发告警的时间序列上的instance和job标签的值,可分别使用{{ $labels.instance }}和{{ $labels.job }};
* 告警模板是指在告警中的标签和注解上引用时间序列的标签和样本值的方法;
* 它使用标准的Go模板语法,并暴露一些包含时间序列标签和值的变量;
  * 标签引用: {{ $labels.<label_name> }}
  * 指标样本值引用: {{ $value }}
* 若要在description注解中引用触发告警的时间序列上的instance和job标签的值,可分别使用{{ $labels.instance }}和{{ $labels.job }};

2. 告警规则状态

告警规则分为三种

  • inactive:无任何报警,一切正常
  • pending:已触发阈值,但未满足告警持续时间,也就是在告警规则中写的for,在for规定的时间内触发都不会发送给AlertManager,当for持续时间一过会立即发送给AlertManager
  • firing:已触发阈值且满足告警持续时间,告警发送给接收者

3.持久化规则

官当

3.1 添加

  • 1.修改配置文件
bash
[root@prometheus-server ~]# vim /etc/prometheus/prometheus.yml 
rule_files:
   - "rules/node_rules.yml"			#指定持久化文件所在路径即可
[root@prometheus-server ~]# vim /etc/prometheus/prometheus.yml 
rule_files:
   - "rules/node_rules.yml"			#指定持久化文件所在路径即可
  • 2.刷新配置文件
bash
$curl -XPOST 127.0.0.1:9090/-/reload
$curl -XPOST 127.0.0.1:9090/-/reload

3.2 语法

yaml
groups:
- name: node_rules                                    //持久化查询的名称
  interval: 10s                                       //10s刷新一次,如果不设置就是就是全局中的 evaluation_interval 时间
  rules:                                              //记录规则清单,一个rules下面可以写多个记录规则
  - record: instance:node_cpu:avg_rate5m              //持久化记录查询名称
    expr:                                             //取值表达式
    labels:                                           //定义一个标签
    annotations:
      summary: "标题"
      description: "告警内容"
groups:
- name: node_rules                                    //持久化查询的名称
  interval: 10s                                       //10s刷新一次,如果不设置就是就是全局中的 evaluation_interval 时间
  rules:                                              //记录规则清单,一个rules下面可以写多个记录规则
  - record: instance:node_cpu:avg_rate5m              //持久化记录查询名称
    expr:                                             //取值表达式
    labels:                                           //定义一个标签
    annotations:
      summary: "标题"
      description: "告警内容"
  • expr语法
yaml
<metric_name>{<label_name>="<label_value>", ...} <operator> <value>

#解释
<metric_name> 是正在查询的指标的名称

{<label_name>=“<label_value>”, ...} 是查询的可选部分,用于指定应用于筛选指标的标签

<operator> 是一个数学运算符,例如 >、<、== 等

<value> 是使用指定运算符必须将指标与该值进行比较的值
<metric_name>{<label_name>="<label_value>", ...} <operator> <value>

#解释
<metric_name> 是正在查询的指标的名称

{<label_name>=“<label_value>”, ...} 是查询的可选部分,用于指定应用于筛选指标的标签

<operator> 是一个数学运算符,例如 >、<、== 等

<value> 是使用指定运算符必须将指标与该值进行比较的值

文档:

PromQL (Prometheus Query Language)

functions

Logical operators

1.检查语法

bash
promtool check config /etc/prometheus/prometheus.yml
promtool check config /etc/prometheus/prometheus.yml

2.热加载

bash
curl -XPOST 127.0.0.1:9090/-/reload
curl -XPOST 127.0.0.1:9090/-/reload

3.3 案例

1.cpu

1.创建持久化文件

bash
cd /etc/prometheus/

mkdir rules

vim rules/node_rules.yml 
groups:
- name: node_rules
  interval: 10s
  rules:
  - record: instance:node_cpu:avg_rate5m
    expr: 100 - avg (irate(node_cpu_seconds_total{job="centos7-node",mode="idle"}[5m])) by (instance) * 100
    labels:
      metric_type: aggregation
cd /etc/prometheus/

mkdir rules

vim rules/node_rules.yml 
groups:
- name: node_rules
  interval: 10s
  rules:
  - record: instance:node_cpu:avg_rate5m
    expr: 100 - avg (irate(node_cpu_seconds_total{job="centos7-node",mode="idle"}[5m])) by (instance) * 100
    labels:
      metric_type: aggregation
  • 解释
yaml
groups:
- name: node_rules                                    //持久化查询的名称
  interval: 10s                                       //10s刷新一次,如果不设置就是就是全局中的 evaluation_interval 时间
  rules:                                              //记录规则清单,一个rules下面可以写多个记录规则
  - record: instance:node_cpu:avg_rate5m              //持久化记录查询名称
    expr:                                             //取值表达式
    labels:                                           //定义一个标签
groups:
- name: node_rules                                    //持久化查询的名称
  interval: 10s                                       //10s刷新一次,如果不设置就是就是全局中的 evaluation_interval 时间
  rules:                                              //记录规则清单,一个rules下面可以写多个记录规则
  - record: instance:node_cpu:avg_rate5m              //持久化记录查询名称
    expr:                                             //取值表达式
    labels:                                           //定义一个标签

record 规则中的定义,Prometheus 会在后台完成 expr 中定义的 PromQL 表达式周期性运算(每隔10s一次),以 instance 为维度使用 avg 聚合运算符,计算函数 iratenode_cpu_seconds_total 指标区间 5m 内的CPU使用率,并且将计算结果保存到新的时间序列 instance:node_cpu:avg_rate5m 中, 同时还可以通过 labels 为样本数据添加额外的自定义标签,但是要注意的是这个 Lables 一定存在当前表达式 Metrics

2.mem

1.增加内存持久化配置

yaml
vim rules/node_rules.yml 
groups:
- name: node_rules
  interval: 10s
  rules:
  - record: instance:node_cpu:avg_rate5m
    expr: 100 - avg(irate(node_cpu_seconds_total{job="centos7-node"}[5m])) by (instance) * 100
    labels:
      metric_type: aggregation
  - record: instance:node_mem:avg_rate5m
    expr: (node_memory_MemTotal_bytes-(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes))/node_memory_MemTotal_bytes * 100
    labels:
      metric_type: aggregation
vim rules/node_rules.yml 
groups:
- name: node_rules
  interval: 10s
  rules:
  - record: instance:node_cpu:avg_rate5m
    expr: 100 - avg(irate(node_cpu_seconds_total{job="centos7-node"}[5m])) by (instance) * 100
    labels:
      metric_type: aggregation
  - record: instance:node_mem:avg_rate5m
    expr: (node_memory_MemTotal_bytes-(node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes))/node_memory_MemTotal_bytes * 100
    labels:
      metric_type: aggregation

2.加载配置

bash
curl -XPOST 127.0.0.1:9090/-/reload
curl -XPOST 127.0.0.1:9090/-/reload

3.down

yaml
groups:                                              //定义一个告警规则组
- name: general.rules                                //组名,可以将同一类型的报警放到一个分组中
  rules:                                             //定义告警规则,可以有多个
  - alert: 主机宕机                                   //告警名称,也就是告警信息的标题,一个alert代表一个告警规则
    expr: up == 0                                    //表达式,根据表达式的值进行匹配
    for: 5m                                          //报警收到后多长时间后发送报警信息
    labels:                                          //定义标签
      serverity: error                               //告警级别,有warning、error,critical等
    annotations:                                     //定义告警内容
      summary: "主机 {{ $labels.instance }} 停止工作"       //消息内容,$labels.instance就是监控项中的标签变量
      description: "{{ $labels.instance }} job {{ $labels.job }} 已经宕机5分钟以上!"     //详细描述
groups:                                              //定义一个告警规则组
- name: general.rules                                //组名,可以将同一类型的报警放到一个分组中
  rules:                                             //定义告警规则,可以有多个
  - alert: 主机宕机                                   //告警名称,也就是告警信息的标题,一个alert代表一个告警规则
    expr: up == 0                                    //表达式,根据表达式的值进行匹配
    for: 5m                                          //报警收到后多长时间后发送报警信息
    labels:                                          //定义标签
      serverity: error                               //告警级别,有warning、error,critical等
    annotations:                                     //定义告警内容
      summary: "主机 {{ $labels.instance }} 停止工作"       //消息内容,$labels.instance就是监控项中的标签变量
      description: "{{ $labels.instance }} job {{ $labels.job }} 已经宕机5分钟以上!"     //详细描述

4.规则文件默认结构

4.1 结构

yaml
groups:
  - name: <group_name>
    rules:
      - alert: <alert_name>
        expr: <PromQL_expression>
        for: <duration>
        labels:
          <label_name>: <label_value>
        annotations:
          <annotation_name>: <annotation_value>
groups:
  - name: <group_name>
    rules:
      - alert: <alert_name>
        expr: <PromQL_expression>
        for: <duration>
        labels:
          <label_name>: <label_value>
        annotations:
          <annotation_name>: <annotation_value>
参数说明
groups它包含一个或多个规则组。规则组允许您按逻辑组织警报规则
name指定规则组的名称
rules它包含在组中定义的一个或多个警报规则
alert定义警报的名称。每个警报规则在规则文件中必须具有唯一的名称
expr它表示评估触发警报的条件的 PromQL 表达式。PromQL(Prometheus Query Language,Prometheus 查询语言)用于查询和分析 Prometheus 采集的时间序列数据
for它指定在触发警报之前,PromQL 表达式定义的条件必须为 true 的持续时间
labels它包括附加到警报的其他元数据,例如严重性、服务或实例
annotations它包含有关警报的描述性信息,例如摘要或描述。注释有助于为警报系统提供更多上下文,并有助于更好地理解和处理警报

可以参考:

告警规则

https://p.wpseco.cn/wiki/doc/62a29e9b68a4a821270e798f