尝试创建Kinesis Analytics查询,以便在流程中的某个步骤耗时太长(或已死亡且未移动)时发出警报。
我有一个包含状态更新的数据流,因为多步骤流程从一步到另一步。我正在尝试编写一个查询,可以确定下一步未在特定时间内(也称为超时)发生的时间。具体来说,我想知道单个ProcessID何时不会从"开始"到"跑步"在5分钟内。
我知道如何在数据库中执行此操作,但是当时间刻度不断移动时会让人感到困惑。非常感谢您提供的任何帮助!
我的活动有三个属性:
ProcessID - 整数
状态 - 字符串("已开始","正在运行"或"已完成")
HappenedOn - 日期时间(例如2017-10-02 15:17:00)
我将如何在数据库(非Kinesis)中执行此操作
在SQL中,我会使用LEFT OUTER JOIN将事件表连接到自身,但无法在实时查询情况下弄清楚如何执行此操作。
#This will show me the start events that don't have a corresponding 'running' event
SELECT * FROM events as F
LEFT OUTER JOIN events as S on F.PROCESSID = S.PROCESSID AND S.STATUS = 'running'
WHERE F.STATUS = 'start' AND S.STATUS IS NULL;
目前在Kinesis中的解决方案
此查询保存并运行,但不能提供我正在寻找的内容。
CREATE OR REPLACE STREAM "DESTINATION_SQL_STREAM" (E1PROCESSID integer,
E1STATUS varchar(7), E1HAPPENED varchar(32), E2PROCESSID integer,
E2STATUS varchar(7), E2HAPPENED varchar(32) );
CREATE OR REPLACE PUMP "STREAM_PUMP" AS INSERT INTO "DESTINATION_SQL_STREAM"
SELECT F.PROCESSID, F.STATUS, F.HAPPENED, S.PROCESSID, S.STATUS, S.HAPPENED
FROM "SOURCE_SQL_STREAM_001" OVER (RANGE INTERVAL '5' MINUTE PRECEDING) AS F
LEFT OUTER JOIN "SOURCE_SQL_STREAM_001" AS S
ON F.PROCESSID = S.PROCESSID AND S.STATUS = 'running'
WHERE F.STATUS = 'start' AND S.STATUS IS NULL;
即使我可以使上述查询起作用,我也需要Kinesis只在HAPPENED值后5分钟查找相应的事件(或缺少它们)(例如,需要在当前日期时间和HAPPENED之间执行DATEDIFF) 。任何关于如何添加这个的建议将不胜感激。
另外,我觉得我需要使用FOLLOWING而不是PRECEDING,但SQL解析器不会让我(我可以看到原因)。我也很困惑哪个流连接添加OVER窗口到... LEFT?对?都?
非常感谢提前。
答案 0 :(得分:0)
您可以通过创建以下规则使用Drools执行此操作:
declare EventA
@role( event )
end
declare EventB
@role( event )
end
rule "Timeout EventA"
when
$a : EventA()
not(exists(EventB(this after[0,5m] $a)))
then
insertLogical(new TimeoutA($a.id));
end
您可以使用this service
创作Drools Kinesis Analytics