在 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=1
、t=2
、t=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 对我来说也很奇怪,但显然它们不像滑动那样常见。
希望对您有所帮助,
我正在制作一个应用程序,其中通过每隔 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=1
、t=2
、t=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 对我来说也很奇怪,但显然它们不像滑动那样常见。
希望对您有所帮助,