结论先行:如果异常持续时间明显短于采样间隔,靠提高单点精度没有意义,必须改成“事件触发记录”或“短窗口高频采样”两种模式之一;如果异常本身持续数倍于间隔,只是被平均值稀释,那么调低聚合粒度、保留原始样本就够了。判断走哪条路,先看一个条件——异常是瞬时的,还是持续但被平滑掉的。
采样频率低带来的问题并不只有一种。假设某插件每5分钟记录一次请求耗时,而真实异常只持续20秒,那么这次异常大概率落在两次采样之间,完全不被记录。反过来,如果异常持续40分钟,只是幅度被5分钟均值摊平,那么原始数据里其实有它,问题出在聚合和展示环节。
区分方法很直接:把同一时段的原始记录按更细粒度重算一次,看异常是否重新出现。
这个区分决定下一步动作完全不同。前者改展示和告警阈值即可,后者必须动采集机制。
确认是采样遗漏后,常见反应是把间隔从5分钟改成30秒。这确实能提高命中概率,但代价是存储、传输和插件自身开销同步上升,而短时异常仍可能落在两次采样之间,只是概率变小,不是消除。
更可靠的做法是让采集由事件驱动:在插件内部对关键路径埋点,当某项指标越过预设边界时,立即写入一条带时间戳的记录,而不是等下一个采样周期。这样捕捉的是“发生过什么”,而不是“某一刻大概是多少”。
假设一个场景:某插件负责表单提交,正常耗时200毫秒以内。若把阈值设为800毫秒,超过就立即记录起止时间和当时上下文,那么持续1秒的异常也会留下痕迹。这里的阈值需要根据业务实际分布设定,不能照搬他人的数值。
实际动作:先选一条最关键的业务路径,加上越界即记录的埋点,运行一段时间后对比“事件记录条数”与“原有采样数据中可见的异常次数”。如果事件记录明显更多,说明此前确实在漏采,下一步应把埋点扩展到其他路径;如果两者接近,说明遗漏不严重,可以维持原采样并只保留事件记录作为补充。
并不是所有情况都该放弃调频。以下条件同时成立时,直接缩短采样间隔是更省事的方案:
如果其中任何一条不成立,尤其是写入开销会反过来影响被观测的业务,就应回到事件触发方案。采集行为本身成为负担时,观测结果已经不可信。
如果异常并非发生在插件内部,而是来自外部依赖——比如远端接口偶发超时、数据库连接池瞬时耗尽——那么插件内的埋点只能记录“我等待了很久”,无法说明对方发生了什么。此时无论采样多密、触发多灵敏,都只能看到结果,看不到原因。
这种情况下,插件侧记录应至少包含请求目标、开始时间、结束时间和返回状态,并把这些字段与外部服务自身的日志按时间对齐。若外部服务不提供细粒度日志,插件侧的高频采样就只能用于确认影响范围,不能用于定位根因。判断依据是:插件记录里的耗时是否集中在等待阶段,而不是自身处理阶段。
先做一次对照重算,确认异常属于聚合稀释还是采样遗漏。属于前者,调整聚合与告警;属于后者,选一条关键路径加事件触发记录,用事件条数与原有采样数据的差异来验证是否真的在漏采。只有当异常持续时间接近采样间隔、且采集开销可控时,才考虑直接缩短间隔。外部依赖导致的异常,插件侧数据只能界定影响,定位仍需对方日志配合。