監視 Azure IoT 中樞

本文章說明:

  • 您可以為此服務收集的監視資料類型。
  • 分析資料的方式。

注意

如果您已經熟悉此服務和/或 Azure 監視器,只想知道如何分析監視資料,請參閱本文靠近結尾的分析一節。

當您有依賴 Azure 資源的重要應用程式和商務流程時,就需要監視並取得系統的警示。 Azure 監視器服務會從您系統的每個元件收集及彙總計量和記錄。 Azure 監視器讓您能夠檢視可用性、效能及復原能力,並在發生問題時通知您。 您可以使用 Azure 入口網站、PowerShell、Azure CLI、REST API 或用戶端程式庫來設定及檢視監視資料。

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

Azure 監視器提供稱為「已連線的裝置」計量,可用於監視連線到您 IoT 中樞的裝置數目。 當連線的裝置數目低於閾值時,此計量會觸發警示。 Azure 監視器也會發出連線類別中的事件,讓您可用來監視裝置連線、中斷連線和連線錯誤。 雖然這些事件對於某些情況可能便已足夠,但 Azure 事件方格還提供個別裝置監視的低延遲解決方案,可用來追蹤重要裝置和基礎結構的裝置連線。

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

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

資源類型

Azure 會使用資源類型和識別碼的概念來識別訂用帳戶中的所有內容。 資源類型也是 Azure 中所執行每個資源的資源識別碼組成部分。 例如,虛擬機器的一種資源類型是 Microsoft.Compute/virtualMachines。 如需服務及其相關聯資源類型的清單,請參閱資源提供者 (機器翻譯)。

Azure 監視器同樣會依據資源類型將核心監視資料組織成計量和記錄,也稱為命名空間。 不同的計量和記錄適用於不同的資源類型。 您的服務可能會與多個資源類型相關聯。

如需 IoT 中樞資源類型的詳細資訊,請參閱 Azure IoT 中樞監視資料參考

資料存放區

對於 Azure 監視器:

  • 計量資料會儲存在 Azure 監視器計量資料庫中。
  • 記錄資料會儲存在 Azure 監視器記錄存放區中。 Log Analytics 是可查詢此存放區的 Azure 入口網站工具。
  • Azure 活動記錄是個單獨存放區,其介面位於 Azure 入口網站。

您可選擇性地將計量和活動記錄資料路由傳送至 Azure 監視器記錄存放區。 然後,可以使用 Log Analytics 來查詢資料,並將其與其他記錄資料相互關聯。

許多服務可以使用診斷設定,將計量和記錄資料傳送至 Azure 監視器以外的其他儲存位置。 範例包括 Azure 儲存體、託管的合作夥伴系統以及使用事件中樞的非 Azure 合作夥伴系統

如需進一步了解 Azure 監視器如何儲存資料,請參閱 Azure 監視器資料平台

收集和路由傳送

平台計量、活動記錄和資源記錄有獨特的收集、儲存和路由規格。

在 Azure 入口網站中,您可以從 IoT 中樞的 [監視] 下選取 [診斷設定],接著選取 [新增診斷設定] 來建立以 IoT 中樞發出的記錄和平台計量為範圍的診斷設定。

顯示在 Azure 入口網站的 IoT 中樞內新增診斷設定的螢幕擷取畫面。

下列螢幕擷取畫面顯示將資源記錄類型 [連線作業] 和所有平台計量路由傳送至 Log Analytics 工作區的診斷設定。

用於監視 IoT 中樞的 [診斷設定] 表單的螢幕擷取畫面。

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

  • 這些平台計量無法使用診斷設定匯出:「已連線的裝置」和「裝置總數」

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

Azure 監視器平台計量

Azure 監視器為大多數服務提供平台計量。 這些計量包括:

  • 針對每個命名空間個別定義。
  • 儲存在 Azure 監視器時間序列計量資料庫中。
  • 輕量且能支援近即時警示。
  • 用來追蹤資源效能的長期變化。

收集:Azure 監視器會自動收集平台計量。 不需要組態。

路由:通常您也可以將平台計量路由傳送至 Azure 監視器記錄/Log Analytics,以便與其他記錄資料一同查詢。 如需詳細資訊,請參閱計量診斷設定 (機器翻譯)。 如需了解如何設定服務的診斷設定,請參閱在 Azure 監視器中建立診斷設定 (機器翻譯)。

如需 Azure 監視器中所有資源可收集的計量完整清單,請參閱 Azure 監視器中所支援的計量

監視器概觀

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

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

正確的訊息計數值可能會延遲 1 分鐘。 由於 IoT 中樞服務基礎結構,此值有時可能會在重新整理時偏高或偏低。 此計數器應只針對過去一分鐘內的值累算不正確。

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

重要

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

Azure 監視器資源記錄

