如何使用Siddhi实现基于最新事件的时间窗口未收到指定事件的告警
Siddhi 无for语法实现事件缺失告警方案
以下为可直接运行的Siddhi规则实现,完全规避for语法的问题,同时满足所有需求场景:
-- 定义规则启用触发流,用于启动首个时间窗口 define stream AppInitTrigger (triggerType string); -- 规则启用(siddhiAppRuntime启动)时自动生成初始化事件 @info(name = 'init-trigger-generator') from timer:onStartup() select 'app_start' as triggerType insert into AppInitTrigger; -- 核心缺失事件检测逻辑 @info(name = 'missing-event-alert') from every ( -- 计时启动触发条件:规则启用 或 收到符合eid条件的目标事件 startEvent = AppInitTrigger or startEvent = employees[eid == 'E1234'] ) -> ( -- 20秒时间窗口内未收到同eid的匹配事件则触发 not employees[eid == ifThenElse(startEvent.triggerType is null, startEvent.eid, 'E1234')] ) <time:20 sec> select ifThenElse(startEvent.triggerType is null, startEvent.eid, 'E1234') as eid, 'MissingEvent' as alert insert into employees_alerts;
方案优势
- 解决规则禁用再启用失效问题:内置
timer:onStartup()触发器,每次规则启用都会自动触发首个20秒窗口,无需重启服务。 - 解决仅首次生效问题:
every关键字会让每次收到符合条件的目标事件都自动重置计时逻辑,开启全新的20秒窗口,符合窗口始终从最新匹配事件时间点计算的要求。 - 解决告警延迟问题:采用Pattern内置时间约束
<time:20 sec>触发,无需等待滑动窗口的过期事件推送,即便是24小时这类大时间窗口也能准时触发告警,无延迟。
场景验证
完全匹配三类触发场景要求:
- 规则启用时自动启动20秒窗口,无目标事件则直接触发告警。
- 单条目标事件到达后,自动启动20秒窗口,无新事件则告警。
- 连续收到多条目标事件时,自动以最新事件的时间点为起点重置窗口。
你给出的测试用例也可以完全覆盖:emp_event3到达后会自动重置20秒窗口,窗口内无新事件即可正常触发告警。
内容的提问来源于stack exchange,提问作者Madhuri Jain
相关产品推荐
相关产品推荐

