Skip to content

告警回溯 dev design

EZ4BRUCE edited this page Sep 8, 2023 · 1 revision

Background

目前 mo-ob 的开源方案已经基本实现告警可用,但收到告警后的回溯流程尚未有实践方案,大体上针对告警回溯,会有以下基本功能:

  1. 终端收到的告警信息中(邮件、webhook、微信群)需要有链接跳转到相应的告警查询面板显示

    1. 进一步查看当前告警相关的指标信息
    2. 需要支持查询告警历史的搜索
  2. 告警的交互:告警屏蔽、标记完成(不支持)、等级升降级(不支持)

  3. 支持微信群告警,进阶需求:可以针对特定告警 @ 特定处理人

方案调研

目前市面上较为易用的开源监控-告警方案其实并不多,

  • VictoriaMetrics:相当于一个 prometheus 的性能优化+轻量版,兼容 prom 的告警规则与配置,其[vmalert](https://docs.victoriametrics.com/vmalert.html)支持多租户,(但发送告警依赖于 alertmanager),其保存 alert 的功能需要一来更多组件,并未比 prometheus 提供更多的告警历史查询相关接口(与功能),不太适配 mo-ob 的需要
  • 夜莺监控开源版:由滴滴开源的监控产品,具有告警管理的功能,但其本身是一个告警后端,依然是使用 prometheus 当做数据源,其告警的计算也是使用 promql(估计也是了),提供人性化的 UI 界面管理告警规则与执行,支持告警历史查询、告警等级升降、告警屏蔽等功能,但其本身的监控-告警与 prometheus 不兼容(意味着无法读取 prometheus 的告警规则)也无法通过代码自行配置,不太适合 MO OB 的使用场景,而对于日志告警(未来 moob 会引入)则是闭源专业版功能,开源版比较阉割

经过基本的调研发现,由于我们目前选取的核心组件是 Prometheus 生态,故针对告警回溯的方案选型必然要与Prometheus 相适配,还要考虑开源情况,功能支持等,最终发现目前有的 Prometheus+Alertmanager+Grafana 虽然没有告警等级升降、手动标记完成的功能,在告警历史查询、告警屏蔽、告警抑制上简单易用,而且通过Grafana连接Prometheus+Alertmanager可以做到指标图表、告警历史查询、告警屏蔽等操作均在 grafana 上完成,无需引入额外的组件,再者,未来如果需要引入日志的告警,grafana 天然与 loki 相适配,也比较方便

目前告警数据的数据链路

image

如图所示,由prometheus 计算规则生成告警后,将会保存告警数据到内置数据库中,并发送告警请求至 Alertmanager

image

而Alertmanager本身只作为一个告警过滤分组和发送的工具,不会存储告警历史(无法提供历史告警查询),只能查看当前的告警

alertmanager 的支持情况

参考官方文档,alertmanager 作为一个告警的发送器,仅能提供以下功能:

  1. 告警的分组过滤
  2. 发送告警
  3. 告警屏蔽(slience)

不支持上述的告警历史查询、手动标记完成、修改告警等级的功能

手动标记完成可以用 resolve timeout

prometheus 的支持情况

目前 ob 开源方案使用的告警前后端均使用prometheus,mo-ruler 方案也是使用的 prometheus 的 agent 以及 promql engine 解析告警表达式

因为prometheus 每次产生告警时,都会将告警信息(时间、label 等)保存到 tsdb,可以通过接口支持告警历史的查询,但无法提供手动标记完成、告警等级升降的功能:参考

grafana 的支持情况

grafana 本身有 alerting 的控制面板,支持连接 Prometheus 作为数据源进行告警历史的查询,也支持连接Alertmanager 后可以实现在grafana的面板进行告警查看已经屏蔽的操作

image

TODO:grafana 针对 alert 的图表:趋势图,周报统计等;总览(聚合的告警信息),不同告警分类的图表

告警查询

针对告警查询,目前开源 ob 方案可以直接使用 grafana + prometheus 进行告警历史的查询

后续如果使用 mo-ruler 还需要针对此功能做额外适配

image

用 alertmanager 提供的跳转链接,只需要在告警模板上提供域名版 grafana url 即可

alertmanager 原生的邮件跳转链接只能改 hostname

告警交互

在 grafana 上连接 alertmanager 可以进行告警屏蔽(slience)以及观看dashboard面板

image

企业微信群告警

目前已经支持微信群告警,

可以需要在告警规则中添加告警owner,使得当告警产生时,可以在群里@特定的人,效果见下图:

image

只需在 labels 中添加字段 alertOwner: [企业微信 ID]即可

  - alert: HighRequestLatencyAlert
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
    for: 10m
    labels:
      severity: page
      alertOwner: bruce
    annotations:
      summary: High request latency