我正在开发一个应用程序,其中每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。版本。
答案 0 :(得分:1)
这是关于滑动窗口的常见误解。它们不是固定的,会滑动。这意味着即使t 据我所知,您尝试执行的操作没有开箱即用的支持。我过去所做的是手动创建一个“存储桶”事实来收集事件,然后使用这些存储桶而不是单个事件来编写规则。 在OP评论后进行编辑。 有关Drools中滑动Windows的一些说明: 如果要分析离散的事件“桶”,则需要自己创建该机制。对于Drools不支持这种窗口,这对我来说也很奇怪,但是显然它们不如滑动窗口那么普遍。 希望有帮助,
window:time (10s)
之类的窗口应解释为0s <= t <= 10s
。如果您每隔1秒就有一次事件发生,则窗口将在t=1
,t=2
,t=3
,...,t=n
处执行。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)
之后开始“滑动”。