監視 Azure IoT 中樞

當您有依賴 Azure 資源的重要應用程式和商務程序時,您會想要監視這些資源的可用性、效能和操作。 本文說明 Azure IoT 中樞 所產生的監視數據,以及如何使用 Azure 監視器的功能來分析及警示此數據。

監視器概觀

每個 IoT 中樞 Azure 入口網站 的 [概觀] 頁面包含提供一些使用計量的圖表,例如使用的訊息數目和連線到 IoT 中樞的裝置數目。

IoT 中樞 [概觀] 頁面上的預設計量圖表。

正確的訊息計數值可能會延遲 1 分鐘。 由於 IoT 中樞 服務基礎結構,在重新整理時,值有時會在較高值和較低之間反彈。 只有最後一分鐘累算的值,此計數器才應該不正確。

[概觀] 窗格提供的資訊很有用,但只代表適用於IoT中樞的少量監視數據。 一旦建立IoT中樞,某些監視數據會自動收集並可供分析。 您可使用一些設定來啟用其他類型的資料收集。

什麼是 Azure 監視器?

Azure IoT 中樞 使用 監視數據Azure 監視器是完整的堆疊監視服務。 Azure 監視器可以監視您的 Azure 資源和其他雲端或內部部署資源。

請先閱讀<使用 Azure 監視器監視 Azure 資源>一文,其中會說明下列概念:

  • 什麼是 Azure 監視器?
  • 在 Azure 中收集的監視資料
  • 設定資料收集
  • 計量與記錄
  • Azure 中用於分析和深入解析的標準工具
  • 監視數據時引發的警示

如需 Azure IoT 中樞 所建立計量和記錄的詳細資訊,請參閱監視 Azure IoT 中樞 數據參考

重要

使用 Azure 監視器資源記錄 IoT 中樞 服務發出的事件不保證可靠或排序。 某些事件可能會遺失,或未按順序傳遞。 資源記錄不適合即時,因此可能需要幾分鐘的時間,事件才會記錄到您選擇的目的地。

本文的其餘部分是以使用 Azure 監視器監視 Azure 資源一文為基礎,說明針對 Azure IoT 中樞 收集的特定數據。 您會看到設定數據收集的範例,以及如何使用 Azure 工具分析此資料。

收集和路由傳送

平臺計量、活動記錄和資源記錄具有唯一的集合、記憶體和路由規格。

  • 系統會自動收集和儲存平台計量和活動記錄,但是可以使用診斷設定將資料路由傳送至其他位置。

  • 在您建立診斷設定並將其路由至一個或多個位置之前,不會收集並儲存資源記錄。

  • 計量和記錄可以路由傳送至數個位置,包括:

    • 透過相關聯的 Log Analytics 工作區來儲存 Azure 監視器記錄。 您可以使用 Log Analytics 分析這些記錄。
    • 用於封存和離線分析的 Azure 儲存體
    • 事件中樞端點,可供外部應用程式讀取,例如第三方安全性資訊和事件管理 (SIEM) 工具。

在 [監視] 底下的IoT 中樞 Azure 入口網站 中,您可以選取 [診斷設定],然後選取 [新增診斷設定],以建立範圍限定於IoT中樞所發出的記錄和平臺計量的診斷設定。

顯示如何在 Azure 入口網站的IoT中樞中新增診斷設定的螢幕快照。

下列螢幕快照顯示將資源記錄類型 連線 Operations 和所有平臺計量路由傳送至 Log Analytics 工作區的診斷設定。

用於監視IoT中樞的診斷 設定表單螢幕快照。

如需使用 Azure 入口網站、CLI 或 PowerShell 建立診斷設定的詳細資訊,請參閱建立診斷設定以收集 Azure 中的平台記錄和計量。 在建立診斷設定時,您可以指定要收集的記錄類別。 Azure IoT 中樞 的類別列在 [監視 Azure IoT 中樞 資料參考] 中的 [資源記錄]。 事件只會針對某些類別中的錯誤發出。