資源記錄提供對 Azure 資源所完成作業的深入解析。 系統會自動產生記錄,但您必須將其路由傳送至 Azure 監視器記錄,才能儲存或查詢這些記錄。 按類別組織記錄。 指定的命名空間可能會有多個資源記錄類別。

收集:您必須先建立「診斷設定」,並將記錄路由傳送至一個或多個位置,才會開始收集和儲存資源記錄。 在建立診斷設定時,您可以指定要收集的記錄類別。 有多種方式可以建立和維護診斷設定,包括透過 Azure 入口網站、程式設計方式,以及 Azure 原則。

路由傳送:建議的預設設定是將資源記錄路由傳送至 Azure 監視器記錄,以便與其他記錄資料一同查詢。 您也可以使用其他位置,例如 Azure 儲存體、Azure 事件中樞及特定 Microsoft 監視合作夥伴。 如需詳細資訊,請參閱 Azure 資源記錄 (機器翻譯) 和資源記錄目的地 (機器翻譯)。

如需收集、儲存及路由傳送資源記錄的詳細資訊,請參閱 Azure 監視器中的診斷設定 (機器翻譯)。

如需 Azure 監視器中所有可用資源記錄類別的清單,請參閱 Azure 監視器中支援的資源記錄 (機器翻譯)。

Azure 監視器中的所有資源記錄都有相同的標頭欄位,後面接著服務特定的欄位。 一般結構描述如 Azure 監視器資源記錄結構描述中所述。

將連線事件路由傳送至記錄

IoT 中樞會持續發出數種作業類別的資源記錄。 不過,若要收集此記錄資料,您必須建立診斷設定,以將其路由傳送至可以分析或封存的目的地。 其中一個這類目的地是透過 Log Analytics 工作區的 Azure 監視器記錄 (查看定價),您可以在其中使用 Kusto 查詢來分析資料。

IoT 中樞資源記錄連線類別會發出與裝置連線相關的作業和錯誤。 下列螢幕擷取畫面顯示診斷設定,以將這些記錄路由傳送至 Log Analytics 工作區:

將連線記錄傳送至 Log Analytics 工作區的建議設定。

建議您在建立 IoT 中樞之後儘早建立診斷設定,因為雖然 IoT 中樞一律會發出資源記錄,但在您將其路由傳送至目的地之前,Azure 監視器不會收集它們。

若要深入了解如何將記錄路由傳送至目的地,請參閱收集和路由傳送。 如需建立診斷設定的詳細指示,請參閱使用計量和記錄教學課程

Azure 活動記錄 (部分機器翻譯)

活動記錄包含訂用帳戶層級事件,用於追蹤每個 Azure 資源外部可見的作業;例如,建立新的資源或啟動虛擬機器。

收集:活動記錄事件會自動產生並收集至個別存放區中,以便使用者在 Azure 入口網站中檢視。

路由:您可以將活動記錄資料傳送至 Azure 監視器記錄,以便與其他記錄資料一起分析。 您也可以使用其他位置,例如 Azure 儲存體、Azure 事件中樞及特定 Microsoft 監視合作夥伴。 如需進一步了解如何路由傳送活動記錄,請參閱 Azure 活動記錄概觀 (機器翻譯)。

分析記錄

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

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

若要執行 Log Analytics,請前往 Azure 入口網站並開啟您的 IoT 中樞,,然後選取 [監視] 下的 [記錄]。 這些 Log Analytics 查詢預設會以 Azure 監視器記錄為 IoT 中樞收集的記錄和計量為範圍。

IoT 中樞的 [記錄] 頁面。

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

  • 下列平台計量無法使用診斷設定匯出:「已連線的裝置」和「裝置總數」

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

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

IoT 中樞記錄中的 SDK 版本

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

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

  • 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#) service SDK
microsoft.azure.devices.client .NET (C#) device 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 版本屬性。 例如,下列查詢會從連線作業所傳回的屬性擷取 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

從 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);
            }
        }
    }
}

如需可用的資源記錄類別、其相關聯的 Log Analytics 資料表,以及 IoT 中樞的記錄結構描述,請參閱 Azure IoT 中樞監視資料參考

分析監視資料

有許多工具可用來分析監視資料。

Azure 監視器工具

Azure 監視器支援下列基本工具:

支援更複雜視覺效果的工具包括:

  • 儀表板 (機器翻譯) 可讓您將不同類型的資料合併到 Azure 入口網站中的單一窗格。
  • 活頁簿 (機器翻譯) 是能在 Azure 入口網站中建立的可自訂報表。 活頁簿可以包含文字、計量及記錄查詢。
  • Grafana 是在操作儀表板中表現相當出色的開放平台工具。 您可以使用 Grafana 來建立儀表板,納入 Azure 監視器以外多個來源的資料。
  • Power BI (機器翻譯) 是一項商務分析服務,可提供跨各種資料來源的互動式視覺效果。 你可以將 Power BI 設定為自動從 Azure 監視器匯入記錄資料,以利用這些視覺效果。

