Azure IoT Hub の監視

Azure リソースに依存するクリティカルなアプリケーションとビジネス プロセスがある場合は、それらのリソースの可用性、パフォーマンス、操作を監視する必要があります。 この記事では、Azure IoT Hub によって生成される監視データと、Azure Monitor の機能を使用してこのデータについての分析とアラートを行う方法について説明します。

監視の概要

Azure portal の各 IoT ハブの [概要] ページには、使用されているメッセージの数や IoT ハブに接続されているデバイスの数など、いくつかの使用状況メトリックを示すグラフが含まれています。

IoT ハブの [概要] ページの既定のメトリック グラフ。

正しいメッセージ数の値は 1 分遅れる場合があります。 IoT Hub サービス インフラストラクチャにより、更新時に高い値と低い値の間でバウンドすることがあります。 この数は、最後の 1 分間に増加した値に限り正しくありません。

概要ウィンドウに表示される情報は便利ですが、IoT Hub に使用できる監視データは、ごくわずかな量しか示しません。 いくつかの監視データは自動的に収集され、IoT ハブを作成するとすぐに分析に使用できるようになります。 構成によっては、他の種類のデータ収集を有効にできます。

Azure Monitor とは

Azure IoT Hub は、フル スタック監視サービスである Azure Monitor を使用してデータを監視します。 Azure Monitor は、Azure リソースおよびその他のクラウドまたはオンプレミスのリソースを監視できます。

まず「Azure Monitor を使用した Azure リソースの監視」の記事にある次の概念の説明をお読みください。

  • Azure Monitor とは
  • Azure で収集される監視データ
  • データ収集の構成
  • メトリックとログ
  • 分析と分析情報用の Azure の標準ツール
  • データの監視時に発生するアラート

Azure IoT Hub によって作成されるメトリックとログの詳細については、「Monitoring Azure IoT Hub data reference (Azure IoT Hub 監視データのリファレンス)」を参照してください。

重要

Azure Monitor のリソース ログを使用して IoT Hub サービスによって出力されるイベントは、信頼性も順序も保証されません。 一部のイベントが失われたり、順序どおりに配信されないことがあります。 さらに、リソース ログはリアルタイムではあることは意図されていないため、選択した出力先に記録されるまで数分かかる場合があります。

この記事の残りの部分では、「Azure Monitor を使用した Azure リソースの監視」に関する記事に基づき、Azure IoT Hub 用に収集された特定のデータについて説明します。 データ 収集を構成する例と、Azure ツールを使用してこのデータを分析する方法が表示されます。

収集とルーティング

プラットフォーム メトリック、アクティビティ ログ、およびリソース ログには、一意の収集、ストレージ、ルーティングの仕様があります。

  • プラットフォーム メトリックとアクティビティ ログは自動的に収集および格納されますが、診断設定を使用して他の場所にルーティングすることもできます。

  • リソース ログは、診断設定を作成して 1 つ以上の場所にルーティングするまでは収集および格納されません。

  • メトリックとログは、次のような複数の場所にルーティングできます。

    • Azure Monitor には、関連付けられた Log Analytics ワークスペースを使用してログが格納されます。 ここで、Log Analytics を使用してこれらを分析できます。
    • アーカイブとオフライン分析のための Azure Storage
    • 外部アプリケーションで読み取れる Azure Event Hubs エンドポイント (サードパーティのセキュリティ情報イベント管理の SIEM ツールなど)。

Azure portal の IoT ハブから 監視 から 診断設定 を選択し、次に 診断設定を追加 を選択して、IoT ハブによって発行されるログとプラットフォーム メトリックを対象とする診断設定を作成できます。

Azure portal の IoT ハブに診断設定を追加する方法を示すスクリーンショット。

次のスクリーンショットは、リソース ログ タイプの接続操作とすべてのプラットフォーム メトリックを Log Analytics ワークスペースにルーティングするための診断設定を示しています。

IoT ハブを監視するための [診断設定] フォームのスクリーンショット。

