在 Drools Fusion 规则上滑动 window

Sliding window on Drools Fusion rules

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

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

我在 Drools Fusion 上创建了一些规​​则,试图查看以下内容: 当 CPU 使用率在最后 10 秒内达到例如超过 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是class,它从HTTP响应中收集所有数据,每次都创建一个对象。然后 Drools Fusion 使用该对象。 请注意,没有 over window:time(Xs) 部分的 more "dummy" 规则也会被触发。此外,屏幕上会出现以下错误,在 over window:time(Xs) 旁边:JAVA_IDENTIFIER expected, got 'window'

我正在使用 Drools 版本 5.1.1。

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

也会触发它们

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


OP评论后编辑。

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

  • Drools 中的时间滑动 Windows 不会等待它们在触发前配置的任何大小。例如 window 像 window:time (10s) 应该被解释为 0s <= t <= 10s。如果每 1 秒发生一次事件,window 将在 t=1t=2t=3、...、t=n.[=42= 执行]
  • Drools 中的滑动 Windows 不是离散的。它们不是 time/size 的固定桶。例如,假设我们有这个时间window:window:time (3s)。假设我们每 1 秒发生一次事件 (e)。 window 将按如下方式执行:t(1):[e1]t(2):[e1,e2]t(3):[e1,e2,e3]t(4):[e2,e3,e4]t(5):[e3,e4,e5]。如您所见,window 将在 t(3) 之后开始 "sliding"。

如果您想要分析离散的 "buckets" 事件,那么您需要自己创建该机制。 Drools 不支持这种 windows 对我来说也很奇怪,但显然它们不像滑动那样常见。

希望对您有所帮助,