跳转至

查看「监控器」函数日志

2024-09-05

本文档主要介绍观测云监控器任务中产生的函数日志

1. 简介

与其他 DataFlux Func 中执行的函数一样,当配置了函数日志上报至观测云后,监控器任务的日志同样可以方便地在观测云平台查询。

有关如何配置函数日志上报到观测云,以及上报的各字段说明,请参考 手册 / 部署和维护 / 上报自观测数据

2. 查询日志

关键字段:

字段 类型 说明
source str 固定为 DFF_task_record_func
func_id str 函数 ID
格式为:guance__api.*
workspace_uuid str 所属观测云工作空间 UUID
格式为:wksp_xxxxx
df_monitor_checker_id str 监控器 ID
格式为:rul_xxxxx
exception_type str 错误类型
如:调用 KodoAPI 错误 "KodoAPIError"
exception str 具体错误
如:KodoAPIError('Status Code: 400, ... <略>')
event_count_total int 本次任务产生的所有事件数量

如果需要查看某个工作空间的所有监控器的执行日志,使用以下条件查询:

Text Only
1
source:DFF_task_record_func workspace_uuid:wksp_xxxxx df_monitor_checker_id:rul_*

如果需要查看某一个监控器的任务日志,使用 df_monitor_checker_id 过滤:

Text Only
1
source:DFF_task_record_func df_monitor_checker_id:rul_xxxxx

3. 分段解读

每一行日志遵循如下格式:

时间 与上一行日志
时间差(毫秒)
任务开始至本行日志
总时间(毫秒)
所在模块 内容
[03-25 11:04:05] [+1ms] [64ms] 【函数】 调用函数:guance__api_impl.custom_check
具体示例
1
[03-25 11:04:05] [+1ms] [64ms] 【函数】 调用函数:guance__api_impl.custom_check

查询 DQL

监控器中需要执行 DQL 时,调用 Kodo API 执行 DQL 查询。

示例
1
2
3
4
5
6
7
8
9
[07-31 01:40:36] [+0ms] [674ms] 【监控器】 查询用于「数据断档检测」的数据:触发时间 - 检测范围(300 秒) ~ 触发时间
[07-31 01:40:36] [+0ms] [674ms] 【数据查询】 执行 DQL 查询 -> 时间范围:2025-07-31 01:35:00 ~ 2025-07-31 01:40:00
[07-31 01:40:36] [+0ms] [674ms] 【数据查询】 调用 KODO / STUDIO API -> POST http://kodo-inner.forethought-kodo:9527/v1/query
[07-31 01:40:36] [+7ms] [681ms] 【数据查询】 >> Body:{"workspace_uuid":"wksp_xxxxx","queries":[{"qtype":"dql","query":"M::`fake_data_for_test`:(avg(`field_int`) AS `value`)","time_range":[1753896900000,1753897200000],"check_nsq_latency":true,"disable_sampling":true,"disable_slimit":true,"mask_visible":true,"search_timeout":"15s"}],"echo_explain":true}
[07-31 01:40:36] [+39ms] [720ms] 【数据查询】 >> 响应:【200 OK】 {"content":[{"series":[{"columns":["time","value"],"name":"fake_data_for_test","values":[[1753897190000,80.82777778]]}],"query_parse":{"fields":{"value":"field_int"},"funcs":{"value":["avg"]},"namespace":"metric","sources":{"fake_data_for_test":"exact"}},"cost":"31ms","<其他字段>":"<略>"}]}
[07-31 01:40:36] [+0ms] [720ms] 【数据查询】 --> 查询完毕
[07-31 01:40:36] [+2ms] [723ms] 【Studio】 用户指标单位(从缓存获取):wksp_xxxxx => {"_DFF_CACHE_EXPIRE_TIME":1753897410,"metric":{"<指标集>":{"<指标>":"<单位>"}},"logging":{"<字段>":"<单位>"},"object":{"<字段>":"<单位>"},"other":{"<字段>":"<单位>"}}
[07-31 01:40:36] [+0ms] [723ms] 【Studio】 已匹配用户指标单位:metric/fake_data_for_test/field_int OR other/field_int => digital,B
[07-31 01:40:36] [+0ms] [723ms] 【数据查询】 --> DQL 结果数据拆包:{"series":[{"name":"fake_data_for_test","columns":["time","value"],"values":[["2025-07-30T17:39:50Z",80.82777778]]}],"metric_units":{"value":"digital,B"},"query_time_range":[1753896900000,1753897200000]}

