告警阈值策略:静态阈值、动态阈值、同比/环比异常检测
阈值策略,说白了就是给系统画一条「红线」。
红线画得太松,告警满天飞,运维兄弟半夜被叫醒,骂娘;画得太紧,系统都崩了告警还没出来,那就更惨了。我在项目中见过太多这种案例了——有一次某大促活动,阈值设得太死,流量稍微一波动就告警,结果真正的故障被淹没在告警海里,等发现时已经晚了半小时。
所以今天咱们聊聊,阈值到底该怎么设。
静态阈值:最简单,也最坑
静态阈值就是固定一个数值。比如CPU使用率超过90%就告警,QPS超过10000就告警。这种策略实现起来最简单,几行代码搞定。
# 静态阈值示例
def check_static_threshold(metric_value, threshold):
if metric_value > threshold:
return Alert("指标超限", f"当前值: {metric_value}, 阈值: {threshold}")
return None
但问题也很明显——业务有高峰低谷,白天和晚上的流量能差好几倍。你想想看,如果凌晨3点QPS到了8000,跟白天下午2点QPS到了8000,意义完全不一样。静态阈值根本区分不了这种场景。
动态阈值:滑动窗口的妙用
动态阈值就聪明多了。它不设死数,而是根据最近一段时间的数据,自动算出一个「合理范围」。
我个人习惯用滑动窗口来做。比如取过去30分钟的数据,算个均值±3倍标准差,超出这个范围就算异常。
import numpy as np
from collections import deque
class SlidingWindowThreshold:
def __init__(self, window_size=30, std_multiplier=3):
self.window = deque(maxlen=window_size)
self.std_multiplier = std_multiplier
def add_value(self, value):
self.window.append(value)
def is_anomaly(self, value):
if len(self.window) < 10: # 数据太少时不判断
return False
mean = np.mean(self.window)
std = np.std(self.window)
upper_bound = mean + self.std_multiplier * std
lower_bound = mean - self.std_multiplier * std
return value > upper_bound or value < lower_bound
嗯,这里要注意——窗口大小很关键。窗口太小,容易跟着毛刺走,误报多;窗口太大,反应迟钝,异常来了半天才检测到。我一般建议窗口大小取「业务周期」的1.5倍。比如业务有明显的小时级周期,窗口就取90分钟。
同比/环比异常检测:更懂业务波动
动态阈值虽然好,但它有个盲区——它只跟「最近」比,不跟「昨天同一时间」比。
举个例子:每天早上10点是业务高峰,QPS从5000飙到15000。动态阈值一看,嗯,比过去30分钟均值高了很多,告警!但这是正常现象啊,每天如此。
这时候就需要同比/环比了。
- 环比:跟上一时刻比。比如当前QPS比5分钟前涨了50%,可能有问题。
- 同比:跟昨天同一时刻比。比如今天10点的QPS比昨天10点低了30%,可能服务出问题了。
# 同比检测示例
def check_yoy_anomaly(current_value, yesterday_value, threshold_ratio=0.3):
if yesterday_value == 0:
return None
change_ratio = abs(current_value - yesterday_value) / yesterday_value
if change_ratio > threshold_ratio:
return Alert("同比异常", f"变化幅度: {change_ratio:.1%}")
return None
三种策略怎么选?一张图说清楚
下面这张图是我自己总结的决策流程,你可以直接拿去用。
组合策略才是王道
说实话,单一策略都有缺陷。我现在的做法是「三层过滤」:
- 第一层:环比检测——秒级响应,抓突发异常。阈值设得松一点,避免误报。
- 第二层:动态阈值——分钟级,抓趋势异常。窗口取30-60分钟。
- 第三层:同比检测——小时级,抓周期异常。跟昨天、上周同一时刻对比。
三层都过了才真正告警。这样误报率能降到5%以下。我在上一家公司就是这么干的,运维团队从天天骂娘变成了偶尔请我喝咖啡。
好了,这一节就聊到这儿。记住,阈值策略没有银弹,关键是要理解你的业务节奏。多观察、多调整,慢慢就能找到那个「刚刚好」的点。
公众号:蓝海资料掘金营,微信deep3321