跳转至

有关「监控器」常见问题

2023-08-28

监控器由于其配置复杂,受外部影响多,很多人都会遇到实际行为与预期不符的情况。

本文以总结了经常遇到的问题以及正确的提问方式。

不要再来询问,为什么监控器检测不到数据 / 检测数据与实际不符

监控器只是在规定时间,按照配置去执行 DQL 语句,并根据 DQL 返回值进行判断。(如果查不到数据,就进一步根据数据断档配置进行处理)

  1. 监控器不负责数据上报:数据上报频率,入库延迟请咨询数据采集端,监控器无法回答相关问题
  2. 监控器不负责数据库:用户配置了什么 DQL 监控器就执行什么 DQL,当时没查到数据就是没查到。你可以参考下文有关查不到数据的说明,但请勿来询问为什么没查到,因为你并没有在当时那个时间点去执行 DQL,不要拿监控器都执行完了才能查到的数据说事。

二次提示:不要在事后问我为什么查不到数据,事后能查到数据不代表监控器当时也能查到

快速判断表

预期与实际情况 可能原因
预期产生事件 / 告警,但实际未产生 1. 监控器修改过配置,且当前配置与历史行为不匹配
2. 数据上报入库延迟过大,导致检测时并没有查询到任何数据
3. 聚合函数选择了 Count 同时判断条件涉及 0
4. 监控器被禁用,不在运行
静默 / 沉默规则影响
5. 数据库查询失败 / 写入操作失败
预期不产生事件 / 告警,但实际产生 1. 监控器修改过配置,且当前配置与历史行为不匹配
2. 数据上报入库延迟过大,导致检测时并没有查询到任何数据,从而产生数据断档告警
监控器执行慢 / 队列 8 堵塞 1. worker-8 数量太少,监控器太多,来不及跑
2. 监控器执行 DQL 返回慢,导致单位时间能运行的监控器少
3. 用户配置监控器检测对象过多(即 DQL 返回的时间线数量巨大)
4. 关联配置数量过多,比如使用脚本刷出来的大量告警策略、通知对象、静默规则

当遇到问题时,应当尽可能保留现场。如需做测试,应当另创建一个监控器。修改认为有问题的监控器,后续将很难排查当时的问题

1. 数据上报延迟过大,监控器无法查询到数据

物理限制

已知光在真空中的速度为 30 万公里每秒。电信号在铜线中的速度大约为 0.7 倍光速。

因此,即使用户上报的数据,完全忽略各种软硬件耗时,且以光速到达服务器并立即入库可查。也只有 300 公里以内的客户能做到延迟小于 1 毫秒。

由于数据上报入库延迟是客观存在且无法避免的,监控器为了保证每次运行检测时可以尽可能符合预期,实际检测执行时间延后 30 秒(旧版本中为 1 分钟),即:

以「频率为 1 分钟」的监控器为例,原计划在 00:30:00 时运行的监控器,实际会在 (00:30:00 + 延迟) 运行。

这样,可以保证数据上报入库存在少许延迟的数据,依然可以被检测正常覆盖。

也因此,如果上报数据延迟过大,那监控器将不可能完成有效的检测。

以下是数据上报入库延迟导致无法查询到数据的示意表:

当前监控器方案,容许一定延迟

时间 数据上报 监控器检测
00:29:59 已上报,未入库 等待
00:30:00 未入库,不可查 计划执行,但尚未实际执行
00:30:01 已入库,已可查 等待
00:31:00 已入库,已可查 实际执行,可正确查询到数据
时间 数据上报 监控器检测
00:29:59 已上报,未入库 等待
00:30:00 未入库,不可查 实际执行,但无法查询到数据
00:30:01 已入库,已可查

2. 如何判断数据上报入库延迟是否过大?

目前 GuanceDB 对上报的数据都会自动添加 create_time,可以使用 DQL 查询工具,查询 timecreate_time 之间差值:

此方法仅作为参考,并不完备。且在以下场景中无效

  1. 数据上报端指定了数据时间 time,但实际上报又远远晚于指定的时间(如:在 01:00 时上报了一条时间戳为 00:30 的数据)
  2. 落盘卡顿,即虽然在写入时添加当时时刻的 create_time,但实际数据并不能立刻从数据库中查询得到。
Text Only
1
L::`DFF_task_record_func`:(create_time) limit 10

因此,根据本节内容,唯一可以做出的判断如下:

当上报端没有指定 time,且在 DQL 查询工具中发现 timecreate_time 差距过大时,可知数据上报必然存在较大延迟

P 可以推出 Q,不代表 Q 能推出 P

