处理历史数据(递增属性)
Working on historical data (incrementing properties)
我正在尝试编写一个 CEP 规则,该规则将采用所有现有的 ACTIVE 警报并每分钟将特定片段 bike_alarm.priority 增加 1。这是警报的整个结构:
{
"count": 1,
"creationTime": "2018-07-09T15:30:20.790+02:00",
"time": "2014-03-03T12:03:27.845Z",
"history": {
"auditRecords": [],
"self": "https://cumulocity.com/audit/auditRecords"
},
"id": "1024",
"self": "https://cumulocity.com/alarm/alarms/1024",
"severity": "WARNING",
"source": {
"id": "22022",
"name": "01BIKE_STATION_NORTH",
"self": "https://cumulocity.com/inventory/managedObjects/22022"
},
"status": "ACTIVE",
"text": "Bike disconnected",
"type": "bike_error_01",
"bike_alarm" {
"priority": 10
}
}
这是我设法创建的(主要基于):
create schema Alarm as Alarm;
create schema CollectedAlarms(
alarms List
);
create schema SingleAlarm(
alarm Alarm
);
@Name("Collecting alarms")
insert into CollectedAlarms
select findAllAlarmByTimeBetween(
current_timestamp().minus(100 day).toDate(),
current_timestamp().toDate()
) as alarms
from pattern[every timer:interval(30 sec)];
@Name("Splitting alarms")
insert into SingleAlarm
select
singleAlarm as alarm
from
CollectedAlarms as alarms unidirectional,
CollectedAlarms[alarms@type(Alarm)] as singleAlarm;
@Name("Rising priority")
insert into UpdateAlarm
select
sa.alarm.id as id,
{
"bike_alarm.priority", GetNumber(sa.alarm, "bike_alarm.priority". 0) + 1
} as fragments
from pattern [every sa = SingleAlarm -> (timer:interval(1 minutes))];
问题是不是所有的告警都成立,即使是递增的告警也不行,优先级设置为null。
此外,您能指点我一些更好的文档吗?是this something you use?
一般来说,您链接的 esper 文档是查找通用语法的最佳位置。
结合起来,您有时可能还需要特定内容的 Cumulocity 文档:http://cumulocity.com/guides/event-language/introduction
解决您的问题:
您错过了使用实时处理引擎来执行类似 cron 的批处理操作。虽然这在技术上是可以做到的,但这可能不是最好的方法,我将向您展示一种您可以采用的不同方法。
但首先解决你的方法:
- 像 findAllAlarmByTimeBetween() 这样的数据库查询只会 return 最多 2000 个结果,并且无法像 Cumulocity 的 REST API 那样获取下一页。另外,如果你说你只想处理活动警报,你应该使用一个也过滤状态的函数。
- 从像 getNumber() 这样的函数中获取 null 意味着找不到 JsonPath 或数据类型不正确(对 String 使用 getNumber)。您可以为该案例设置一个默认值作为第三个参数。不过,从您 Json 看来,您提供的内容看起来是正确的。您的代码中的语法错误是我假设的复制粘贴错误,否则您将无法部署它。
在我看来,您应该以不同的方式处理:
对于每个传入的警报,如果尚未清除,则在一分钟后提高优先级。另外再次触发 1 分钟计时器。一直循环到报警解除
这个的模式是这样的:
from pattern [
every e = AlarmCreated(alarm.status = CumulocityAlarmStatuses.ACTIVE)
-> (timer:interval(1 minutes)
and not AlarmUpdated(alarm.status != CumulocityAlarmStatuses.ACTIVE, alarm.id.value = e.alarm.id.value))
];
您需要一个带有 AlarmCreated 的语句,它将仅涵盖初始增加和第二个触发您自己的模式的语句,然后 运行 进入循环。
通常尽量避免调用数据库。因此,请将循环计数器保留在您的模式中,这样您只需要始终执行警报的更新调用即可。
我正在尝试编写一个 CEP 规则,该规则将采用所有现有的 ACTIVE 警报并每分钟将特定片段 bike_alarm.priority 增加 1。这是警报的整个结构:
{
"count": 1,
"creationTime": "2018-07-09T15:30:20.790+02:00",
"time": "2014-03-03T12:03:27.845Z",
"history": {
"auditRecords": [],
"self": "https://cumulocity.com/audit/auditRecords"
},
"id": "1024",
"self": "https://cumulocity.com/alarm/alarms/1024",
"severity": "WARNING",
"source": {
"id": "22022",
"name": "01BIKE_STATION_NORTH",
"self": "https://cumulocity.com/inventory/managedObjects/22022"
},
"status": "ACTIVE",
"text": "Bike disconnected",
"type": "bike_error_01",
"bike_alarm" {
"priority": 10
}
}
这是我设法创建的(主要基于
create schema Alarm as Alarm;
create schema CollectedAlarms(
alarms List
);
create schema SingleAlarm(
alarm Alarm
);
@Name("Collecting alarms")
insert into CollectedAlarms
select findAllAlarmByTimeBetween(
current_timestamp().minus(100 day).toDate(),
current_timestamp().toDate()
) as alarms
from pattern[every timer:interval(30 sec)];
@Name("Splitting alarms")
insert into SingleAlarm
select
singleAlarm as alarm
from
CollectedAlarms as alarms unidirectional,
CollectedAlarms[alarms@type(Alarm)] as singleAlarm;
@Name("Rising priority")
insert into UpdateAlarm
select
sa.alarm.id as id,
{
"bike_alarm.priority", GetNumber(sa.alarm, "bike_alarm.priority". 0) + 1
} as fragments
from pattern [every sa = SingleAlarm -> (timer:interval(1 minutes))];
问题是不是所有的告警都成立,即使是递增的告警也不行,优先级设置为null。
此外,您能指点我一些更好的文档吗?是this something you use?
一般来说,您链接的 esper 文档是查找通用语法的最佳位置。 结合起来,您有时可能还需要特定内容的 Cumulocity 文档:http://cumulocity.com/guides/event-language/introduction
解决您的问题: 您错过了使用实时处理引擎来执行类似 cron 的批处理操作。虽然这在技术上是可以做到的,但这可能不是最好的方法,我将向您展示一种您可以采用的不同方法。
但首先解决你的方法:
- 像 findAllAlarmByTimeBetween() 这样的数据库查询只会 return 最多 2000 个结果,并且无法像 Cumulocity 的 REST API 那样获取下一页。另外,如果你说你只想处理活动警报,你应该使用一个也过滤状态的函数。
- 从像 getNumber() 这样的函数中获取 null 意味着找不到 JsonPath 或数据类型不正确(对 String 使用 getNumber)。您可以为该案例设置一个默认值作为第三个参数。不过,从您 Json 看来,您提供的内容看起来是正确的。您的代码中的语法错误是我假设的复制粘贴错误,否则您将无法部署它。
在我看来,您应该以不同的方式处理: 对于每个传入的警报,如果尚未清除,则在一分钟后提高优先级。另外再次触发 1 分钟计时器。一直循环到报警解除
这个的模式是这样的:
from pattern [
every e = AlarmCreated(alarm.status = CumulocityAlarmStatuses.ACTIVE)
-> (timer:interval(1 minutes)
and not AlarmUpdated(alarm.status != CumulocityAlarmStatuses.ACTIVE, alarm.id.value = e.alarm.id.value))
];
您需要一个带有 AlarmCreated 的语句,它将仅涵盖初始增加和第二个触发您自己的模式的语句,然后 运行 进入循环。
通常尽量避免调用数据库。因此,请将循环计数器保留在您的模式中,这样您只需要始终执行警报的更新调用即可。