监视、诊断和排查 Azure IoT 中心设备连接问题

由于存在许多可能的故障点,IoT 设备的连接问题有时很难排查。 应用程序逻辑、物理网络、协议、硬件、IoT 中心和其他云服务都可能导致问题。 检测和查明问题根源的能力至关重要。 但是,大规模的 IoT 解决方案可能有数千台设备,因此,手动检查各个设备是不切实际的。 IoT 中心集成了两项 Azure 服务以提供帮助:

  • Azure Monitor:使用 Azure Monitor 可以从 IoT 中心收集遥测数据并对其进行分析和处理。 为了帮助你大规模检测、诊断和排查这些问题,请使用 IoT 中心通过 Azure Monitor 提供的监视功能。 这包括设置警报以在连接断开时触发通知和操作,并包括配置日志以便用于查明导致连接断开的情况。

  • Azure 事件网格 - 对于关键基础结构和每设备断开连接,请使用 Azure 事件网格来订阅 IoT 中心发出的设备连接和断开连接事件。 借助 Azure 事件网格,可以使用以下任何事件处理程序:

    • Azure Functions
    • 逻辑应用
    • Azure 自动化
    • WebHook
    • 队列存储
    • 混合连接
    • 事件中心

事件网格与Azure Monitor

事件网格提供了一个低延迟、每设备监视解决方案,可用于跟踪关键设备和基础结构的设备连接。 Azure Monitor 提供了一个名为“连接的设备数”的指标,可用于监视连接到 IoT 中心的设备数,并在连接的设备数低于静态阈值时触发警报。

决定对特定方案使用事件网格还是 Azure Monitor 时,请考虑以下事项:

  • 警报延迟:通过事件网格传递 IoT 中心连接事件的速度要快得多。 对于需要快速通知的方案,这使得事件网格成为更好的选择。

  • 每设备通知:事件网格提供了跟踪各个设备的连接和断开连接的功能。 对于需要监视关键设备的连接的方案,这使得事件网格成为更好的选择。

  • 轻型设置:Azure Monitor 指标警报提供了一种轻型设置体验,无需与其他服务集成即可通过电子邮件、短信、语音和其他通知传递通知。 使用事件网格,需要与其他 Azure 服务集成才能传递通知。 这两项服务都可与其他服务集成来触发更复杂的操作。

事件网格:监视连接和断开连接事件

若要监视生产环境中的设备连接和断开连接事件,我们建议订阅事件网格中的 DeviceConnected 和 DeviceDisconnected 事件以触发警报并监视设备连接状态 。 与 Azure Monitor 相比,事件网格的事件延迟较低,并且可以按设备进行监视。 这些因素使事件网格成为监视关键设备和基础结构的首选方法。

使用事件网格监视或触发有关设备断开连接的警报时,请确保在使用 Azure IoT SDK 的设备上以筛选掉定期断开连接(SAS 令牌续订所导致)的方式进行生成。 若要了解详细信息,请参阅 Azure IoT SDK 的 MQTT 设备断开连接行为

浏览以下文章,详细了解如何使用事件网格监视设备连接事件:

Azure Monitor:将连接事件路由到日志

IoT 中心持续发出多类操作的资源日志。 不过,若要收集此日志数据,需要创建一个诊断设置,以将日志路由到可对其进行分析或存档的目标。 其中一个目标是通过 Log Analytics 工作区的 Azure Monitor 日志(请参阅定价),可在其中使用 Kusto 查询来分析数据。

IoT 中心资源日志连接类别发出与设备连接有关的操作和错误。 以下屏幕截图显示了将这些日志路由到 Log Analytics 工作区的诊断设置:

Recommended setting to send connectivity logs to Log Analytics workspace.

建议在创建 IoT 中心后尽早创建诊断设置,因为尽管 IoT 中心始终会发出资源日志,但在将日志路由到目标之前,Azure Monitor 不会收集这些日志。

若要详细了解如何将日志路由到目标,请参阅路由。 有关创建诊断设置的详细说明,请参阅使用指标和日志教程

Azure Monitor:针对设备断开连接设置指标警报

可根据 IoT 中心发出的平台指标设置警报。 通过指标警报,你可通知用户他们关注的情况已发生,还可触发可自动响应该情况的操作。

连接的设备数(预览版)指标会告诉你有多少设备已连接到 IoT 中心。 可创建在此指标低于阈值时触发的警报:

Alert logic settings for connected devices metric.

可使用指标警报规则大规模地监视设备断开连接异常情况。 即,使用警报来确定何时有大量设备意外断开连接。 如果检测到这种情况,你可以查看日志以帮助排查问题。 但是,若要近实时地监视每台设备的断开连接和关键设备的断开连接,必须使用事件网格。

若要详细了解 IoT 中心的警报,请参阅 Monitor IoT 中心中的警报。 有关在 IoT 中心创建警报的演练,请参阅使用指标和日志教程。 有关警报的更详细概述,请参阅 Azure Monitor 文档中的 Azure 中的警报概述

Azure Monitor:使用日志解决连接错误