当「上报端没有指定 time,且在 DQL 查询工具中能够发现 timecreate_time 差距过大」,则「数据上报存在较大延迟」成立。

不代表「数据上报存在较大延迟」,就「上报端没有指定time,且在 DQL 查询工具中能够发现 timecreate_time 差距过大」。

P 可以推出 Q,不代表非 P 能推出非 Q

当「上报端没有指定 time,且在 DQL 查询工具中能够发现 timecreate_time 差距过大」,则「数据上报存在较大延迟」成立。

不代表「上报端指定time」时,「数据上报不存在较大延迟」。

不代表「在 DQL 查询工具中没有发现 timecreate_time 差距过大」时,「数据上报不存在较大延迟」。

3. 数据上报入库延迟过大怎么办?

目前没有办法,上报入库延迟过大是导致检测失效的直接原因。

唯一能改善的方法是,将监控器的检测时间范围大于检测频率(如:每分钟检测,每次检测 5 分钟数据),使得同一个时间段的数据被多次检测,提高查询成功率。

但同时必然会带来同一时间段的数据被多次检测的副作用,告警可能会变多。

4. 监控器配置与实际行为不一致,怎么办?

请检查当前监控器配置,并与监控器日志中的参数进行对比,检查是否一致。

如不一致,可能是因为 Studio 在保存时未正确在 Func 中设置

如一致,说明监控器本身没有问题,可以进入「管理 / 设置 / 安全 / 操作审计」来查看操作记录,确认是否有人之前修改过配置

5. 聚合函数选择了 Count 同时判断条件涉及 0,查不到为 0 的对象

花名册原理

当没有花名册时,你只能知道谁在,但不知道谁不在

由于观测云中的数据都是非结构化数据,且检测区分不同对象依赖 BY 语句,因此本来应该有哪些对象是不可知的。

与此同时,任何数据库(MySQL 也好,InfluxDB 也好),在使用聚合函数 COUNT 配合 BY 时,也是不可能返回 COUNT == 0 的条目的。

所以,在监控器配置中,单纯使用「聚合函数 COUNT 配合 BY,再配置 Result >= 0」是没有意义的。

6. 数据断档检测是如何实现的?

监控器在每轮运行时,都会记录可以查询到的对象并缓存

当某个对象在较长一段时间内都没有被查询到时,会自动从缓存中排除。

通过「缓存的对象」和「本轮检测范围内对象」来判断,对象是否存在「数据断档」。

以下是数据断档对象判断的示意表:

检测轮数 检测范围内对象 缓存的对象 结果
1 张三 张三
2 张三、李四 张三、李四
3 李四 张三、李四 张三对象存在数据断档

7. 配置了静默规则后,事件依然存在

静默规则只会影响告警是否发送,不影响事件的产生。

8. 监控器执行慢 / 队列 8 堵塞

  1. worker-8 数量太少,监控器太多,来不及跑
  2. 监控器执行 DQL 返回慢,导致单位时间能运行的监控器少
  3. 用户配置监控器检测对象过多(即 DQL 返回的时间线数量巨大)
  4. 关联配置数量过多,比如使用脚本刷出来的大量告警策略、通知对象、静默规则

X. 如何进行有效的提问

如果上述常见问题都无法解决你的问题,那么你可以尝试按照如下方式提问:

请提交以下5 项内容至研发侧,研发侧会根据提交的信息查询系统日志,以判断是否存在问题。

请完整提交以下 5 项内容,缺少内容会导致问题无法定位

# 提交内容 来源
1 哪个观测云节点? 可以直接复制地址栏 URL 地址
如:cn3-console.guance.com 就是 cn3
2 哪个工作空间? 可以在「管理 / 设置」中查看「工作空间 ID」
工作空间 ID 格式为 wksp_xxxxx
3 哪个监控器? 可以在监控器配置页面,直接页面左上方的 ID
监控器 ID 格式一定是 rul_xxxxx
4 什么时候? 请提供准确的时间如:2023-01-01 00:10:00
不要写类似「昨天中午」、「之前」、「刚刚」这种模糊的,随着时间推移意义会发生变化的描述
5 问题描述 简要说明「为什么你会觉得应该产生事件 / 告警」

请提交以下2 项内容至研发侧,研发侧会根据提交的信息查询系统日志,以判断是否存在问题。

请完整提交以下 2 项内容,缺少内容会导致问题无法定位

# 提交内容 来源
1 事件 JSON 文件 可在「事件详情 / 导出 / 导出 JSON 文件」下载事件的 JSON 文件
2 问题描述 简要说明「为什么你会觉得不应该产生事件 / 告警」