编辑 添加信息
原本这只是一个通用的算法,不关注语言/平台。然而我将自己回答这个问题,并且答案实际上与正在使用的工具有关。
这是针对在IBM主机下z/OS上使用Ops/MVS自动化工具运行REXX脚本进行事件检测的,所以发布的答案可能适用于Python、Perl、bash、Java等各种语言;只是这种产品在这种特定情况下有一个特定的功能可以解决问题。
添加信息结束
我的问题与以下问题非常相似:
这将是一个答案:
这可以通过移动平均实现。取您的最后N个事件,其中N是您平均窗口的大小。计算这些N个事件之间的时间差。如果您以秒为单位测量并希望以分钟为单位获得速率,则应将60秒除以以秒表示的时间差,然后乘以N-1。
但我想避免存储有关先前事件的信息。我只对平均移动速率是否超过阈值感兴趣,因此不关注速率趋势。
例如,我想知道是否每分钟有3次以上的事件。以下是我的第一种方法:
- 当第一个事件发生时,我创建一个计数器,记录开始时间。
- 当另一个事件发生时,我增加计数并根据计数和经过的时间计算速率。
- 如果速率超过允许的值,则生成警报。
我意识到这不起作用,因为如果您在一周前有一个事件,然后直到最近一分钟内出现10个事件,平均速率是一周内的11个,即3.6/天,而不是当前速率为10个/分钟。
所以我想尝试以下内容:
- 当第一个事件发生时,我创建一个计数器,记录开始时间。
- 当另一个事件发生时,如果自上一个事件以来的时间超过我想要测量速率的间隔(在我的例子中为1分钟),我有效地丢弃先前的事件,并将计数器设置为1,将当前时间记录为新的开始时间(因为如果自上一个事件以来已经超过了1分钟,速率不能超过x/min,对吧?)
- 如果自上一个事件以来的时间没有超过监测间隔,则增加计数并从计数和经过的时间计算速率。
- 如果速率超过允许的值,则生成警报。
这似乎很简单,但SO上的其他帖子(特别是这个问题:使用指数平滑和不规则事件估算事件发生率以及它的被接受的答案:https://dev59.com/jmAg5IYBdhLWcg3waKZ2#23617678)似乎暗示着比我想象中更复杂。