Prometheus告警Rule开发

开发流程

理解告警中各组件及其相关配置的作用

组 件

作用

相关配置项

prometheus

存储及提供数据查询 对数据进行规则匹配告警

rule_files

Alertmanager

对告警进行分组、抑制、静默

全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容; 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等; 告警路由(route):根据标签匹配,确定当前告警应该如何处理; 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;

1、理解PromQL

可通过阅读官方文档和探索PromQL

2、编写告警Rule

groups:
- name: example
  rules:
  - alert: HighErrorRate
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
    for: 10m
    labels:
      severity: page
    annotations:
      summary: High request latency
      description: description info
  • alert:告警规则的名称。
  • expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
  • for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
  • labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
  • annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。

PS:labels和annotations一个重要的区别是labels会在后面group分组时被使用,而annotations仅作为提供额外信息使用

3、添加Receivers

单个Alertmanager可以有多个不同的Receivers,以下以PrometheusAlert+WechatBot为例

安装

安装部署PrometheusAlert

模板配置

自定义告警消息模版使用说明

例子

Alertmanager配置如下(需先在PrometheusAlert添加模板):

route:
  ...
  receiver: 'hook'
receivers:
- name: 'hook'
  webhook_configs:
  - url: 'http://HOST:PORT/prometheusalert?type=wx&tpl=wechattpl'
    send_resolved: false

假设模板如下,告警时会读取所有alerts进行归并告警,可通过修改模板来修改告警样式,通过在annotations中添加数据来添加额外的显示

{{ range $k,$v:=.alerts }}
{{$v.labels.hostname}}: {{$v.annotations.summary}}
错误详情: {{$v.annotations.description}}
{{ end }}

进阶

告警分组

通过在AlertManager中配置相应Group参数来达到使告警分组的目的。

简单来说,通过分组将相同类型的告警合并成一组来统一告警。

还可以通过配置group_wait和group_interval来控制告警的频率和间隔

详情参考 告警分组route

告警Route

路由匹配

抑制规则

Alertmanager的抑制机制可以避免当某种问题告警产生之后用户接收到大量由此问题导致的一系列的其它告警通知

参考 屏蔽告警通知

额外阅读