Azure portal、CLI、または PowerShell を使用した診断設定の作成の詳細については、「Azure でプラットフォーム ログとメトリックを収集するための診断設定を作成する」を参照してください。 診断設定を作成するときは、収集するログのカテゴリを指定します。 Azure IoT Hub のカテゴリの一覧については、「Azure IoT Hub の監視データのリファレンス」の「リソース ログ」を参照してください。 イベントは一部のカテゴリのエラーに対してのみ生成されます。

次は IoT Hub のプラットフォーム メトリックを他の場所にルーティングする場合です。

  • これらのプラットフォーム メトリックは、診断設定を使用してエクスポートできません: 接続されているデバイスデバイスの合計数

  • 多次元メトリック (一部のルーティング メトリックなど) は、現在、ディメンション値間で集計され、フラット化された単一ディメンションのメトリックとしてエクスポートされます。 詳細な情報については、「他の場所へのプラットフォーム メトリックのエクスポート」を参照してください。

メトリックの分析

メトリックス エクスプローラーを使用して、他の Azure サービスのメトリックと共に Azure IoT Hub のメトリックを分析できます。 このツールの詳細については、「Azure Monitor メトリック ス エクスプローラーを使用したメトリックの分析」を参照してください。

メトリックス エクスプローラーを開くには、Azure portal に移動して IoT ハブを開き、[監視] から [メトリック] を選択します。 既定では、このエクスプローラーのスコープは IoT ハブによって出力されるプラットフォーム メトリックに設定されています。

IoT ハブのメトリックス エクスプローラーのページを示すスクリーンショット。

Azure IoT Hub に関して収集されるプラットフォーム メトリックの一覧については、「Monitoring Azure IoT Hub data reference (Azure IoT Hub 監視データのリファレンス)」の「メトリック」を参照してください。 すべての Azure サービスに関して収集されるプラットフォーム メトリックの一覧については、「Azure Monitor のサポートされるメトリック」を参照してください。

カウント単位で収集される IoT Hub のプラットフォーム メトリックについては、一部の集計が有効でない場合や使用できない場合があります。 詳細については、「Monitoring Azure IoT Hub data reference (Azure IoT Hub 監視データのリファレンス)」の「サポートされる集計」を参照してください。

ルーティング メトリックなど、いくつかの IoT Hub メトリックは多次元です。 これらのメトリックについては、フィルターを適用し、ディメンションに基づいてグラフに分割することができます。

ログの分析

Azure Monitor ログのデータはテーブルに格納され、各テーブルには独自の一意のプロパティ セットがあります。 これらのテーブル内のデータは、Log Analytics ワークスペースに関連付けられており、Log Analytics でクエリを実行できます。 Azure Monitor ログの詳細については、Azure Monitor のドキュメントの「Azure Monitor ログの概要」を参照してください。

データを Azure Monitor ログにルーティングするには、リソース ログまたはプラットフォーム メトリックを Log Analytics ワークスペースに送信するための診断設定を作成する必要があります。 詳細については、「コレクションとルーティング」を参照してください。

Log Analytics を実行するには、Azure portal に移動して IoT ハブを開き、[監視][ログ] を選択します。 既定では、これらの Log Analytics クエリには IoT ハブの Azure Monitor ログで収集されたログとメトリックにスコープが設定されています。

IoT ハブの [ログ] ページ。

Azure Monitor ログで使用され、Log Analytics でクエリを実行できるテーブルの一覧については、「Monitoring Azure IoT Hub data reference (Azure IoT Hub 監視データのリファレンス)」の「Azure Monitor ログ テーブル」を参照してください。

Azure Monitor 内のすべてのリソース ログには、同じフィールドの後にサービス固有のフィールドがあります。 共通のスキーマの概要については、Azure Monitor リソース ログのスキーマに関する記事をご覧ください。 Azure IoT Hub に関して収集されるリソース ログのスキーマとカテゴリについては、「Monitoring Azure IoT Hub data reference (Azure IoT Hub 監視データのリファレンス)」の「リソース ログ」を参照してください。 イベントは一部のカテゴリのエラーに対してのみ生成されます。

アクティビティ ログは、サブスクリプション レベルのイベントの分析情報を提供するプラットフォーム ログイン Azure です。 個別に表示できるほか、Azure Monitor ログにルーティングして、Log Analytics を使用してより複雑なクエリを実行することもできます。