获取告警策略

为了保证用户在更新告警策略后,监控器能够尽早获知,监控器层面不会保存告警策略和配置,而是在需要发送告警时,调用 Studio API 获取对应监控器的告警策略信息。

示例
1
2
3
4
[07-31 01:40:36] [+0ms] [732ms] 【Studio】 调用 Studio Inner API -> GET http://inner.forethought-core:5000/api/v1/inner/alert_opt/get
[07-31 01:40:36] [+0ms] [732ms] 【Studio】 >> Query:{"workspaceUUID":"wksp_xxxxx","checkerUUID":"rul_xxxxx"}
[07-31 01:40:36] [+13ms] [746ms] 【Studio】 >> 响应:【200 OK】 {"code":200,"content":{"data":{"alertPolicies":[{"id":8543,"uuid":"altpl_xxxxx","workspaceUUID":"wksp_xxxxx","name":"<告警策略名称>","rules":[{"targets":[{"type":"mail","to":["<邮箱地址>"],"tags":{"-df_source":"security"},"status":"critical"}],"upgradeTargets":[{"id":"notify_xxxxx","name":"<通知对象名称>","type":"feishuRobot","webhook":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx","secret":"xxxxx","tags":{"-df_source":"security"},"duration":300,"isDisabled":false,"status":"critical"}]}],"ruleTimezone":"Asia/Shanghai","minInterval":900,"aggClusterFields":[],"aggFields":[],"aggLabels":[],"aggInterval":0,"status":0}],"silent":[{"crontab":"0 11 * * *","start":"2025-06-09T11:00:00+08:00","crontabDuration":3600,"crontabTimezone":"Asia/Shanghai","tags":{"df_monitor_checker_id":"rul_xxxxx"}}]}},"errorCode":"","message":"","success":true,"traceId":"TRACE-XXXXX"}
[07-31 01:40:36] [+2ms] [748ms] 【Studio】 告警配置(从 API 获取):rul_xxxxx => {"_DFF_CACHE_EXPIRE_TIME":1753897416,"alertPolicies":[{"id":"altpl_xxxxx","workspaceUUID":"wksp_xxxxx","name":"<告警策略名称>","rules":[{"targets":[{"type":"mail","to":["<邮箱地址>"],"tags":{"-df_source":"security"},"status":"critical"}],"upgradeTargets":[{"id":"notify_xxxxx","name":"<通知对象名称>","type":"feishuRobot","webhook":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx","secret":"xxxxx","tags":{"-df_source":"security"},"duration":300,"isDisabled":false,"status":"critical"}]}],"ruleTimezone":"Asia/Shanghai","minInterval":900,"aggClusterFields":[],"aggFields":[],"aggLabels":[],"aggInterval":0}],"silent":[{"crontab":"0 11 * * *","start":"2025-06-09T11:00:00+08:00","crontabDuration":3600,"crontabTimezone":"Asia/Shanghai","tags":{"df_monitor_checker_id":"rul_xxxxx"}}]}

写入事件

当产生事件后,监控器会向集群内的 Internal DataWay 写入事件数据。

示例
1
2
3
4
5
6
7
8
[07-31 01:40:36] [+0ms] [904ms] 【内部 DataWay】 写入事件
[07-31 01:40:36] [+0ms] [904ms] 【内部 DataWay】 --> [事件 1/1] TMP 标题:周逸灵-监控器临时测试 {{ tag }} 80.82777778(event-xxxxx)
[07-31 01:40:36] [+2ms] [907ms] 【内部 DataWay】 行协议方式写入数据 -> POST /v1/write/keyevent,工作空间 Token:tkn_xxxxx
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 --> 第 1/1 条数据
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 ----> JSON 格式: <JSON 格式的事件数据,略>
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 ----> 行协议格式: <行协议格式的事件数据,略>
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 ----> 请求头:{"X-Pkg-Id":"gdff-xxxxx"} (包含 1 条数据)
[07-31 01:40:36] [+9ms] [916ms] 【内部 DataWay】 --> 响应:【200 OK】 ""

3. 完整示例解读

每次迭代后日志内容可能有变化

由于存在新增、修改功能,或发现以往日志输出需要完善的地方

因此,每次迭代之后,日志具体内容细节可能多少都会有变动

以下是添加了解释的完整示例

在下方日志中:

# 开头的内容为说明解释,不是日志原文

同时额外加入了空行,方便阅读,日志原文中没有空行

其他内容为日志原文

日志解读
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# 观测云中「任务调度」计数
[07-31 01:40:36] [+6ms] [659ms] 【使用额度】 数据查询范围为 5 分钟,尚未超过 15 分钟,不需要额外计量
[07-31 01:40:36] [+0ms] [659ms] 【使用额度】 存在 workspace_uuid 参数,值为 wksp_xxxxx ,需要计量 1 次

# 本次任务执行的函数 ID 及其参数列表
[07-31 01:40:36] [+4ms] [664ms] 【函数】 调用函数:guance__api_impl.custom_check
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:checker = "custom_metric"
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:kwargs = {"version":"v2"}
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:channels = ["chan_xxxxx"]
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:checker_opt = {"id":"rul_xxxxx","name":"<监控器名称>","label":["<标签>"],"title":"<事件标题>","message":"<事件详情>","recoverInterval":300,"noDataAction":"noDataEvent","noDataInterval":300,"noDataTitle":"","noDataMessage":"","infoEvent":false,"rules":[{"conditionLogic":"and","conditions":[{"alias":"Result","operator":">=","operands":["0"]}],"status":"critical"}]}
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:disable_check_end_time = false
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:extra_data = {"type":"simpleCheck"}
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:monitor_opt = {"id":"monitor_xxxxx","name":"default"}
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:targets = [{"alias":"Result","queryType":"dql","dql":"M::`fake_data_for_test`:(avg(`field_int`) AS `value`)","range":300}]
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:workspace_token = "tkn_xxxxx"
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:workspace_uuid = "wksp_xxxxx"
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:at_accounts = null
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:at_accounts_nodata = null
[07-31 01:40:36] [+0ms] [664ms] 【函数】 --> 参数:related_issues = null

# 监控器检测间隔及关联配置
[07-31 01:40:36] [+1ms] [666ms] 【监控器】 根据实际 Cron 表达式(0 */5 * * * *)计算检测间隔
[07-31 01:40:36] [+0ms] [666ms] 【监控器】 --> 检测间隔:300 秒
[07-31 01:40:36] [+7ms] [674ms] 【监控器】 监控器对象列表缓存过期时间为:3000 秒(50 分钟)
[07-31 01:40:36] [+0ms] [674ms] 【维度标签列表缓存】 将过期时长设置为 3000 秒

# 数据断档检测(通过 DQL 查询数据、单位)
[07-31 01:40:36] [+0ms] [674ms] 【监控器】 查询用于「数据断档检测」的数据:触发时间 - 检测范围(300 秒) ~ 触发时间
[07-31 01:40:36] [+0ms] [674ms] 【数据查询】 执行 DQL 查询 -> 时间范围:2025-07-31 01:35:00 ~ 2025-07-31 01:40:00
[07-31 01:40:36] [+0ms] [674ms] 【数据查询】 调用 KODO / STUDIO API -> POST http://kodo-inner.forethought-kodo:9527/v1/query
[07-31 01:40:36] [+7ms] [681ms] 【数据查询】 >> Body:{"workspace_uuid":"wksp_xxxxx","queries":[{"qtype":"dql","query":"M::`fake_data_for_test`:(avg(`field_int`) AS `value`)","time_range":[1753896900000,1753897200000],"check_nsq_latency":true,"disable_sampling":true,"disable_slimit":true,"mask_visible":true,"search_timeout":"15s"}],"echo_explain":true}
[07-31 01:40:36] [+39ms] [720ms] 【数据查询】 >> 响应:【200 OK】 {"content":[{"series":[{"columns":["time","value"],"name":"fake_data_for_test","values":[[1753897190000,80.82777778]]}],"query_parse":{"fields":{"value":"field_int"},"funcs":{"value":["avg"]},"namespace":"metric","sources":{"fake_data_for_test":"exact"}},"cost":"31ms","<其他字段>":"<略>"}]}
[07-31 01:40:36] [+0ms] [720ms] 【数据查询】 --> 查询完毕
[07-31 01:40:36] [+2ms] [723ms] 【Studio】 用户指标单位(从缓存获取):wksp_xxxxx => {"_DFF_CACHE_EXPIRE_TIME":1753897410,"metric":{"<指标集>":{"<指标>":"<单位>"}},"logging":{"<字段>":"<单位>"},"object":{"<字段>":"<单位>"},"other":{"<字段>":"<单位>"}}
[07-31 01:40:36] [+0ms] [723ms] 【Studio】 已匹配用户指标单位:metric/fake_data_for_test/field_int OR other/field_int => digital,B
[07-31 01:40:36] [+0ms] [723ms] 【数据查询】 --> DQL 结果数据拆包:{"series":[{"name":"fake_data_for_test","columns":["time","value"],"values":[["2025-07-30T17:39:50Z",80.82777778]]}],"metric_units":{"value":"digital,B"},"query_time_range":[1753896900000,1753897200000]}
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 已搜集的指标单位:
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 --> value: digital,B
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 --> Result: digital,B

# 故障检测(通过 DQL 查询数据、单位)
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 查询用于「故障检测」的数据:触发时间 - 检测范围(300 秒) ~ 触发时间
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 已执行过相同查询,读取缓存作为查询结果

# 判断数据持续新(是否存在对象从有到无 / 从无到有)
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 ------------------- 加载数据持续性信息 --------------------
[07-31 01:40:36] [+0ms] [723ms] 【监控器】 已配置 300 秒数据断档检测范围
[07-31 01:40:36] [+0ms] [723ms] 【维度标签列表缓存】 从缓存中获取 field=`rul_xxxxx` 的全量缓存数据
[07-31 01:40:36] [+2ms] [725ms] 【维度标签列表缓存】 --> 共 1 条缓存记录
[07-31 01:40:36] [+0ms] [725ms] 【维度标签列表缓存】 --> {"rul_xxxxx":{"{}":1753896900}}
[07-31 01:40:36] [+0ms] [725ms] 【维度标签列表缓存】 更新缓存:
[07-31 01:40:36] [+0ms] [725ms] 【维度标签列表缓存】 --> rul_xxxxx: {"{}":1753897200}
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 [对象 1/1] {} 数据直至当前可查

# 生成数据断档事件(从有到无)
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 -------------------- 执行数据断档检测 --------------------
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 --> 没有数据断档对象

# 生成数据断档恢复事件(从无到有)
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 ------------------- 判断数据从断档恢复 --------------------
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 [存续数据对象 1/1] {}
[07-31 01:40:36] [+0ms] [726ms] 【事件故障信息缓存】 从缓存中获取 field=`rul_xxxxx` 的全量缓存数据
[07-31 01:40:36] [+0ms] [726ms] 【事件故障信息缓存】 --> check 包含 1 条缓存记录
[07-31 01:40:36] [+0ms] [726ms] 【事件故障信息缓存】 --> nodata 包含 0 条缓存记录
[07-31 01:40:36] [+0ms] [726ms] 【事件故障信息缓存】 ----> 共 1 条缓存记录
[07-31 01:40:36] [+0ms] [726ms] 【事件故障信息缓存】 --> {"rul_xxxxx":{"check":{"{}":{"date":1753896900,"faultId":"event-xxxxx","faultStartTime":1753896300,"faultDuration":600,"status":"critical"}},"nodata":{}}}
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 对象 {} 的 nodata 故障周期信息(fault_info):null
[07-31 01:40:36] [+0ms] [726ms] 【监控器】 --> 没有上次数据断档检测事件
[07-31 01:40:36] [+0ms] [727ms] 【监控器】 --> 没有活跃数据断档事件,不需要产生数据断档恢复事件

# 生成故障事件
[07-31 01:40:36] [+0ms] [727ms] 【监控器】 -------------------- 执行数据数值检测 --------------------

# 获取最近检测结果缓存(用于连续触发判断)
[07-31 01:40:36] [+0ms] [727ms] 【最近检测结果缓存】 从缓存中获取 field=`rul_xxxxx` 的全量缓存数据
[07-31 01:40:36] [+1ms] [729ms] 【最近检测结果缓存】 --> 共 1 条缓存记录
[07-31 01:40:36] [+0ms] [729ms] 【最近检测结果缓存】 --> {"rul_xxxxx":{"{}":{"statusQueue":["critical","critical","critical"],"timestamp":1753896900}}}

# 依次判断对象检测值(即检查 Result 值)
[07-31 01:40:36] [+0ms] [729ms] 【监控器】 [检测对象 1/1] {}
[07-31 01:40:36] [+0ms] [729ms] 【通用阈值检测】 待检测数据:{"Result":[80.82777778]}
[07-31 01:40:36] [+0ms] [729ms] 【通用阈值检测】 关联数据:{"value":80.82777778}

# 依次判断检测规则
[07-31 01:40:36] [+0ms] [729ms] 【通用阈值检测】 [阈值规则 1/1] critical:Result >= ["0"]
[07-31 01:40:36] [+0ms] [729ms] 【条件判断】 [条件 1/1] IF Result (ANY[80.82777778]) >= ["0"],以 float 类型进行判断
[07-31 01:40:36] [+0ms] [729ms] 【条件判断】 --> 中间结果为 True ,条件关系为 AND ,继续
[07-31 01:40:36] [+0ms] [729ms] 【通用阈值检测】 --> 匹配成功,结束判断
[07-31 01:40:36] [+0ms] [729ms] 【通用阈值检测】 阈值规则匹配结果:{"checker_sub":"check","check_data":{"Result":80.82777778},"related_data":{"value":80.82777778},"conditions":[{"alias":"Result","operator":">=","operands":["0"],"expr":">= 0"}],"match_times":1,"status":"critical"}
[07-31 01:40:36] [+0ms] [729ms] 【监控器】 --> 检测对象 {}:已达到故障 critical 条件
[07-31 01:40:36] [+0ms] [729ms] 【监控器】 --> 最近连续检测结果为 [ critical, critical, critical, critical(本次) ]
[07-31 01:40:36] [+0ms] [729ms] 【监控器】 ----> 故障(critical)已连续匹配 4 次(包括本次),满足设定的【连续 1 次】,需要产生事件

# 获取事件故障信息缓存(用于计算故障持续时长)
[07-31 01:40:36] [+1ms] [730ms] 【事件故障信息缓存】 --> 缓存添加 / 更新:监控器(ID: rul_xxxxx),子检测器(check),对象({}),状态(critical),持续时长为 900 秒
[07-31 01:40:36] [+0ms] [730ms] 【事件分级故障信息缓存】 --> 忽略普通故障事件(子检测器 check)
[07-31 01:40:36] [+0ms] [730ms] 【外部事件故障信息缓存】 --> 忽略非外部事件(检测器 custom_metric)
[07-31 01:40:36] [+0ms] [730ms] 【单位转换】 Value: 80.82777778, Unit: digital,B
[07-31 01:40:36] [+0ms] [730ms] 【单位转换】 Value: 80.82777778, Unit: digital,B
[07-31 01:40:36] [+0ms] [730ms] 【单位转换】 Value: '0', Unit: digital,B
[07-31 01:40:36] [+0ms] [730ms] 【单位转换】 --> Value: 0

# 更新最近检测结果缓存(用于连续触发判断)
[07-31 01:40:36] [+0ms] [730ms] 【最近检测结果缓存】 更新缓存:
[07-31 01:40:36] [+0ms] [730ms] 【最近检测结果缓存】 --> rul_xxxxx: {"{}":{"statusQueue":["critical","critical","critical","critical"],"timestamp":1753897200}}

# 获取告警配置(用于发送告警)
[07-31 01:40:36] [+1ms] [732ms] 【Studio】 告警信息缓存已禁用
[07-31 01:40:36] [+0ms] [732ms] 【Studio】 调用 Studio Inner API -> GET http://inner.forethought-core:5000/api/v1/inner/alert_opt/get
[07-31 01:40:36] [+0ms] [732ms] 【Studio】 >> Query:{"workspaceUUID":"wksp_xxxxx","checkerUUID":"rul_xxxxx"}
[07-31 01:40:36] [+13ms] [746ms] 【Studio】 >> 响应:【200 OK】 {"code":200,"content":{"data":{"alertPolicies":[{"id":8543,"uuid":"altpl_xxxxx","workspaceUUID":"wksp_xxxxx","name":"<告警策略名称>","rules":[{"targets":[{"type":"mail","to":["<邮箱地址>"],"tags":{"-df_source":"security"},"status":"critical"}],"upgradeTargets":[{"id":"notify_xxxxx","name":"<通知对象名称>","type":"feishuRobot","webhook":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx","secret":"xxxxx","tags":{"-df_source":"security"},"duration":300,"isDisabled":false,"status":"critical"}]}],"ruleTimezone":"Asia/Shanghai","minInterval":900,"aggClusterFields":[],"aggFields":[],"aggLabels":[],"aggInterval":0,"status":0}],"silent":[{"crontab":"0 11 * * *","start":"2025-06-09T11:00:00+08:00","crontabDuration":3600,"crontabTimezone":"Asia/Shanghai","tags":{"df_monitor_checker_id":"rul_xxxxx"}}]}},"errorCode":"","message":"","success":true,"traceId":"TRACE-XXXXX"}
[07-31 01:40:36] [+2ms] [748ms] 【Studio】 告警配置(从 API 获取):rul_xxxxx => {"_DFF_CACHE_EXPIRE_TIME":1753897416,"alertPolicies":[{"id":"altpl_xxxxx","workspaceUUID":"wksp_xxxxx","name":"<告警策略名称>","rules":[{"targets":[{"type":"mail","to":["<邮箱地址>"],"tags":{"-df_source":"security"},"status":"critical"}],"upgradeTargets":[{"id":"notify_xxxxx","name":"<通知对象名称>","type":"feishuRobot","webhook":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx","secret":"xxxxx","tags":{"-df_source":"security"},"duration":300,"isDisabled":false,"status":"critical"}]}],"ruleTimezone":"Asia/Shanghai","minInterval":900,"aggClusterFields":[],"aggFields":[],"aggLabels":[],"aggInterval":0}],"silent":[{"crontab":"0 11 * * *","start":"2025-06-09T11:00:00+08:00","crontabDuration":3600,"crontabTimezone":"Asia/Shanghai","tags":{"df_monitor_checker_id":"rul_xxxxx"}}]}

# 依次处理事件
[07-31 01:40:36] [+0ms] [748ms] 【事件告警器】 [事件 1/1] <critical事件@monitor:{}:<事件标题>>

# 依次判断静默规则
[07-31 01:40:36] [+0ms] [748ms] 【事件告警器】 ---------------------- 静默处理 ----------------------
[07-31 01:40:36] [+0ms] [748ms] 【事件告警器】 [静默规则 1/1] 在 【2025-06-09 11:00:00 以后】 ,按 Cron 表达式 0 11 * * * 循环,每轮循环持续 3600 秒,对满足标签 {"df_monitor_checker_id":"rul_xxxxx"} 的事件静默
[07-31 01:40:36] [+0ms] [749ms] 【事件告警器】 --> 静默标签不匹配,跳过
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 未能匹配静默规则,不需要静默

# 依次判断告警策略、规则(时间段)、通知对象
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 ---------------------- 告警策略 ----------------------
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 [告警策略 1/1] <告警策略名称> (critical / ID: altpl_xxxxx)
[07-31 01:40:36] [+0ms] [750ms] 【告警策略 REF 最后告警时间缓存】 从缓存中获取 field=`rul_xxxxx` 的全量缓存数据
[07-31 01:40:36] [+0ms] [750ms] 【告警策略 REF 最后告警时间缓存】 --> 共 1 条缓存记录
[07-31 01:40:36] [+0ms] [750ms] 【告警策略 REF 最后告警时间缓存】 --> {"rul_xxxxx":{"xxxxx/check":{"critical|altpl_xxxxx":1753896300}}}
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 --> 上次告警于 2025-07-31 01:25:00,重复告警 900 秒,在 2025-07-31 01:40:00(0 秒以后)之前不重复告警
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 ----> 当前不处于重复告警期内,需要发送告警
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 [告警规则(时间段) 1/1] 任意时间
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 成功匹配告警规则(时间段),继续处理通知对象

[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 ~~~~~~~~~~ 处理告警通知对象 ~~~~~~~~~~
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 通知对象预过滤(status, isDisabled)
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 --> 过滤前数量:1,过滤后数量:1
[07-31 01:40:36] [+0ms] [750ms] 【事件告警器】 通知对象预过滤(filterString,tags)
[07-31 01:40:36] [+1ms] [752ms] 【事件告警器】 --> 事件数据 ({"df_source":"monitor"}) <=> Tags 过滤 ({"-df_source":"security"}):匹配
[07-31 01:40:36] [+0ms] [752ms] 【事件告警器】 --> 过滤前数量:1,过滤后数量:1
[07-31 01:40:36] [+0ms] [752ms] 【事件告警器】 进一步匹配告警通知对象
[07-31 01:40:36] [+0ms] [752ms] 【事件告警器】 [告警通知对象 1/1] mail (critical / Tags 过滤条件 {"-df_source":"security"})
[07-31 01:40:36] [+0ms] [752ms] 【告警 REF 最后告警时间缓存】 从缓存中获取 field=`rul_xxxxx` 的全量缓存数据
[07-31 01:40:36] [+0ms] [753ms] 【告警 REF 最后告警时间缓存】 --> 共 1 条缓存记录
[07-31 01:40:36] [+0ms] [753ms] 【告警 REF 最后告警时间缓存】 --> {"rul_xxxxx":{"xxxxx/xxxxx/alert/check":{"|critical|b64:xxxxxfQ|":1753896300}}}

[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 ~~~~~~~~~ 处理升级告警通知对象 ~~~~~~~~~
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 通知对象预过滤(status, isDisabled)
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 --> 过滤前数量:1,过滤后数量:1
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 通知对象预过滤(filterString,tags)
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 --> 事件数据 ({"df_source":"monitor"}) <=> Tags 过滤 ({"-df_source":"security"}):匹配
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 --> 过滤前数量:1,过滤后数量:1
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 进一步匹配升级告警通知对象
[07-31 01:40:36] [+0ms] [753ms] 【事件告警器】 [告警升级通知对象 1/1] feishuRobot / <通知对象名称> (300 秒 / critical / Tags 过滤条件 {"-df_source":"security"})
[07-31 01:40:36] [+0ms] [753ms] 【升级告警 REF 首次命中时间缓存】 从缓存中获取 field=`rul_xxxxx` 的全量缓存数据
[07-31 01:40:36] [+1ms] [755ms] 【升级告警 REF 首次命中时间缓存】 --> 共 1 条缓存记录
[07-31 01:40:36] [+0ms] [755ms] 【升级告警 REF 首次命中时间缓存】 --> {"rul_xxxxx":{"xxxxx/xxxxx/check":{"300|critical|b64:xxxxxfQ|":1753896300}}}
[07-31 01:40:36] [+0ms] [755ms] 【升级告警 REF 首次命中时间缓存】 当前事件状态为 critical,且已经记录首次命中时间(300 秒 / critical / Tags 过滤条件 {"-df_source":"security"}),跳过
[07-31 01:40:36] [+0ms] [755ms] 【事件告警器】 --> 事件告警规则(时间段)首次命中(300 秒 / critical / Tags 过滤条件 {"-df_source":"security"})于 2025-07-31 01:25:00 已持续了 900 秒,达到升级条件 300 秒,需要告警升级

# 渲染事件文案
[07-31 01:40:36] [+0ms] [755ms] 【监控器事件】 渲染标题 / 内容 / 通知

# 渲染事件标题
[07-31 01:40:36] [+1ms] [775ms] 【文本渲染器】 渲染模板:
<事件标题模板>
[07-31 01:40:36] [+0ms] [776ms] 【文本渲染器】 --> 渲染成功。输出:
<事件标题,略>

# 渲染事件详情
[07-31 01:40:36] [+3ms] [792ms] 【文本渲染器】 渲染模板:
<事件详情模板>
[07-31 01:40:36] [+2ms] [794ms] 【文本渲染器】 --> 渲染成功。输出:
<事件详情,略>

# 发送 / 缓冲消息
[07-31 01:40:36] [+0ms] [864ms] 【事件告警器】 --> Studio 已配置消息合并发送,消息缓冲(仅限支持合并发送的消息)
[07-31 01:40:36] [+0ms] [864ms] 【消息发送】 缓冲消息
[07-31 01:40:36] [+0ms] [864ms] 【消息发送】 --> 消息:<mail> {"brand_key":"guance","status":"critical","to":["<邮箱地址>"]}
[07-31 01:40:36] [+0ms] [897ms] 【事件告警器】 --> Studio 已配置消息合并发送,消息缓冲(仅限支持合并发送的消息)
[07-31 01:40:36] [+0ms] [897ms] 【消息发送】 缓冲消息
[07-31 01:40:36] [+0ms] [897ms] 【消息发送】 --> 消息:<feishuRobot> {"brand_key":"guance","status":"critical","webhook":"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx"}

# 更新告警策略 REF 最后告警时间缓存(用于后续重复告警间隔判断)
[07-31 01:40:36] [+1ms] [898ms] 【告警策略 REF 最后告警时间缓存】 更新缓存:
[07-31 01:40:36] [+0ms] [898ms] 【告警策略 REF 最后告警时间缓存】 --> rul_xxxxx: {"xxxxx/check":{"critical|altpl_xxxxx":1753897200}}

# 更新告警 REF 最后告警时间缓存(用于后续判断恢复事件发送对象)
[07-31 01:40:36] [+1ms] [900ms] 【告警 REF 最后告警时间缓存】 更新缓存:
[07-31 01:40:36] [+0ms] [900ms] 【告警 REF 最后告警时间缓存】 --> rul_xxxxx: {"xxxxx/xxxxx/alert/check":{"|critical|b64:xxxxxfQ|":1753897200},"xxxxx/xxxxx/upgrade/check":{"300|critical|b64:xxxxxfQ|":1753897200}}

# 更新升级告警 REF 首次命中时间缓存(用于后续判断是否已升级)
[07-31 01:40:36] [+0ms] [901ms] 【升级告警 REF 首次命中时间缓存】 更新缓存:
[07-31 01:40:36] [+0ms] [901ms] 【升级告警 REF 首次命中时间缓存】 --> rul_xxxxx: {"xxxxx/xxxxx/check":{"300|critical|b64:xxxxxfQ|":1753896300}}

# 更新事件故障信息缓存(用于后续判断故障时长等)
[07-31 01:40:36] [+2ms] [904ms] 【事件故障信息缓存】 更新缓存:
[07-31 01:40:36] [+0ms] [904ms] 【事件故障信息缓存】 --> rul_xxxxx: {"check":{"{}":{"date":1753897200,"faultDuration":900,"faultId":"event-xxxxx","faultStartTime":1753896300,"status":"critical"}}}

# 写入 DataWay
[07-31 01:40:36] [+0ms] [904ms] 【内部 DataWay】 写入事件
[07-31 01:40:36] [+0ms] [904ms] 【内部 DataWay】 --> [事件 1/1] TMP 标题:周逸灵-监控器临时测试 {{ tag }} 80.82777778(event-xxxxx)
[07-31 01:40:36] [+2ms] [907ms] 【内部 DataWay】 行协议方式写入数据 -> POST /v1/write/keyevent,工作空间 Token:tkn_xxxxx
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 --> 第 1/1 条数据
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 ----> JSON 格式: <JSON 格式的事件数据,略>
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 ----> 行协议格式: <行协议格式的事件数据,略>
[07-31 01:40:36] [+0ms] [907ms] 【内部 DataWay】 ----> 请求头:{"X-Pkg-Id":"gdff-xxxxx"} (包含 1 条数据)
[07-31 01:40:36] [+9ms] [916ms] 【内部 DataWay】 --> 响应:【200 OK】 ""

# 向 Studio 报告事件(用于异常追踪处理)
[07-31 01:40:36] [+0ms] [916ms] 【Studio】 缓冲需要通知 Studio 的事件
[07-31 01:40:36] [+0ms] [930ms] 【Studio】 --> 事件:<事件标题>(wksp_xxxxx/event-xxxxx)

# 本次检测产生事件数量
[07-31 01:40:36] [+0ms] [931ms] 本次检测共产生 1 个监控器事件