短时异常通常指持续几分钟到一两小时的波动,比如抓取错误率突然升高、某类页面响应时间跳变、索引量短时回落。如果工具采样间隔是每天一次甚至每周一次,这些波动在两次采样之间发生又恢复,你就只能看到两个正常点,中间那段异常被完全抹平。要捕捉它,只有两条路:把采样频率提上去,或者改变采样方式,用事件触发代替定时轮询。两条路各有代价,选哪条取决于异常持续多久、你多快需要知道、以及你愿意为误报付出多少处理成本。
提高采样频率是最直接的办法,但不是所有异常都值得这么做。先回答一个问题:你要抓的异常通常持续多久?
所以判断依据不是“频率越高越好”,而是异常持续时间与采样间隔的比值。经验上,采样间隔应小于异常持续时间的一半,才有较大概率在异常窗口内至少命中一个采样点。异常持续十分钟,采样间隔就该在五分钟以内;异常持续两小时,十五到三十分钟一次就够。
实施动作:先不要改全局频率,而是选一个最可能出问题的对象(比如某类模板页或某个目录),单独把它的采样间隔调到你估算的阈值,观察一到两周。如果这段时间里高频采样确实抓到了低频时看不到的异常,再考虑扩大范围;如果抓到的都是噪声,说明异常的时间尺度比你估计的长,没必要为它付高频的代价。
如果异常是突发性的、没有固定周期,提高定时采样的性价比很低,因为绝大部分采样点都落在正常区间。更合适的做法是把“定时问一次”换成“出事了才记一次”。
具体形式包括:监控关键指标的阈值,超过阈值时记录一次快照;或者订阅服务器端的错误日志、抓取日志,异常出现时直接落库。这样采样动作由事件驱动,而不是由时钟驱动,短时异常一发生就被记录,不会因为两次轮询之间的空档而丢失。
代价在于:阈值设得太松,异常漏报;设得太紧,误报频繁,你会被大量假警报淹没,最后干脆不看。所以事件触发的关键不是采集,而是阈值标定。建议先用一段历史数据回放,看不同阈值下会触发多少次、其中多少次是你认可的异常,再定最终阈值。
适用条件:事件触发依赖你能拿到原始日志或指标流。如果工具只提供聚合后的日报,没有原始事件接口,这条路走不通,只能回到提高定时频率。具体某个工具是否开放事件接口、以什么形式提供,需要以你实际使用的版本和文档为准,不要假设它一定有。
把两种选择放在一起看,决策会更清楚。
两者并不互斥。常见组合是:低频定时采样保留整体趋势,事件触发负责捕捉短时尖峰。但要注意,事件触发记录的快照如果字段太少,事后仍然无法定位原因,所以触发时要尽量带上上下文,比如发生时间、受影响的对象、当时的请求量级。缺少上下文的异常记录,价值有限。
假设某站点每天采样一次抓取状态,连续两周都显示正常。但用户反馈某天上午有十分钟页面打不开。回看日志发现,那十分钟内服务器返回了大量 5xx,之后自动恢复。每天一次的采样恰好落在恢复之后,所以工具里看不到任何异常。
如果把这个对象的采样间隔改成五分钟,十分钟的异常窗口内至少会命中一到两个采样点,异常就能被记录。但代价是:这个对象一天产生 288 个采样点,而其中 286 个是正常值。如果同时监控几百个对象,数据量会迅速膨胀。
更省的做法是给这个对象加一条事件规则:当 5xx 比例在一分钟内超过某个阈值时记录一次。这样平时不产生数据,异常发生时才落库。但阈值需要先标定,否则可能因为一次正常的重启或发布而误报。这个例子是假设的,用于说明判断方法,不代表任何真实项目的结果。
有时你会看到采样数据突然归零或大幅下降,第一反应可能是“异常被漏掉了”。但归零本身有多种解释:采集端故障、权限变更、对象被删除、上游接口限流,都可能造成同样的现象。采样归零不能单独证明你的采样策略正确或错误,也不能单独证明异常发生过。
合理的下一步是交叉验证:用另一个独立来源(比如服务器日志、另一个监控点)核对同一时间段是否也有异常。如果两个来源都指向同一时间窗口,才更有把握认为异常真实存在。如果只有一个来源归零,优先排查采集链路本身。
选择采样策略时,先明确异常的时间尺度和你的响应速度要求,再决定是提高频率还是改用事件触发。两者都需要你先做小范围验证,而不是一次性改掉全部对象的配置。