问题描述
基本上我在 IoTHub 中有多个设备,有 30 个分区。现在,我想使用 Stream Analytics 检测 10 分钟后是否没有数据被摄取到任何设备。检测到后,我想选择它是什么设备并将该信息发送到 Azure 功能以进行警报。
鉴于我是流分析的新手,该查询有点棘手。这是我目前想到的结果,但结果似乎不是我所期望的。
SELECT
t1.[IoTHub].[Connectiondeviceid] as deviceid
INTO
[NoDataAlertFunctionOutput]
FROM
[iot-hub-data-flow] t1 TIMESTAMP BY Timestamp
LEFT OUTER JOIN [iot-hub-data-flow] t2 TIMESTAMP BY Timestamp
ON
t1.[IoTHub].[Connectiondeviceid]=t2.[IoTHub].[Connectiondeviceid]
AND
DATEDIFF(minute,t1,t2) BETWEEN 1 and 10
WHERE t2.[IoTHub].[Connectiondeviceid] IS NULL
我将不胜感激任何建议或评论。
以下是我尝试遵循的参考资料:
另一方面,IoTHub 中是否有内置功能来检测在特定时间段内是否没有摄取数据?
解决方法
从 ASA 的角度来看,我会尝试使用 this pattern。我不能 100% 确定它会检查您的所有要求,但我认为这是一个值得探索的有趣方向。
- 使用 hopping window,我们每分钟扫描最后 20 个
- 首先我们去寻找那个窗口中的最后一个事件
- 然后我们检查是否已发送超过 10 分钟
WITH CTE AS (
SELECT
System.Timestamp() AS Window_end,DATEADD(minute,-10,System.Timestamp()) AS Window_10,TopOne() OVER (ORDER BY Timestamp DESC) AS Last_event
FROM
[iot-hub-data-flow] t TIMESTAMP BY Timestamp
GROUP BY
HOPPINGWINDOW(minute,20,1)
-- Every 1 minute,check the last 20 minutes
)
SELECT
Last_event.DevideId
FROM CTE
WHERE Last_event.Timestamp < Window_10
请注意,20 分钟后,警报将停止发出。