-
Notifications
You must be signed in to change notification settings - Fork 0
告警回溯 dev design
目前 mo-ob 的开源方案已经基本实现告警可用,但收到告警后的回溯流程尚未有实践方案,大体上针对告警回溯,会有以下基本功能:
-
终端收到的告警信息中(邮件、webhook、微信群)需要有链接跳转到相应的告警查询面板显示
- 进一步查看当前告警相关的指标信息
- 需要支持查询告警历史的搜索
-
告警的交互:告警屏蔽、标记完成(不支持)、等级升降级(不支持)
-
支持微信群告警,进阶需求:可以针对特定告警 @ 特定处理人
目前市面上较为易用的开源监控-告警方案其实并不多,
- 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 相适配,也比较方便
如图所示,由prometheus 计算规则生成告警后,将会保存告警数据到内置数据库中,并发送告警请求至 Alertmanager
而Alertmanager本身只作为一个告警过滤分组和发送的工具,不会存储告警历史(无法提供历史告警查询),只能查看当前的告警
参考官方文档,alertmanager 作为一个告警的发送器,仅能提供以下功能:
- 告警的分组过滤
- 发送告警
- 告警屏蔽(slience)
不支持上述的告警历史查询、手动标记完成、修改告警等级的功能
手动标记完成可以用 resolve timeout
目前 ob 开源方案使用的告警前后端均使用prometheus,mo-ruler 方案也是使用的 prometheus 的 agent 以及 promql engine 解析告警表达式
因为prometheus 每次产生告警时,都会将告警信息(时间、label 等)保存到 tsdb,可以通过接口支持告警历史的查询,但无法提供手动标记完成、告警等级升降的功能:参考
grafana 本身有 alerting 的控制面板,支持连接 Prometheus 作为数据源进行告警历史的查询,也支持连接Alertmanager 后可以实现在grafana的面板进行告警查看已经屏蔽的操作
TODO:grafana 针对 alert 的图表:趋势图,周报统计等;总览(聚合的告警信息),不同告警分类的图表
针对告警查询,目前开源 ob 方案可以直接使用 grafana + prometheus 进行告警历史的查询
后续如果使用 mo-ruler 还需要针对此功能做额外适配
用 alertmanager 提供的跳转链接,只需要在告警模板上提供域名版 grafana url 即可
alertmanager 原生的邮件跳转链接只能改 hostname
在 grafana 上连接 alertmanager 可以进行告警屏蔽(slience)以及观看dashboard面板
目前已经支持微信群告警,
可以需要在告警规则中添加告警owner,使得当告警产生时,可以在群里@特定的人,效果见下图:
只需在 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