將平台計量路由 IoT 中樞 至其他位置時:

  • 這些平臺計量無法透過診斷設定導出:連線 裝置裝置總計。

  • 多維度計量,例如某些 路由計量,目前會匯出為跨維度值匯總的扁平化單一維度計量。 如需詳細資訊,請參閱 將平臺計量導出至其他位置

分析計量

您可以使用計量總管,透過來自其他 Azure 服務的計量來分析 Azure IoT 中樞 計量。 如需此工具的詳細資訊,請參閱 使用 Azure 監視器計量總管分析計量。

若要開啟計量總管,請移至 Azure 入口網站 並開啟IoT中樞,然後選取 [監視] 底下的 [計量]。 根據預設,此總管的範圍會限定於IoT中樞所發出的平臺計量。

顯示IoT中樞計量總管頁面的螢幕快照。

如需針對 Azure IoT 中樞 收集的平臺計量清單,請參閱監視 Azure IoT 中樞 數據參考中的計量。 如需針對所有 Azure 服務收集的平臺計量清單,請參閱 Azure 監視器支援的計量。

針對以計數單位收集的 IoT 中樞 平臺計量,某些匯總可能無法或可供使用。 若要深入瞭解,請參閱監視 Azure IoT 中樞 數據參考中支持的匯總。

某些 IoT 中樞 計量,例如路由計量,是多維度的。 針對這些計量,您可以根據維度,將篩選條件和分割套用至圖表。

分析記錄

Azure 監視器記錄中的資料會儲存在資料表中,其中每個資料表都有一組專屬的唯一屬性。 這些數據表中的數據會與Log Analytics工作區相關聯,而且可以在Log Analytics中查詢。 若要深入瞭解 Azure 監視器記錄,請參閱 Azure 監視器檔中的 Azure 監視器記錄概觀

若要將資料路由傳送至 Azure 監視器記錄,您必須建立診斷設定,才能將資源記錄或平台計量傳送至 Log Analytics 工作區。 若要深入瞭解,請參閱 集合和路由

若要執行 Log Analytics,請移至 Azure 入口網站 並開啟 IoT 中樞,然後選取 [監視] 下的 [記錄]。 根據預設,這些Log Analytics查詢的範圍是IoT中樞的 Azure 監視器記錄中所收集的記錄和計量。

IoT 中樞的 [記錄] 頁面。

如需 Azure 監視器記錄所使用的數據表清單,以及 Log Analytics 可查詢的數據表,請參閱監視 Azure IoT 中樞 數據參考中的 Azure 監視器記錄數據表。

Azure 監視器中的所有資源記錄都有相同的欄位,後面接著服務特定的欄位。 一般結構描述如 Azure 監視器資源記錄結構描述中所述。 您可以在監視 Azure IoT 中樞 資料參考中的資源記錄中找到針對 Azure IoT 中樞 收集的資源記錄的架構和類別。 事件只會針對某些類別中的錯誤發出。

活動記錄是 Azure 中的平台登入,可讓您深入了解訂用帳戶等級事件。 您可以獨立檢視它,或將它路由傳送至 Azure 監視器記錄,您可以在其中使用 Log Analytics 執行更複雜的查詢。

將平台計量路由至 Azure 監視器記錄時 IoT 中樞:

  • 下列平台計量無法透過診斷設定匯出:連線的裝置裝置總計

  • 多維度計量,例如某些 路由計量,目前會匯出為跨維度值匯總的扁平化單一維度計量。 如需詳細資訊,請參閱 將平台計量導出至其他位置

如需 IoT 中樞 的常見查詢,請參閱範例 Kusto 查詢。 如需使用Log Analytics查詢的詳細資訊,請參閱 Azure 監視器中的記錄查詢概觀。

IoT 中樞 記錄中的 SDK 版本

IoT 中樞 資源記錄中的某些作業會傳回sdkVersionproperties 物件中的屬性。 針對這些作業,當裝置或後端應用程式使用其中一個 Azure IoT SDK 時,此屬性會包含所使用 SDK 的相關信息、SDK 版本,以及 SDK 執行所在的平臺。

