Azure IoT 中心操作监控
Azure IoT Hub Operations Monitoring
我有一个连接设备的 Azure IoT 中心。我想启用监控以监控与集线器连接和断开连接的设备。
我在我的 Iot 中心的监控类别中启用了 Verbose on Connections:
我的设备连接到我的集线器并显示在设备资源管理器中:
然后我设置了一个 Azure 函数来将我的数据从操作监控记录到 Azure SQL db:
using System;
using System.Configuration;
using System.Data.SqlClient;
using Newtonsoft.Json;
public static void Run(string myEventHubMessage, TraceWriter log)
{
log.Info(myEventHubMessage);
try
{
var connectionString = ConfigurationManager.ConnectionStrings["iotAzureSQLDb"].ConnectionString;
log.Info(connectionString);
var message = JsonConvert.DeserializeObject<MonitoringMessage>(myEventHubMessage);
using (var connection = new SqlConnection(connectionString))
{
var sqlStatement = "insert into [dbo].[DeviceStatuses] " +
"(DeviceId, ConnectionStatus, ConnectionUpdateTime)" +
"values " +
"(@DeviceId, @ConnectionStatus, @ConnectionUpdateTime)";
using (var dataCommand = new SqlCommand(sqlStatement, connection))
{
dataCommand.Parameters.AddWithValue("@ConnectionStatus", message.operationName);
dataCommand.Parameters.AddWithValue("@DeviceId", message.deviceId);
dataCommand.Parameters.AddWithValue("@ConnectionUpdateTime", message.time);
connection.Open();
dataCommand.ExecuteNonQuery();
connection.Close();
log.Info($"Device {message.deviceId} changed state: {message.operationName}");
}
}
}
catch (Exception ex)
{
log.Info(ex.Message);
}
}
public class MonitoringMessage
{
public string deviceId { get; set; }
public string operationName { get; set; }
public int? durationMs { get; set; }
public string authType { get; set; }
public string protocol { get; set; }
public DateTimeOffset? time { get; set; }
public string category { get; set; }
public string level { get; set; }
public int? statusCode { get; set; }
public int? statusType { get; set; }
public string statusDescription { get; set; }
}
如果我在操作监控中启用设备标识操作,我会记录创建事件。所以我相信函数的输入是正确的。但是,没有为 Connections 创建任何内容???
我也可以很好地向我连接的设备发送消息。我只是没有看到连接/断开连接的事件。
我还尝试创建一个流分析并对输入进行采样一段时间,我知道我有连接/断开连接但没有找到任何东西。
我已通过在开发环境中强制我的设备通过 MQTT 连接来解决此问题,现在我看到它正在连接和断开连接。
很遗憾,我无法在生产环境中使用 MQTT。
有谁知道连接/断开事件是否仅在 MQTT 而非 AMQP 中才有可能?
如果您只想获取设备连接状态,请改用 REST。
https://docs.microsoft.com/en-us/rest/api/iothub/deviceapi#DeviceApi_GetDevices
另外,这里有一个在线工具可以监控设备连接状态。
我们发明了数据流来确定"device state"。我们创建了一个流分析作业,连接到 Operations monitoring
(即 IOT 输入定义中的 Endpoint
类型)。我们有流分析查询 SELECT INTO
ServiceBus 队列。我们有一个 WebJob 处理队列并更新持久存储(SQL Table,Azure Table,你的选择),我们在其中记下状态。 UI(或 WebAPI 控制器)然后可以检查该持久存储。
到目前为止,我们已将所有 Monitoring categories
(在 IOT 中心门户边栏选项卡中)设置为 Verbose
,但稍后可能会调低它。
我们确实得到了数据。
我有一个连接设备的 Azure IoT 中心。我想启用监控以监控与集线器连接和断开连接的设备。
我在我的 Iot 中心的监控类别中启用了 Verbose on Connections:
我的设备连接到我的集线器并显示在设备资源管理器中:
然后我设置了一个 Azure 函数来将我的数据从操作监控记录到 Azure SQL db:
using System;
using System.Configuration;
using System.Data.SqlClient;
using Newtonsoft.Json;
public static void Run(string myEventHubMessage, TraceWriter log)
{
log.Info(myEventHubMessage);
try
{
var connectionString = ConfigurationManager.ConnectionStrings["iotAzureSQLDb"].ConnectionString;
log.Info(connectionString);
var message = JsonConvert.DeserializeObject<MonitoringMessage>(myEventHubMessage);
using (var connection = new SqlConnection(connectionString))
{
var sqlStatement = "insert into [dbo].[DeviceStatuses] " +
"(DeviceId, ConnectionStatus, ConnectionUpdateTime)" +
"values " +
"(@DeviceId, @ConnectionStatus, @ConnectionUpdateTime)";
using (var dataCommand = new SqlCommand(sqlStatement, connection))
{
dataCommand.Parameters.AddWithValue("@ConnectionStatus", message.operationName);
dataCommand.Parameters.AddWithValue("@DeviceId", message.deviceId);
dataCommand.Parameters.AddWithValue("@ConnectionUpdateTime", message.time);
connection.Open();
dataCommand.ExecuteNonQuery();
connection.Close();
log.Info($"Device {message.deviceId} changed state: {message.operationName}");
}
}
}
catch (Exception ex)
{
log.Info(ex.Message);
}
}
public class MonitoringMessage
{
public string deviceId { get; set; }
public string operationName { get; set; }
public int? durationMs { get; set; }
public string authType { get; set; }
public string protocol { get; set; }
public DateTimeOffset? time { get; set; }
public string category { get; set; }
public string level { get; set; }
public int? statusCode { get; set; }
public int? statusType { get; set; }
public string statusDescription { get; set; }
}
如果我在操作监控中启用设备标识操作,我会记录创建事件。所以我相信函数的输入是正确的。但是,没有为 Connections 创建任何内容???
我也可以很好地向我连接的设备发送消息。我只是没有看到连接/断开连接的事件。
我还尝试创建一个流分析并对输入进行采样一段时间,我知道我有连接/断开连接但没有找到任何东西。
我已通过在开发环境中强制我的设备通过 MQTT 连接来解决此问题,现在我看到它正在连接和断开连接。
很遗憾,我无法在生产环境中使用 MQTT。
有谁知道连接/断开事件是否仅在 MQTT 而非 AMQP 中才有可能?
如果您只想获取设备连接状态,请改用 REST。
https://docs.microsoft.com/en-us/rest/api/iothub/deviceapi#DeviceApi_GetDevices
另外,这里有一个在线工具可以监控设备连接状态。
我们发明了数据流来确定"device state"。我们创建了一个流分析作业,连接到 Operations monitoring
(即 IOT 输入定义中的 Endpoint
类型)。我们有流分析查询 SELECT INTO
ServiceBus 队列。我们有一个 WebJob 处理队列并更新持久存储(SQL Table,Azure Table,你的选择),我们在其中记下状态。 UI(或 WebAPI 控制器)然后可以检查该持久存储。
到目前为止,我们已将所有 Monitoring categories
(在 IOT 中心门户边栏选项卡中)设置为 Verbose
,但稍后可能会调低它。
我们确实得到了数据。