使用 Azure Monitor 指标警报或事件网格检测到设备断开连接时,可以使用日志来帮助排查原因。 本部分介绍了如何在 Azure Monitor 日志中查找常见问题。 以下步骤假定你已创建可将 IoT 中心连接日志发送到 Log Analytics 工作区的诊断设置

创建可将 IoT 中心资源日志发送到 Azure Monitor 日志的诊断设置后,请按照以下步骤在 Azure 门户中查看日志。

  1. Azure 门户中导航到 IoT 中心。

  2. 在 IoT 中心左侧窗格中的“监视”下,选择“日志” 。

  3. 若要隔离 IoT 中心的连接错误日志,请在查询编辑器中输入以下查询,然后选择“运行”:

    AzureDiagnostics
    | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. 如果返回了结果,请查看 OperationNameResultType(错误代码)和 ResultDescription(错误消息),以获取更多详细信息。

    Example of error log

使用以下问题解决指南来帮助解决错误:

Azure Monitor:使用日志监视特定设备的连接

在某些情况下,你可能想要使用 Azure Monitor 查看特定设备的连接错误和信息。 若要隔离设备的连接事件,可以执行上一部分中的相同步骤,但输入以下查询。 将 test-device 替换为设备的名称。

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend DeviceId = tostring(parse_json(properties_s).deviceId)
| where DeviceId == "test-device"

该查询将返回目标设备的错误和信息性事件。 以下示例输出显示了信息性 deviceConnect 事件:

Screenshot of deviceConnect event in logs.

Azure IoT SDK 的 MQTT 设备断开连接行为

Azure IoT 设备 SDK 与 IoT 中心断开连接,然后在通过 MQTT(以及基于 WebSocket 的 MQTT)协议续订 SAS 令牌时重新连接。 在日志中,这将显示为信息性设备断开连接和连接事件,有时还伴随错误事件。

默认情况下,所有 SDK 的令牌有效期为 60 分钟;但是在某些 SDK 中,其令牌有效期可由开发人员进行更改。 下表总结了各个 SDK 的令牌有效期、令牌续订和令牌续订行为:

SDK 令牌有效期 令牌续订 续订行为
.NET 60 分钟,可配置 85% 的有效期,可配置 在令牌有效期结束并加上 10 分钟宽限期后,SDK 将断开连接,再重新连接。 信息性事件和错误在日志中生成。
Java 60 分钟,可配置 85% 的有效期,不可配置 在令牌有效期结束并加上 10 分钟宽限期后,SDK 将断开连接,再重新连接。 信息性事件和错误在日志中生成。
Node.js 60 分钟,可配置 可配置 在令牌续订时,SDK 将断开连接,再重新连接。 日志中仅生成信息性事件。
Python 60 分钟,可配置 过期前的 120 秒 在令牌有效期结束时,SDK 将断开连接,再重新连接。

以下屏幕截图显示不同 SDK 的 Azure Monitor 日志中的令牌续订行为。 如前所述,令牌有效期和续订阈值已更改了默认值。

  • .NET 设备 SDK 的令牌有效期为 1200 秒(20 分钟),其续订设置在 90% 的有效期时进行。 每隔 30 分钟断开连接一次:

    Error behavior for token renewal over MQTT in Azure Monitor Logs with .NET SDK.

  • Java SDK 的令牌有效期为 300 秒(5 分钟),并且续订默认在 85% 的有效期时进行。 每隔 15 分钟断开连接一次:

    Error behavior for token renewal over MQTT in Azure Monitor Logs with Java SDK.

  • Node SDK 的令牌有效期为 300 秒(5 分钟),并且令牌续订设置在 3 分钟时进行。 令牌续订时会断开连接。 而且,没有错误,只发出信息性连接/断开连接事件:

    Error behavior for token renewal over MQTT in Azure Monitor Logs with Node SDK.

使用以下查询收集结果。 查询会从属性包中提取 SDK 名称和版本。 有关详细信息,请参阅 IoT 中心日志中的 SDK 版本

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend parsed_json = parse_json(properties_s)
| extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId) , Protocol =  tostring(parsed_json.protocol)
| distinct TimeGenerated, OperationName, Level, ResultType, ResultDescription, DeviceId, Protocol, SDKVersion

作为 IoT 解决方案开发人员或操作员,需要注意此行为,以便解释连接/断开连接事件以及日志中的相关错误。 如果要更改设备的令牌有效期或续订行为,请检查设备是否实现了设备孪生设置或实现此功能的设备方法。

如果使用事件中心监视设备连接,请确保以筛选出定期断开连接(SAS 令牌续订所导致)的方式进行生成。 例如,只要在发生断开连接事件后,接着在特定时间范围内发生连接事件,就不要基于断开连接来触发操作。

注意

IoT 中心仅支持每个设备一个活动 MQTT 连接。 代表相同设备 ID 的任何新 MQTT 连接都会导致 IoT 中心删除现有连接。

400027 ConnectionForcefullyClosedOnNewConnection 将记录到 IoT 中心日志中

我尝试了这些步骤,但没有奏效

如果前面的步骤没有帮助,可尝试以下操作:

后续步骤