8.3 prometheus alertmanager

通过scrape_configs 相关的配置我们知道了kubernetes如何配置job刮取数据, 数据刮取完成后根据报警规则发送警告到alertmanager

+-------------------+  send alert   +--------------+     +--------+
| prometheus server | ------------> |              | --> | email  |
+-------------------+               |              |     +--------+
  |                                 |              |
  | get metrics                     | alertmanager |
  v                                 |              |
+-------------------+               |              |     +--------+
|  metrics server   |               |              | --> | wechat |
+-------------------+               +--------------+     +--------+

graph-easy code ``` [prometheus server] - get metrics -> [metrics server] [prometheus server] - send alert -> [alertmanager]{rows: 4} [alertmanager] -> [email] [alertmanager] -> [wechat] ```

根据上面的简单图解我们需要知道两个信息: 1. 报警通过什么介质发送? 2. 哪些需要发送告警? 3. 报警发送的频率怎么控制?

alertmanager的主要功能如下:

  • 管理警报的重复提醒时机与消除后消除通知的发送;

  • 根据标签定义警报路由,实现警报的优先级、接收人划分,并针对不同的优先级和接收人定制不同的发送策略;

  • 将同类型警报打包成一条通知发送出去,降低警报通知的频率;

  • 支持静默规则: 用户可以定义一条静默规则,在一段时间内停止发送部分特定的警报,比如已经确认是搜索集群问题,在修复搜索集群时,先静默掉搜索集群相关警报;

  • 支持”抑制”规则(Inhibition Rule): 用户可以定义一条”抑制”规则,规定在某种警报发生时,不发送另一种警报,比如在”A 机房网络故障”这条警报发生时,不发送所有”A 机房中的警报”;

1. 安装和配置AlertManger

因为使用helm安装了alertmanager, alertmanager的启动参数如下:

--config.file来指定相应的配置文件

--storage.path指定了数存储目录

1.1 alertmanager.yml

可以查看官方文档来了解alertmanager的更多配置内容

altermanager的内部工作机制为:

_$ graph-easy graph.txt_ ``` (prometheus server [alert rule] - send alert message -> [route]) (alertmanager [route] -> [receivers]) ```

1.1.1 完整配置文件

Alertmanager配置中一般会包含以下几个主要部分:

  • 全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;

  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;

  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;

  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;

  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生

配置例子

在全局配置中需要注意的是resolve_timeout,该参数定义了当Alertmanager持续多长时间未接收到告警后标记告警状态为resolved(已解决)。该参数的定义可能会影响到告警恢复通知的接收时间,读者可根据自己的实际场景进行定义,其默认值为5分钟。

1.2 route 配置

在Alertmanager的配置中会定义一个基于标签匹配规则的告警路由树,以确定在接收到告警后Alertmanager需要如何对其进行处理.

而在route部分主要定义了告警的路由匹配规则, Alertmanager需要将匹配到的告警发送给哪一个receiver, 配置格式如下:

官方文档例子

2. 配置Prometheus来和AlertManager通信

配置文件如下:

  • alert_relabel_configs相关的配置参考2.1 relabel_configs, 将警报从新标记以后发送到Alertmanager

  • alertmanagers Prometheus服务器将警报发送到的Alertmanager实例。 可以通过static_configs参数静态配置,也可以使用受支持的服务发现机制之一动态发现。

2.1 使用kubernetes_sd_configs发现机制

2.2 使用static_config

这里的localhost根据实际情况进行修改, 可以修改为kubernetes中service

3. alert_rule的相关的配置

站在巨人的肩膀上请访问https://awesome-prometheus-alerts.grep.to/rules#host-and-hardware 查看别人定义好的规则

3.2.1 prometheus报警规则配置

需要在prometheus的配置文件中添加如下内容

其中rule_files就是用来指定报警规则的, 其中rules.yml中主要内容如下

告警规则尊许如下风格

例子

expr promQL表达式,如果满足该条件发送报警

for子句

  • 没有该FOR子句(或设置为0)的警报将立即转换为firing。

  • 带有该FOR子句的警报将首先转换为pending,等待for的时间后再转换为firing。

labels子句允许指定一组附加标签来附加到警报. 任何现有的冲突标签都将被覆盖. 标签值可以模板化.

annotations子句指定一组信息标签,这些标签可用于存储更长的附加信息,例如警报描述或运行手册链接. 注释值可以模板化.

参考链接

https://aleiwu.com/post/alertmanager/

最后更新于

这有帮助吗?