1

我正在尝试将以下自然语言表达式转换为 WSO2 CEP 中的执行计划。

如果与服务关联的 {CPU load, memory load}, {CPU load, storage load} 或 {memory load, storage load} 对之一的平均负载大于或等于 99%,则发送警报.

首先,我指定了以下执行流:

define stream avgCpuLoadStream (service string, avgCpuLoad double);
define stream avgMemoryLoadStream (service string, avgMemoryLoad double);
define stream avgStorageLoadStream (service string, avgStorageLoad double);
define stream alertStream (service string, cause string);

然后,我指定了以下执行计划:

<?xml version="1.0" encoding="UTF-8"?>
<executionPlan name="alertPlan" statistics="enable" trace="enable" xmlns="http://wso2.org/carbon/eventprocessor">
  <description/>
  <siddhiConfiguration>
    <property name="siddhi.persistence.snapshot.time.interval.minutes">0</property>
    <property name="siddhi.enable.distributed.processing">false</property>
  </siddhiConfiguration>
  <importedStreams>
    <stream as="avgCpuLoadStream" name="avgCpuLoadStream" version="1.0.0"/>
    <stream as="avgMemoryLoadStream" name="avgMemoryLoadStream" version="1.0.0"/>
    <stream as="avgStorageLoadStream" name="avgStorageLoadStream" version="1.0.0"/>
  </importedStreams>
  <queryExpressions><![CDATA[
from avgCpuLoadStream[avgCpuLoad >= 99] as c
join avgMemoryLoadStream[avgMemoryLoad >= 99] as m on c.service == m.service
select c.service
insert into alertStream;

from avgCpuLoadStream[avgCpuLoad >= 99] as c
join avgStorageLoadStream[avgStorageLoad >= 99] as s on c.service == s.service
select c.service
insert into alertStream;

from avgMemoryLoadStream[avgMemoryLoad >= 99] as m
join avgStorageLoadStream[avgStorageLoad >= 99] as s on m.service == s.service
select m.service
insert into alertStream;
]]></queryExpressions>
  <exportedStreams>
    <stream name="alertStream" valueOf="alertStream" version="1.0.0"/>
  </exportedStreams>
</executionPlan>

此执行计划会发送有关服务的警报,但不会发送警报的原因。是否有可能在 Siddhi 中为此目的在查询表达式中创建一个新字符串?沿着:

from avgCpuLoadStream[avgCpuLoad >= 99] as c
join avgMemoryLoadStream[avgMemoryLoad >= 99] as m on c.service == m.service
select c.service, "CPU and memory overload" as cause
insert into alertStream;

如果没有,您能否提出替代解决方案?

来自奥斯陆的问候,

亚历山德罗

4

2 回答 2

2

是的,您可以简单地用单引号添加新字符串,如下所示:

from avgCpuLoadStream[avgCpuLoad >= 99] as c
join avgMemoryLoadStream[avgMemoryLoad >= 99] as m on c.service == m.service
select c.service, 'CPU and memory overload' as cause
insert into alertStream;
于 2014-11-27T05:28:10.370 回答
1

您可以在 CEP 中创建自定义函数,该函数返回字符串。

例如:

from avgCpuLoadStream[avgCpuLoad >= 99] as c
join avgMemoryLoadStream[avgMemoryLoad >= 99] as m on c.service == m.service
select c.service, customFunction:alert() as cause
insert into alertStream;

这个解决方案太天真了,但它确实有效。

于 2014-11-28T23:19:33.647 回答