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

Posted

技术标签:

【中文标题】如何使用流分析检测任何 IoTHub 设备中是不是未摄取数据?【英文标题】:How to detect if no data ingested in any IoTHub Device using Stream analytics?如何使用流分析检测任何 IoTHub 设备中是否未摄取数据? 【发布时间】:2021-06-10 12:03:38 【问题描述】:

基本上我在 IoTHub 中有多个设备,有 30 个分区。现在,我想使用流分析检测 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

我将非常感谢任何建议或评论。

以下是我试图遵循的参考:

Stream Analytics Common Query Process real-time IoT Data

另一方面,IoTHub 中是否有内置功能可以检测在特定时间段内是否没有摄取数据?

【问题讨论】:

【参考方案1】:

从 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 分钟后,警报停止发出。

【讨论】:

嗨@Eiden,谢谢你,我很感激你的解决方案。但是,我最终创建了一个自定义看门狗来代替监控工作。

以上是关于如何使用流分析检测任何 IoTHub 设备中是不是未摄取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure 流分析中通过 IotHub.ConnectionDeviceId 对延迟函数进行分区?

流分析作业不接收任何输入

如何在 Microsoft Azure 流分析上从多个设备中分离数据

有啥方法可以检查我的流分析输入是不是已经在表中?

PowerBI – 如何设置流式数据报告?

流分析查询以从设备数据中获取 EnqueuedTime device_id