Azure 監視器匯出工具

您可以使用下列方法將資料從 Azure 監視器中提取至其他工具:

若要開始使用適用於 Azure 監視器的 REST API,請參閱 Azure 監視 REST API 逐步解說 (機器翻譯)。

Kusto 查詢

您可以使用 Kusto 查詢語言 (KQL) 分析 Azure 監視器記錄/Log Analytics 存放區中的監視資料。

重要

當您從入口網站的服務功能表中選取 [記錄] 時,Log Analytics 會隨即開啟,並將查詢範圍設定為目前的服務。 此範圍表示記錄查詢只會包含該資源類型的資料。 如果您想要執行包含其他 Azure 服務資料的查詢,請從 [Azure 監視器] 功能表中選取 [記錄]。 如需詳細資訊,請參閱 Azure 監視器 Log Analytics 中的記錄查詢範圍和時間範圍

如需各項服務的常見查詢清單,請參閱 Log Analytics 查詢介面 (機器翻譯)。

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

  • 連線錯誤:找出裝置連線錯誤。

    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 監視器警示會主動通知您。 警示可讓您在客戶發現系統發生問題前,就先及早識別和解決問題。 如需詳細資訊,請參閱 Azure 監視器警示

Azure 資源的常見警示有許多來源。 如需 Azure 資源的常見警示範例,請參閱記錄警示查詢範例 (機器翻譯)。 Azure 監視器基準警示 (AMBA) 網站提供半自動化方法來實作重要的平台計量警示、儀表板和指導方針。 此網站適用於持續擴充的 Azure 服務子集,包括屬於 Azure 登陸區域 (ALZ) 的所有服務。

常見的警示結構描述會將 Azure 監視器警示通知的使用量標準化。 如需詳細資訊,請參閱一般警示結構描述 (機器翻譯)。

警示類型

您可以針對在 Azure 監視器資料平台中的任何計量或記錄資料來源發出警示。 警示有許多不同的類型,具體取決於您監視的服務以及所收集的監視資料。 不同類型的警示各有優缺點。 如需詳細資訊,請參閱選擇正確的監視警示類型 (機器翻譯)。

下列清單介紹可建立的 Azure 監視器警示類型:

  • 計量警示 (機器翻譯) 會定期評估資源計量。 這些計量可以是平台計量、自訂計量、Azure 監視器轉換成計量的記錄,或 Application Insights 計量。 計量警示還可以套用多個條件和動態閾值。
  • 記錄警示 (機器翻譯) 可讓使用者使用 Log Analytics 查詢,以預先定義的頻率評估資源記錄。
  • 活動記錄警示 (機器翻譯) 會在發生符合定義條件的新活動記錄事件時觸發。 資源健康狀態警示和服務健康情況警示是報告服務和資源健康狀態的活動記錄警示。

某些 Azure 服務也支援智慧偵測警示Prometheus 警示建議的警示規則

對於某些服務,若要進行大規模監控,您可以將同一計量警示規則套用至相同 Azure 區域中存在的多個同類型資源。 系統會針對每個受監視的資源傳送個別通知。 如需支援的 Azure 服務和雲端,請參閱使用一個警示規則監視多個資源 (機器翻譯)。

IoT 中樞警示規則

您可以設定 IoT 中樞監視資料參考中列出的任何計量、記錄項目或活動記錄項目的警示。

設定裝置中斷連線的計量警示

您可以根據 IoT 中樞發出的平台計量來設定警示。 使用計量警示時,您可以通知個人相關條件已發生,也會觸發可自動回應該條件的動作。

已連線的裝置 (預覽) 計量會告訴您有多少裝置連線到您的 IoT 中樞。 如果此計量低於閾值,則會觸發警示:

已連線裝置計量的警示邏輯設定。

您可以使用計量警示規則,大規模地監視裝置中斷連線異常情形。 也就是說,使用警示來判斷大量裝置意外中斷連線的時機。 偵測到此狀況時,您可以查看記錄,協助針對此問題進行疑難排解。 不過,若要近乎即時地監視每一裝置的中斷連線和重要裝置的中斷連線,您必須使用事件方格。

若要深入了解 IoT 中樞的警示,請參閱 IoT 中樞的警示。 如需在 IoT 中樞中建立警示的逐步解說,請參閱使用計量和記錄教學課程。 如需警示的詳細概觀,請參閱 Azure 監視器文件中的 Microsoft Azure 警示概觀

Advisor 建議

對於一些服務,如果在資源作業期間發生重大狀況或有即將到來的變更,入口網站的服務 [概觀] 頁面上會顯示警示。 您可以在左側功能表中 [監視] 底下的 [Advisor 建議] 中找到警示的詳細資訊和建議的修正。 在正常作業期間,不會顯示 Advisor 建議。

如需 Azure Advisor 的詳細資訊,請參閱 Azure Advisor 概觀 (機器翻譯)。