实时检测事件频率的峰值

时间:2011-08-31 19:26:51

标签: events design-patterns frequency outliers

在Web应用程序中,每次事件发生时都会触发一个触发器。我想检测“暴力”频率峰值,这可能转化为异常行为。

我可以想到实现这两点的两种天真的方式:

  • 固定阈值 - “如果一分钟内发生超过500个事件,那可能是错误的”。除非应用程序可以定期调整阈值,否则此方法无法处理平滑的阈值违规或稳定增加流量。

  • 与窗口相关的启发式 - 将窗口划分为N个相等(?)的间隔。当N> 0时,计算[now-(N * interval_length),now now]中发生的事件的频率。将其保存在列表中。将N减少1.重复。检测列表异常值。如果有一个异常值大于[now-window_length,现在]的平均频率,那可能是错误的。“

我想知道是否存在针对此问题的通用/标准解决方案,或者您是否可以考虑任何更高效或更优雅的解决方案。

提前谢谢。

编辑 - 另一个建议

我的一位朋友建议用Holt-Winters预测异常行为检测。您可以在以下链接中找到有关此方法的更多信息:

http://www.hpl.hp.com/news/events/csc/2005/jake_slides.pdf

http://www.usenix.org/events/lisa00/full_papers/brutlag/brutlag_html/

3 个答案:

答案 0 :(得分:1)

我不是专家。我会做什么:

假设您只保留最后n个结果,x_n是最后一个样本(与上一个事件的时差)。

α_n x_n + α_{n-1}/2 x_{n-1} + ... + α_{1} 2^{-n} x_1 = T

如果差异T - T_{previous},其中T_{previous}T的先前值,超过了限制,请执行某些操作。

如果您的x_i值是二进制的,那么如果速度很重要,您可以使用shiftor操作。

答案 1 :(得分:0)

只得到最后X分钟值的简单平均值(保留值)

将每个新传入值与平均值进行比较:

  • 如果差异大于Y%则为其异常值,警告。
  • 如果更少,请将其添加到平均值并删除第一个,fifo样式。

如果您认为可以通过“稳步增加流量”来欺骗,请将X足够大。

答案 2 :(得分:0)

您可以计算指数加权浮点均值估算值,并将其与之前的值进行比较。您可能正在尝试检测突然增加,但结合某个最小阈值(例如0到1并不重要)。

但是说当前浮动平均值从100上升到200,这可能是你想要检测的事件。