关于Drools Fusion规则的滑动窗口

时间:2018-08-06 11:37:31

标签: java drools complex-event-processing drools-fusion

我正在开发一个应用程序,其中每5秒通过一个间隔HTTP请求从虚拟机中收集与CPU使用率,内存使用率,磁盘使用率等相关的数据。收集的数据如下所示:

timeStamp (long): 1533554434
memUsagePerc (double): 5.384678498028317
cpuUsagePerc (double): 24.8756219
diskSizePerc (double): 31.880938915483163
diskUtilPerc (double): 1.0505864

我在Drools Fusion上创建了一些规​​则,试图查看以下内容: 例如,在最近10秒内,CPU使用率超过10%时,请在屏幕上打印一些内容,但是我的问题是,即使我将规则over window:time(Xs)放入规则中,即使X seconds尚未通过。这是有关CPU使用率的规则:

declare Netdata
    @role( event )
end
rule "CPU usage over 10%"
    salience -1
    when
        $cpu : Netdata(cpuUsagePerc > 10)
        over window:time (10s)
        from entry-point Netdata
    then
        System.out.println("CPU usage over 10%");
end

Netdata是从HTTP响应收集所有数据并每次创建一个对象的类。然后,该对象由Drools Fusion使用。 请注意,还会触发没有over window:time(Xs)部分的更“虚拟”规则。另外,屏幕上over window:time(Xs)旁边出现以下错误:JAVA_IDENTIFIER expected, got 'window'

我正在使用Drools 5.1.1。版本。

1 个答案:

答案 0 :(得分:1)

这是关于滑动窗口的常见误解。它们不是固定的,会滑动。这意味着即使t

据我所知,您尝试执行的操作没有开箱即用的支持。我过去所做的是手动创建一个“存储桶”事实来收集事件,然后使用这些存储桶而不是单个事件来编写规则。


在OP评论后进行编辑。

有关Drools中滑动Windows的一些说明:

  • Drools中的时间滑动Windows不会等待射击之前配置的任何大小。例如,window:time (10s)之类的窗口应解释为0s <= t <= 10s。如果您每隔1秒就有一次事件发生,则窗口将在t=1t=2t=3,...,t=n处执行。
  • 在Drools中滑动窗口不是离散的。它们不是固定的时间/大小桶。例如,假设我们有一个定时窗口:window:time (3s)。并假设每隔1秒就有一次事件(e)到来。该窗口将如下执行:t(1):[e1]t(2):[e1,e2]t(3):[e1,e2,e3]t(4):[e2,e3,e4]t(5):[e3,e4,e5]。如您所见,该窗口将在t(3)之后开始“滑动”。

如果要分析离散的事件“桶”,则需要自己创建该机制。对于Drools不支持这种窗口,这对我来说也很奇怪,但是显然它们不如滑动窗口那么普遍。

希望有帮助,