如何使用流分析检测任何 IoTHub 设备中是否没有摄取数据?

问题描述

基本上我在 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 分钟后,警报将停止发出。