下列範例顯示 sdkVersion 針對作業發出的 deviceConnect 屬性:

  • Node.js裝置 SDK: "azure-iot-device/1.17.1 (node v10.16.0; Windows_NT 10.0.18363; x64)"
  • .NET (C#) SDK: ".NET/1.21.2 (.NET Framework 4.8.4200.0; Microsoft Windows 10.0.17763 WindowsProduct:0x00000004; X86)"

下表顯示用於不同 Azure IoT SDK 的 SDK 名稱:

sdkVersion 屬性中的 SDK 名稱 語言
.NET .NET (C#)
microsoft.azure.devices .NET (C#) 服務 SDK
microsoft.azure.devices.client .NET (C#) 裝置 SDK
iothubclient C 或 Python v1 (已淘汰) 裝置 SDK
iothubserviceclient C 或 Python v1 (已淘汰) 服務 SDK
azure-iot-device-iothub-py Python 裝置 SDK
azure-iot-device Node.js裝置 SDK
azure-iothub Node.js服務 SDK
com.microsoft.azure.iothub-java-client Java 裝置 SDK
com.microsoft.azure.iothub.service.sdk Java 服務 SDK
com.microsoft.azure.sdk.iot.iot-device-client Java 裝置 SDK
com.microsoft.azure.sdk.iot.iot-service-client Java 服務 SDK
C Embedded C
C + (OSSimplified = Eclipse ThreadX) Eclipse ThreadX

當您對 IoT 中樞 資源記錄執行查詢時,您可以擷取 SDK 版本屬性。 例如,下列查詢會從 連線 ions 作業所傳回的屬性擷取 SDK 版本屬性(和裝置識別符)。 這兩個屬性會寫入結果,以及作業的時間,以及裝置所連線之IoT中樞的資源標識碼。

// SDK version of devices
// List of devices and their SDK versions that connect to IoT Hub
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)
| distinct DeviceId, SDKVersion, TimeGenerated, _ResourceId

範例 Kusto 查詢

使用下列 Kusto 查詢來協助您監視 IoT 中樞。

重要

從 [IoT 中樞] 功能選取 [記錄] 會開啟Log Analytics,並只包含來自IoT中樞資源的數據。 針對包含來自其他 IoT 中樞或 Azure 服務的查詢,請從 [Azure 監視器] 功能選取 [記錄]。 如需詳細資訊,請參閱 Azure 監視器 Log Analytics 中的記錄查詢領域和時間範圍

  • 連線 錯誤:識別裝置連線錯誤。

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" and Level == "Error"
    
  • 節流錯誤:識別發出最多要求的裝置,導致節流錯誤。

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where ResultType == "429001"
    | extend DeviceId = tostring(parse_json(properties_s).deviceId)
    | summarize count() by DeviceId, Category, _ResourceId
    | order by count_ desc
    
  • 死端點:藉由回報問題的次數識別死或狀況不良的端點,並知道原因。

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Routes" and OperationName in ("endpointDead", "endpointUnhealthy")
    | extend parsed_json = parse_json(properties_s)
    | extend Endpoint = tostring(parsed_json.endpointName), Reason = tostring(parsed_json.details) 
    | summarize count() by Endpoint, OperationName, Reason, _ResourceId
    | order by count_ desc
    
  • 錯誤摘要:依類型計算所有作業的錯誤計數。

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Level == "Error"
    | summarize count() by ResultType, ResultDescription, Category, _ResourceId
    
  • 最近連線的裝置:IoT 中樞 在指定時段內看到連線的裝置清單。

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" and OperationName == "deviceConnect"
    | extend DeviceId = tostring(parse_json(properties_s).deviceId)
    | summarize max(TimeGenerated) by DeviceId, _ResourceId
    
  • 連線 特定裝置的事件:針對特定裝置記錄的所有連線事件(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"
    
  • SDK 版本的裝置:裝置及其 SDK 版本,用於裝置連線或裝置到雲端對應項作業。

    AzureDiagnostics
    | where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
    | where Category == "Connections" or Category == "D2CTwinOperations"
    | extend parsed_json = parse_json(properties_s)
    | extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId)
    | distinct DeviceId, SDKVersion, TimeGenerated, _ResourceId
    

從 Azure 事件中樞讀取記錄

在透過診斷設定來設定事件記錄之後,您可以建立會將記錄讀出的應用程式,以便根據記錄中的資訊來採取行動。 下列範例程式代碼會從事件中樞擷取記錄。

class Program
{ 
    static string connectionString = "{your AMS eventhub endpoint connection string}";
    static string monitoringEndpointName = "{your AMS event hub endpoint name}";
    static EventHubClient eventHubClient;
    //This is the Diagnostic Settings schema
    class AzureMonitorDiagnosticLog
    {
        string time { get; set; }
        string resourceId { get; set; }
        string operationName { get; set; }
        string category { get; set; }
        string level { get; set; }
        string resultType { get; set; }
        string resultDescription { get; set; }
        string durationMs { get; set; }
        string callerIpAddress { get; set; }
        string correlationId { get; set; }
        string identity { get; set; }
        string location { get; set; }
        Dictionary<string, string> properties { get; set; }
    };

    static void Main(string[] args)
    {
        Console.WriteLine("Monitoring. Press Enter key to exit.\n");
        eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, monitoringEndpointName);
        var d2cPartitions = eventHubClient.GetRuntimeInformationAsync().PartitionIds;
        CancellationTokenSource cts = new CancellationTokenSource();
        var tasks = new List<Task>();
        foreach (string partition in d2cPartitions)
        {
            tasks.Add(ReceiveMessagesFromDeviceAsync(partition, cts.Token));
        }
        Console.ReadLine();
        Console.WriteLine("Exiting...");
        cts.Cancel();
        Task.WaitAll(tasks.ToArray());
    }

    private static async Task ReceiveMessagesFromDeviceAsync(string partition, CancellationToken ct)
    {
        var eventHubReceiver = eventHubClient.GetDefaultConsumerGroup().CreateReceiver(partition, DateTime.UtcNow);
        while (true)
        {
            if (ct.IsCancellationRequested)
            {
                await eventHubReceiver.CloseAsync();
                break;
            }
            EventData eventData = await eventHubReceiver.ReceiveAsync(new TimeSpan(0,0,10));
            if (eventData != null)
            {
                string data = Encoding.UTF8.GetString(eventData.GetBytes());
                Console.WriteLine("Message received. Partition: {0} Data: '{1}'", partition, data);
                var deserializer = new JavaScriptSerializer();
                //deserialize json data to azure monitor object
                AzureMonitorDiagnosticLog message = new JavaScriptSerializer().Deserialize<AzureMonitorDiagnosticLog>(result);
            }
        }
    }
}

警示

在監視資料中發現重大狀況時,Azure 監視器會主動通知您。 如此便能在您的客戶注意到之前,先在您的系統中識別問題並加以對應。 可在 [計量]、[記錄]、[活動記錄] 中設定警示。 不同類型的警示各有優缺點。

當您根據平臺計量建立警示規則 (以計數單位收集),某些彙總可能無法使用或可供使用。 如需詳細資訊,請參閱監視 Azure IoT 中樞 數據參考支持的匯總

使用事件方格監視個別裝置的中斷連線

Azure 監視器提供計量、連線 裝置,可用來監視連線到 IoT 中樞 的裝置數目。 當連線的裝置數目低於臨界值時,此計量會觸發警示。 Azure 監視器也會在連線類別發出事件,讓您可用來監視裝置連線、中斷連線和連線錯誤。 雖然這些事件可能適用於某些案例,但 Azure 事件方格 提供低延遲、每個裝置監視解決方案,可用來追蹤重要裝置和基礎結構的裝置連線。

使用事件方格,您可以訂閱 IoT 中樞 Device 連線 edDeviceDisconnected 事件,以觸發警示並監視裝置連線狀態。 事件方格提供比 Azure 監視器低得多的事件延遲,因此您可以針對每個裝置進行監視,而不是針對所有連線的裝置進行監視。 這些因素使事件方格成為監視重要裝置和基礎結構連線的慣用方法。 強烈建議使用事件方格來監視生產環境中的裝置連線。

如需使用事件方格和 Azure 監視器監視裝置連線的詳細資訊,請參閱監視、診斷和疑難解答裝置對 Azure IoT 中樞 的連線能力。

下一步