Скользящее окно правил Drools Fusion

Я делаю приложение, в котором данные виртуальной машины, относящиеся к использованию ЦП, использованию памяти, использованию диска и т. д., собираются с помощью интервального HTTP-запроса каждые 5 секунд. Собранные данные выглядят так:

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

Я создал несколько правил в Drools Fusion, пытаясь увидеть следующее: когда загрузка ЦП достигает, например, более 10% за последние 10 секунд, затем напечатайте что-нибудь на экране, но моя проблема в том, что даже если я вставил в правило команду over window:time(Xs) правило по-прежнему срабатывает, хотя X seconds еще не пройдено. Вот правило использования процессора:

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.


person csymvoul    schedule 06.08.2018    source источник
comment
Вы исправили сообщение JAVA_IDENTIFIER expected, got 'window' в среде IDE?   -  person Galya    schedule 10.12.2019


Ответы (1)


Это распространенное заблуждение о раздвижных окнах. Они не закреплены, они скользят. Это означает, что они будут срабатывать даже при t ‹ x.

Насколько я знаю, нет готовой поддержки того, что вы пытаетесь сделать. Что я делал в прошлом, так это вручную создавал факт «корзины» для сбора событий, а затем писал правила, используя эти корзины вместо отдельных событий.


Редактировать после комментария ОП.

Некоторые пояснения о скользящих окнах в Drools:

  • Time Sliding Windows в Drools не будет ждать, какой бы размер они ни были настроены, прежде чем запускать. Например, такое окно, как window:time (10s), должно интерпретироваться как 0s <= t <= 10s. Если у вас есть события, приходящие каждые 1 с, окно будет выполняться в t=1, t=2, t=3, ..., t=n.
  • Раздвижные окна в Drools не являются дискретными. Они не являются фиксированными сегментами времени/размера. В качестве примера предположим, что у нас есть временное окно: window:time (3s). И давайте предположим, что у нас есть события (e), происходящие каждую 1 секунду. Окно будет выполнено следующим образом: 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 не поддерживает такие окна, но, видимо, они не так распространены, как раздвижные.

Надеюсь, поможет,

person Esteban Aliverti    schedule 06.08.2018
comment
Я не совсем понял твое предложение. Мой вопрос, возможно, был недостаточно ясен, поэтому я перефразирую его. Я собираю данные каждые 5 секунд и хочу, чтобы правило запускалось (приведенное выше правило) только и только в том случае, если загрузка ЦП превышает 10% в течение последних 10 секунд, поэтому, если последние два собранных данных показывают, что ЦП превышает 10 %, а не каждый раз, когда загрузка ЦП превышает 10%. Вы предлагаете сделать это за пределами правила (ведра), а затем запустить правило? Если Drools не может этого сделать, какой смысл вообще его использовать? Я имею в виду, что то, что я спрашиваю, звучит довольно просто для механизма правил в моей голове :/ - person csymvoul; 06.08.2018
comment
Большое спасибо за Ваш ответ. Оказывается, ты прав. Я не могу сделать это с тем, что предлагает Drools Fusion, поэтому я последовал вашему совету и создал корзину в качестве обходного пути, и она работает правильно. - person csymvoul; 07.08.2018