跳转至

监控器内部原理


受网络、系统负载等因素影响,监控器的检测执行存在一些特殊的内部处理机制。

检测触发时间

用户配置的检测频率,在系统内部会转换为 Crontab 表达式。监控器将严格按此表达式定时启动,而非在创建或保存后,简单地每间隔 N 分钟执行一次。“

例如,用户为“监控器 A” 配置的执行频率为 “5 分钟”,其对应的 Crontab 表达式为 */5 * * * *。具体的触发时间关系如下:

动作 时间
用户创建/保存监控器 00:00:30
监控器触发检测 00:05:00
监控器触发检测 00:10:00
... ...

检测范围校准

由于平台需要处理所有用户配置的数千个监控器,同一时刻触发的检测任务无法同时执行,大部分任务会进入队列等待。

因此,多数检测任务会遇到计划在 T 时刻触发,但实际在 T + Δt 时刻才真正执行的情况。

如果直接使用实际执行时间作为查询的结束时间,会导致检测时间范围出现重叠或间隙。例如:

假设检测时间范围为 5 分钟:

动作 时间 实际查询的数据范围
1. 实际执行 00:05:10 00:00:10 ~ 00:05:10
2. 实际执行 00:10:05 00:05:05 ~ 00:10:05
3. 实际执行 00:15:30 00:10:30 ~ 00:15:30

在此情况下:

  • “动作 1” 和“动作 2” 的检测范围在 00:05:05 ~ 00:05:10 发生重叠;
  • “动作 2” 和“动作 3” 的检测范围在 00:10:05 ~ 00:10:30 出现间隙,导致此时间段的数据未被覆盖。

现行解决方案

为避免因任务排队导致的检测范围波动,监控器的数据查询范围会以其计划触发时间为基准进行校准,而非实际执行时间。

假设检测时间范围为 5 分钟:

动作 时间 最终查询的数据范围
监控器触发检测(入队) 00:05:00
监控器实际执行(出队) 00:05:10 00:00:00 ~ 00:05:00
监控器触发检测(入队) 00:10:00
监控器实际执行(出队) 00:10:30 00:05:00 ~ 00:10:00

由此可见,无论检测任务排队多久,其数据查询范围始终基于计划触发时间,从而保证了时间窗口的连续性和稳定性。

注意

上述示例仅为说明“检测范围校准”原理,实际范围还会受“检测范围漂移”机制影响。

检测范围漂移

受网络延迟、数据处理等因素影响,数据上报后通常需要数秒至数十秒才能完成落盘(即可通过 DQL 查询到)。在此期间,监控器检测将无法查询到这些"在途"数据。

这容易导致按固定时间范围检测时,出现数据缺失。例如:

假设检测时间范围为 5 分钟:

动作 时间 检测范围
上报数据 A(尚未落盘) 00:09:59
监控器触发检测 00:10:00 00:05:00 ~ 00:10:00
数据 A 落盘 00:10:05(数据时间戳为00:09:59
监控器触发检测 00:15:00 00:10:00 ~ 00:15:00

数据 A 虽然在第二次检测执行前已上报,但因首次检测时未落盘而被遗漏。待其落盘后,又因其时间戳较早,已不在后续检测的时间范围内,从而持续无法被检测到。

现行解决方案

为解决此问题,所有监控器在执行检测时,会自动将数据查询范围向历史方向漂移 1 分钟,以规避数据落盘期间的空窗期。

应用此方案后,上例变为:

假设检测时间范围为 5 分钟:

动作 时间 检测范围
上报数据 A(尚未落盘) 00:09:59
监控器触发检测 00:10:00 00:04:00 ~ 00:09:00(漂移 1 分钟)
数据 A 落盘 00:10:05(数据时间戳为00:09:59
监控器触发检测 00:15:00 00:09:00 ~ 00:14:00(漂移 1 分钟)

数据 A 虽然在 00:10:00 的检测中被遗漏,但其时间戳 00:09:59 落在了 00:15:00 这次检测的范围内(00:09:00 ~ 00:14:00),因此能够在第二次检测中被成功捕获。

注意

若数据落盘延迟超过 1 分钟,此方案将失效,检测可能无法达到预期效果。

数据断档判断逻辑

观测云作为时序数据平台,不具备传统资产管理软件中的“资产总表”概念。系统只能基于已查询到的数据判断“存在”什么,而无法知晓“理应存在但当前不存在”的对象。

举例来说:

一个盒子里已知有铅笔和橡皮。我们可以明确说出“盒子里存在铅笔和橡皮”,但无法断言“盒子里不存在钢笔”,因为我们并不知道盒子“本该”有什么。

因此,监控器中的“数据断档检测”实际采用“边缘触发”机制进行判断,即通过对比连续两次的查询结果来发现变化。

其核心逻辑是:“若上一轮检测发现对象 X 存在,而本轮检测中对象 X 消失,则判定 X 发生数据断档”。

假设检测时间范围为 5 分钟:

00:00:00 ~ 00:05:00 结果 00:05:00 ~ 00:10:00 结果 判定结果
检测到数据 未检测到数据 数据断档
检测到数据 检测到数据 持续正常
未检测到数据 检测到数据 数据重新上报
未检测到数据 未检测到数据 持续无数据(无意义状态)
注意

上述示例仅为说明核心逻辑。实际判断还会受“检测范围漂移”、“检测时间范围”以及“连续 N 分钟无数据才告警”等配置的影响。

数据断档 / 数据恢复事件

当监控器判定发生“数据断档”或“数据重新上报”时,会根据用户配置,决定是否生成“数据断档事件”或“数据断档恢复事件”。

为避免产生重复或无意义的告警,系统在生成事件前,会参考已存在的事件状态进行决策:

已存在的事件状态 本次检测判定结果 系统行动
无事件 / 数据断档恢复事件 数据断档 产生数据断档事件
无事件 / 数据断档事件 数据重新上报 产生数据断档恢复事件

因此,“数据断档事件”与“数据断档恢复事件”总是交替出现,不会出现连续的数据断档事件或连续的恢复事件。

常见问题

事件标明的时间与事件产生时间不符

在事件详情或告警通知中看到的时间(例如 00:15:00),是监控器的计划触发时间(即基于 Crontab 表达式的规整时间),而非事件在系统中实际生成的时间。

例外情况:如果您在监控器列表中手动点击“执行”,则产生的事件时间将为实际点击执行的时间。

事件标明的时间与实际故障发生的时间不符

事件标明的时间是监控器的计划触发时间,且由于存在“检测范围漂移”机制,实际检测的数据范围是 计划触发时间 - 检测范围 - 漂移时间计划触发时间 - 漂移时间

因此,实际发生故障的数据点时间,很可能不在 计划触发时间 - 检测范围计划触发时间 这个直观区间内。这属于正常现象。

在平台中直接查询时发现疑似故障数据,但监控器未产生告警

此问题通常由以下原因导致:

  1. 数据落盘延迟过高:检测执行时,故障数据因延迟尚未可被查询;
  2. DQL 查询执行失败:检测过程因查询失败而中断。

此类情况通常源于数据链路或查询引擎的问题,不在监控器自身的控制范围内。

文档评价

文档内容是否对您有帮助? ×