Skip to content

Commit a4da2c9

Browse files
committed
code refactor
1 parent b4ff02c commit a4da2c9

3 files changed

Lines changed: 95 additions & 0 deletions

File tree

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
---
2+
title: "告警原理和流程"
3+
description: "夜莺监控(Nightingale)最重要的功能就是告警引擎。本文介绍了夜莺的告警原理和数据流,把整个告警流程中涉及到的相关功能都介绍一下。"
4+
date: 2025-06-23T11:00:09.623+08:00
5+
lastmod: 2025-06-23T11:00:09.623+08:00
6+
draft: false
7+
images: []
8+
menu:
9+
docs:
10+
parent: "usecase"
11+
weight: 9900
12+
toc: true
13+
---
14+
15+
夜莺监控(Nightingale)的功能侧重点是告警引擎,为了做得灵活,整个告警流程涉及到的功能点比较多,本文从原理和数据流的角度,介绍一下相关知识,理解这些知识,对于您使用夜莺、排查告警问题,都会有帮助。
16+
17+
## 数据流原理概述
18+
19+
<img src="/img/usecase/alerting/01.png" alt="夜莺告警数据流原理概述" title="夜莺告警数据流原理概述">
20+
21+
1. 用户在 Web UI 配置告警规则,规则保存在 DB 中(通常是 MySQL)。
22+
2. 告警引擎(`n9e` 进程内置一个告警引擎,边缘模式下 `n9e-edge` 进程里也内置告警引擎)从 DB 同步告警规则到内存中(通常 `n9e-edge` 无法直接读 DB,是调用的中心端 `n9e` 的接口获取的告警规则)。
23+
3. 告警引擎会为每条告警规则创建一个 goroutine(协程,姑且可以理解为轻量级线程),按照用户在告警规则里配置的频率,周期性查询存储,对数据做异常判定,最终生成告警事件。
24+
4. 产生告警事件后,要先持久化到 DB 中(通常是 MySQL),然后再走后面的通知规则。
25+
5. 通知规则包含两部分,一个是若干事件处理器(比如 relabel、event update、event drop、ai summary 等),另一个是若干告警通知配置(比如 Critical 的告警事件关联电话、短信通知媒介,Warning 的告警事件只关联邮件媒介)。
26+
27+
## 告警规则
28+
29+
告警规则核心就是配置一个查询条件,比如 Prometheus 数据源就是配置 PromQL,ClickHouse 数据源就是配置 SQL,然后再配置一个阈值(Prometheus 场景下,阈值包含在 PromQL 中,不需要单独配置),达到阈值并满足持续时长,就告警。
30+
31+
告警引擎针对每条规则创建一个 goroutine(协程),周期性地查询数据源,判断是否满足告警条件。以 Prometheus 数据源举例,其原理是:
32+
33+
- 夜莺周期性调用数据源的 `/api/v1/query` 接口,把当前时间和 PromQL 作为查询条件传给这个接口。
34+
- 数据源如果返回多条记录,大概率就要生成多条告警事件,接下来要看持续时长,如果持续时长为 0,立马生成告警事件,如果持续时长大于 0,就要把这条记录放到一个缓存中,等到持续时长满足条件后,再生成告警事件,在持续时长过程中,如果后面的执行周期查不到数据了,就会把这条记录从缓存中删除,也就不会生成告警事件了。
35+
36+
这里经常遇到的问题是,告警引擎在查询的时候没有查到数据,故而无法生成告警事件,但是后面排查的时候发现那个时间点却是有数据满足阈值的,百思不得其解,这种情况,可能的原因有两个:
37+
38+
- 因为监控数据的上报有延迟导致的,在这里夜莺只是一个 client,数据源是 server,数据源没有返回数据,就要去看 server 侧的问题,看 server 侧的数据为啥没有返回,通常是数据有各种因素延迟了。
39+
- 查询超时了,日志文件里通常可以看到相关日志,可以在数据源配置页面调大查询超时时间,或者排查数据源为啥返回慢了,另外硬件方面也可能有问题,比如 client、server 两边是否有网卡丢包。超时的日志,可以检索关键字:`alert-${datasource-id}-${alert-rule-id}`
40+
41+
其中:
42+
43+
- `${datasource-id}` 是数据源的 ID,在数据源详情页面可以看到
44+
- `${alert-rule-id}` 是告警规则的 ID,编辑告警规则时,在 URL 中可以看到
45+
46+
告警问题排查时,首先要看是否产生了告警事件,如果产生了告警事件,说明告警规则没问题,接下来再排查后面通知相关的问题,如果告警事件都没有产生,那就是告警规则和数据源的问题,首先要确认告警规则的配置再谈其他。
47+
48+
## 事件持久化
49+
50+
告警事件产生后需要写入 DB(通常是 MySQL),于是你才能在告警事件列表中看到这个事件。有时会写失败,写失败的话在日志里通常会有体现,排查 WARNING 和 ERROR 日志即可。
51+
52+
## 告警规则关联通知规则
53+
54+
告警事件产生之后,应该走后续的哪个通知规则?即告警规则和通知规则如何建立关联关系?有两个办法建立关联关系:
55+
56+
- 告警规则里直接配置通知规则。即这个告警规则产生的所有告警事件,都要走这些通知规则。
57+
- 告警规则里不配通知规则,而是配置订阅规则,即:在订阅规则里按照各种条件筛选告警事件,筛选到的告警事件,走订阅规则里配置的通知规则。
58+
59+
上面两种方式都可以,前者更直观,如果没有特殊需求,推荐使用前者。但是对于一些全局的事件处理,比如我想把夜莺监控中产生的所有告警事件都走一个 Callback 处理器,此时可以使用订阅规则,订阅所有的告警事件,统一关联一个全局通知规则,在这个全局通知规则里配置 Callback 处理器。
60+
61+
## 通知规则配置
62+
63+
下图是通知规则的编辑页面,我在图中标注了各个区块的作用:
64+
65+
<img src="/img/usecase/alerting/02.png" alt="夜莺通知规则配置" title="夜莺通知规则配置">
66+
67+
大部分表单项的标题位置,都有一个小问号图标,鼠标悬停在上面会有提示信息,大家可以参考提示信息来配置。
68+
69+
> 💡 这个页面里包含一些通知测试的按钮,点击之后,可以选择已生成的告警事件做通知规则的测试,便于您快速验证通知规则是否符合预期。另外要注意,告警事件持久化发生在通知规则之前,所以通知规则里的各个事件处理器,不会对 DB 中的告警事件产生修改。
70+
71+
### 事件处理器
72+
73+
事件处理器是一个高级机制,允许您对告警事件做各种处理,比如:
74+
75+
- 对告警事件做 relabel,拆分一些标签,修改一些标签等
76+
- 更新告警事件,夜莺把告警事件传给第三方(比如 CMDB )接口,第三方可以对告警事件做修改,然后把修改之后的内容返回,继续走后续事件处理逻辑,方便与外部系统做打通
77+
- 丢弃告警事件,一些告警事件不需要通知,可以在这里做复杂的判断,符合条件的丢弃掉
78+
- 生成 AI 摘要,把告警事件传给 DeepSeek 等,让 AI 帮忙生成摘要和解法,把 AI 生成的内容放到事件中,后续通过通知媒介发出来
79+
80+
这里有两个概念要注意:
81+
82+
- 事件处理的 Pipeline,就是点击`通知规则-事件处理`右侧那个按钮展开的侧拉板,里边就是 Pipeline 的列表
83+
- 每个 Pipeline 可以包含多个 Processor(处理器),如果想提高复用性,也可以简单来搞,每个 Pipeline 只包含一个 Processor。
84+
85+
每个处理器,页面上都有一个文档说明链接,点击之后可以查看详细的文档说明。也可以参考下面两个链接的资料:
86+
87+
- [使用 Webhook 接入自定义逻辑和自定义媒介](/zh/docs/usecase/webhook/)
88+
- [开源夜莺监控实现发版时告警静默](https://mp.weixin.qq.com/s/Of90imqi0T_fV1QGxAkR0Q)
89+
90+
### 通知配置
91+
92+
这部分在前面已经讲解过,这里不再赘述,请参考:
93+
94+
- [通知规则设计初衷和使用说明](/zh/docs/usage/notify-rules/)
95+

static/img/usecase/alerting/01.png

139 KB
Loading

static/img/usecase/alerting/02.png

369 KB
Loading

0 commit comments

Comments
 (0)