次は IoT Hub のプラットフォーム メトリックを Azure Monitor ログにルーティングする場合です。

  • 次のプラットフォーム メトリックは、診断設定を使用してエクスポートできません:接続されているデバイスデバイスの合計数

  • 多次元メトリック (一部のルーティング メトリックなど) は、現在、ディメンション値間で集計され、フラット化された単一ディメンションのメトリックとしてエクスポートされます。 詳細については、「他の場所へのプラットフォーム メトリックのエクスポート」を参照してください。

IoT Hub に関する一般的なクエリについては、「サンプル Kusto クエリ」を参照してください。 Log Analytics クエリの使用の詳細については、「Azure Monitor のログ クエリの概要」を参照してください。

IoT Hub ログの SDK バージョン

IoT Hub リソース ログの一部の操作では、properties オブジェクト内に sdkVersion プロパティが返されます。 これらの操作では、デバイスまたはバックエンド アプリがいずれかの 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 埋め込み C
C + (OSSimplified = Eclipse ThreadX) Eclipse ThreadX

IoT Hub リソース ログに対してクエリを実行するときに、SDK バージョン プロパティを抽出できます。 たとえば、次のクエリは、接続操作によって返されるプロパティから SDK バージョン プロパティ (およびデバイス ID) を抽出します。 これら 2 つのプロパティは、操作の時刻と、デバイスが接続している IoT ハブのリソース ID と一緒に結果に書き込まれます。

// 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 クエリ

IoT ハブを監視するには、次の Kusto クエリを使用します。

重要

IoT Hub メニューから [ログ] を選択すると、Log Analytics が開き、IoT ハブ リソースからのデータのみが含まれています。 他の IoT ハブまたは Azure サービスからのデータを含むクエリの場合、[Azure Monitor] メニューから [ログ] を選択します。 詳細については、「Azure Monitor 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 Hub に接続されたデバイスの一覧。

    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 Event Hubs からのログの読み取り

診断設定を使用してイベント ログを設定した後は、ログを読み取るアプリケーションを作成できます。これにより、ログの情報を基にしてアクションを実行できるようになります。 イベント ハブからログを取得するサンプル コードを次に示します。

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 Monitor のアラートは、監視データで重要な状態が見つかると事前に通知します。 これにより、ユーザーが気付く前に、管理者が問題を識別して対処できます。 アラートはメトリックログアクティビティ ログに対して設定できます。 アラートの種類に応じて、さまざまな利点と欠点があります。

プラットフォーム メトリック (カウント単位で収集) に基づいてアラート ルールを作成する場合、一部の集計が利用できないか、使用できない場合があります。 詳細については、「Monitoring Azure IoT Hub data reference (Azure IoT Hub 監視データのリファレンス)」「サポートされる集計」を参照してください。

Event Grid を使用したデバイスごとの切断の監視

Azure Monitor には、"接続されているデバイス" のメトリックが用意されています。これを使用して、IoT Hub に接続されているデバイスの数を監視します。 このメトリックは、接続されているデバイスの数がしきい値を下回るとアラートをトリガーします。 また Azure Monitor は、デバイスの接続、切断、および接続エラーの監視に使用できる接続カテゴリにもイベントを出力します。 一部のシナリオではこれらのイベントで十分ですが、Azure Event Grid では、重要なデバイスとインフラストラクチャのデバイス接続を追跡するために使用できる、待機時間の短い、デバイスごとの監視ソリューションが提供されます。

Event Grid を使用すると、IoT Hub DeviceConnectedDeviceDisconnected イベントをサブスクライブして、アラートをトリガーし、デバイスの接続状態を監視することができます。 Event Grid を使用すると、イベント待機時間が Azure Monitor よりもはるかに短くなり、接続されているデバイスのすべてではなく、デバイスごとに監視できます。 これらの要因により、Event Grid は重要なデバイスとインフラストラクチャの接続を監視するための推奨される方法となっています。 運用環境では、デバイスの接続の監視には Event Grid を使用することを強くお勧めします。

Event Grid と Azure Monitor を使用したデバイス接続の監視の詳細については、Azure IoT Hub へのデバイス接続の監視、診断、およびトラブルシューティングに関する記事を参照してください。

次のステップ