【问题标题】:Working on historical data (incrementing properties)处理历史数据(递增属性)
【发布时间】:2018-12-17 07:00:14
【问题描述】:

我正在尝试编写一个 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
    }
}

这是我设法创建的(主要基于this question):

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

【问题讨论】:

    标签: complex-event-processing cumulocity


    【解决方案1】:

    通常,您链接的 esper 文档是查找通用语法的最佳位置。 结合起来,您有时可能还需要有关特定内容的 Cumulocity 文档:http://cumulocity.com/guides/event-language/introduction

    解决您的问题: 您错过了使用实时处理引擎来执行类似 cron 的批处理操作。虽然技术上可以做到,但这可能不是最好的方法,我将向您展示一种您可以采用的不同方法。

    但首先解决你的方法:

    1. 像 findAllAlarmByTimeBetween() 这样的数据库查询最多只能返回 2000 个结果,并且无法像在 Cumulocity 的 REST API 上那样获取下一页。此外,如果您说您只想处理活动警报,则应使用同时过滤状态的功能。
    2. 从 getNumber() 之类的函数中获取 null 意味着未找到 JsonPath 或 dataType 不正确(将 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 的工作:) 我会尝试您的建议,但另一方面,我想我会使用 CEP 设置启动优先级并创建一个微服务来提升它。我担心的是请求的数量,所以我可能需要使用 SmartREST。我会让你知道我的发现。
    • 还有一个问题,我是否认为 CEP 应该只用于实时数据,如果我需要处理历史数据,这适用于微服务。没关系,但是现在如果业务需要新的指标(测量的平均值)会发生什么,我将创建一个规则并部署它。新指标将仅包含在部署规则后创建的测量?为了考虑到较旧的测量,我需要对其进行迭代,例如更改某些字段以触发更新流?
    • 只有实时数据被放入 CEP 流。因此,只有从那时起您部署了某些东西,它才会执行其逻辑。如果您需要历史数据,则需要使用函数进行查询。
    • 但是像 findAllAlarms() 这样的函数可以在像 AlarmCreated 这样的事件范围内使用。你不能这样做:INSERT INTO AlarmUpdate SELECT a.id as id, {"custom": 1} as Fragments FROM findAllAlarms() a,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2012-12-02
    • 2015-10-17
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多