@@ -10,11 +10,8 @@ url: "https://docs.flashcat.cloud/zh/flashduty/monitors/loki-alert-rules"
1010## 核心概念
1111
1212Loki 的查询语言 LogQL 分为两类:
13-
14- 1 . ** 日志查询** :返回日志行内容(Stream)。
15- 2 . ** 指标查询** :对日志进行计数或聚合,返回数值(Vector)。
16-
17- ** Monitors 告警引擎主要使用"指标查询"** 。请务必使用 ` count_over_time ` 、` rate ` 、` sum ` 等函数将日志转换为数值序列,以便进行阈值判定。
13+ 1 . ** 日志查询 (Log Queries)** :返回日志行内容(Stream)。
14+ 2 . ** 指标查询 (Metric Queries)** :对日志进行计数或聚合,比如使用 ` count_over_time ` 函数返回数值(Vector)。
1815
1916---
2017
@@ -24,85 +21,84 @@ Loki 的查询语言 LogQL 分为两类:
2421
2522### 配置方式
2623
27- - ** 查询语句** :编写返回数值向量的 LogQL。
28- - 示例 :统计最近 5 分钟内,` mysql ` 任务中包含 ` error ` 关键字的日志条数。
29- ``` logql
30- count_over_time({job="mysql"} |= "error" [5m])
31- ```
32- - **阈值条件**:
33- - ** Critical**: `$A > 50`(5 分钟内错误日志超过 50 条)
34- - ** Warning**: `$A > 10`(5 分钟内错误日志超过 10 条)
24+ * ** 查询语句 (LogQL) ** :编写返回数值向量的 LogQL(查询模式选择“做统计”) 。
25+ * * 示例 * :统计最近 5 分钟内,` mysql ` 任务中包含 ` error ` 关键字的日志条数。
26+ ``` logql
27+ count_over_time({job="mysql"} |= "error" [5m])
28+ ```
29+ * **阈值条件**:
30+ * ** Critical**: `$A > 50` (5分钟内错误日志超过 50 条)
31+ * ** Warning**: `$A > 10` (5分钟内错误日志超过 10 条)
3532
3633### 工作原理
37-
3834引擎执行 LogQL 查询,获取带有标签的时间序列数据(Vector)。引擎遍历每个序列,提取数值与配置的阈值表达式进行比对。
3935
4036### 恢复逻辑
41-
42- - **自动恢复**:当查询结果数值回落到阈值以下时,自动恢复。
43- - **特定恢复条件**:可配置如 `$A < 5`,避免在阈值附近震荡。
44- - **恢复查询**:
45- - 支持配置独立的 LogQL 用于恢复判定。
46- - 支持 `${label_name}` 变量替换。
47- - 示例:告警查错误日志,恢复查特定恢复日志 `count_over_time({job="mysql"} |= "recovered" [5m])`。
37+ * **自动恢复**:当查询结果数值回落到阈值以下时,自动恢复。
38+ * **特定恢复条件**:可配置如 `$A < 5`,避免在阈值附近震荡。
39+ * **恢复查询 (Recovery Query)**:
40+ * 支持配置独立的 LogQL 用于恢复判定,只要查到数据即恢复。
41+ * 支持 `${label_name}` 变量替换。
42+ * *示例*:告警查错误日志,恢复查特定恢复日志 `count_over_time({job="mysql"} |= "recovered" [5m])`。
4843
4944---
5045
5146## 2. 数据存在模式 (Data Exists)
5247
53- 此模式适用于习惯在 LogQL 中直接写过滤条件,或者只关心" 是否有异常数据" 的场景。
48+ 此模式适用于习惯在 LogQL 中直接写过滤条件,或者只关心“ 是否有异常数据” 的场景。推荐使用此模式做日志异常检测告警 。
5449
5550### 配置方式
5651
57- - **查询语句**:编写包含比较操作符的 LogQL,仅返回满足条件的数据。
58- - 示例 :直接筛选出错误率超过 5% 的服务。
59- ```logql
60- rate ({job="ingress"} |= "500" [1m ]) / rate ({job="ingress"} [1m ]) * 100 > 5
61- ```
62- - **判定规则**:只要 LogQL 查询返回了数据,即触发告警。
52+ * **查询语句 (LogQL) **:编写包含比较操作符的 LogQL,仅返回满足条件的数据。
53+ * *示例* :直接筛选出错误率超过 5% 的服务。
54+ ```logql
55+ count_over_time ({job="ingress"} |= "error-code- 500" [5m ]) / count_over_time ({job="ingress"} [5m ]) * 100 > 5
56+ ```
57+ * **判定规则**:只要 LogQL 查询返回了数据,即触发告警。
6358
6459### 优缺点分析
65-
66- - **优点**:计算逻辑下推至 Loki 服务端,减少数据传输。
67- - **缺点**:无法区分告警级别,只能触发单一级别的告警。
60+ * **优点**:计算逻辑下推至 Loki 服务端,减少数据传输。
61+ * **缺点**:无法区分告警级别,只能触发单一级别的告警。
6862
6963### 恢复逻辑
70-
71- - **数据消失即恢复**:当 LogQL 查询结果为空(即不再满足 `> 5` 的条件)时,判定恢复。
72- - **恢复查询**:支持配置额外的查询语句用于辅助判断恢复状态。
64+ * **数据消失即恢复**:当 LogQL 查询结果为空(即不再满足 `> 5` 的条件)时,判定恢复。
65+ * **恢复查询**:支持配置额外的查询语句用于辅助判断恢复状态。
7366
7467---
7568
76- ## 3. 数据缺失模式
69+ ## 3. 数据缺失模式 (No Data)
7770
7871此模式用于监控日志上报链路是否中断,或者预期应该持续产生的日志是否停止了。
7972
8073### 配置方式
8174
82- - **查询语句**:编写预期应该一直有数据的查询。
83- - 示例 :统计所有主机的日志上报速率。
84- ```logql
85- rate({job="node-logs"} [1m])
86- ```
87- - **判定规则**:如果某个 Series(由标签唯一标识,如 `instance="host-1"`)在之前的周期中存在,但在当前及连续 N 个周期中查不到数据,则触发" 数据缺失" 告警。
75+ * **查询语句 (LogQL) **:编写预期应该一直有数据的查询。
76+ * *示例* :统计所有主机的日志上报速率。
77+ ```logql
78+ rate({job="node-logs"} [1m])
79+ ```
80+ * **判定规则**:如果某个 Series(由标签唯一标识,如 `instance="host-1"`)在之前的周期中存在,但在当前及连续 N 个周期中查不到数据,则触发“ 数据缺失” 告警。
8881
8982### 典型应用
90-
91- - 监控 Promtail/Fluentd 等采集 Agent 是否停止工作。
92- - 监控关键业务日志(如订单创建日志)是否异常中断。
83+ * 监控 Promtail/Fluentd 等采集 Agent 是否停止工作。
84+ * 监控关键业务日志(如订单创建日志)是否异常中断。
9385
9486---
9587
96- ## 4. 最佳实践与注意事项
97-
98- ### 避免查询原始日志
88+ ## 4. 获取告警时日志原文
9989
100- **请勿** 在告警规则中使用仅返回日志流的 LogQL(如 `{job="mysql"} |= "error"`) 。
90+ 告警时可以通过关联查询获取日志原文。但通常不建议获取太多,只获取 1 条作为日志样例放置到告警消息中 。
10191
102- - **原因**:告警引擎需要数值来进行计算和判定。原始日志流无法直接用于阈值比较。
103- - **正确做法**:必须包裹聚合函数,如 `count_over_time(...)`。
92+ 
10493
105- ### 性能优化
94+ 关联查询的结果可以渲染在 “备注描述” 中,示例:
10695
107- - **时间范围**:LogQL 中的时间范围(如 `[5m]`)应适中。过大的范围会导致查询慢,过小的范围可能导致数据波动大。
108- - **标签过滤**:尽量在 LogQL 的 Stream Selector 部分(大括号 `{...}` 内)使用精确的标签过滤,减少扫描的数据量。
96+ ```
97+ {{- if eq $status "firing" }}
98+ error log count: {{ $value | printf "%.3f" }}
99+ {{- range $x := $relates.R1}}
100+ Loki log time: {{(nanoTime $x.Fields.__ time__ 8).Format "2006-01-02T15:04:05Z07:00"}}
101+ Loki Log line: {{$x.Fields.__ log__ }}
102+ {{- end}}
103+ {{- end}}
104+ ```
0 commit comments