チュートリアル:IoT ハブでメトリックとログを設定して使用する
Azure Monitor を使用して IoT ハブからメトリックとログを収集し、ソリューションの操作を監視するとともに、問題が発生したときにトラブルシューティングを行います。 このチュートリアルでは、メトリックに基づいてグラフを作成する方法、メトリックに対してトリガーされるアラートを作成する方法、IoT Hub の操作とエラーを Azure Monitor ログに送信する方法、ログでエラーを確認する方法について説明します。
このチュートリアルでは、.NET でのテレメトリの送信に関するクイックスタートの Azure サンプルを使用して、IoT ハブにメッセージを送信します。 デバイスまたは別のサンプルを使用していつでもメッセージを送信できますが、いくつかの手順を適宜変更することが必要な場合があります。
このチュートリアルを開始する前に、Azure Monitor の概念をある程度理解しておくと役立つものと思われます。 詳細については、IoT Hub の監視に関する記事を参照してください。 IoT Hub によって出力されるメトリックとリソース ログの詳細については、監視データのリファレンスに関する記事をご覧ください。
このチュートリアルでは、以下のタスクを実行します。
- Azure CLI を使用して IoT ハブを作成し、シミュレートされたデバイスを登録して、Log Analytics ワークスペースを作成する。
- IoT Hub の接続およびデバイス テレメトリ リソース ログを、Log Analytics ワークスペース内の Azure Monitor ログに送信する。
- メトリックス エクスプローラーを使用して、選択したメトリックに基づいてグラフを作成し、ダッシュボードにピン留めする。
- 重要性の高い状態が生じたときに電子メールで通知を受け取ることができるように、メトリック アラートを作成する。
- IoT ハブにメッセージを送信する IoT デバイスをシミュレートするアプリをダウンロードして実行する。
- 特定の条件に合致したときにアラートを表示する。
- メトリックのグラフをダッシュボード上に表示する。
- Azure Monitor ログに IoT Hub のエラーと操作を表示する。
前提条件
Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
開発用コンピューター上の .NET Core SDK 2.1 以降。 複数のプラットフォームに対応する .NET Core SDK を .NET からダウンロードできます。
開発コンピューターに現在インストールされている C# のバージョンは、次のコマンドを使って確認できます。
dotnet --version
メールを受信できる電子メール アカウント。
ポート 8883 がファイアウォールで開放されていることを確認してください。 このチュートリアルのデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。 このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。 この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
リソースを設定する
このチュートリアルには、IoT ハブ、Log Analytics ワークスペース、シミュレートされた IoT デバイスが必要です。 これらのリソースは、Azure portal、Azure CLI、または PowerShell を使用して作成できます。 すべてのリソースに同じリソース グループと場所を使います。 このチュートリアルを完了したら、リソース グループを削除することによって、すべてのものを一度に削除できます。
このチュートリアルでは、次の手順を実行する CLI スクリプトを提供しました。
リソース グループを作成します。
IoT Hub を作成します。
Log Analytics ワークスペースを作成します。
IoT ハブにメッセージを送信するシミュレートされたデバイスのデバイス ID を登録します。 シミュレートされたデバイスの構成に使用するデバイス接続文字列を保存します。
重要
この記事では、Shared Access Signature (対称キー認証とも呼ばれます) を使用してデバイスを接続する手順について説明します。 この認証方法はテストと評価には便利ですが、X.509 証明書を使用してデバイスを認証する方が安全なアプローチです。 詳細については、「セキュリティのベスト プラクティス」>「接続のセキュリティ」をご覧ください。
Azure CLI を使用してリソースを設定する
次のコマンドをコピーして、Cloud Shell または Azure CLI がインストールされているローカル コマンド ライン インスタンスに貼り付けます。 一部のコマンドは、実行に時間がかかる場合があります。 リソース グループ ContosoResources に新しいリソースが作成されます。
一部のリソースの名前は、Azure 全体で一意である必要があります。 このスクリプトでは、$RANDOM
関数を使用してランダム値が生成され、変数に格納されます。 これらのリソースでは、スクリプトによってこのランダム値がリソースのベース名に追加され、リソース名が一意になります。
グローバルに一意である必要のないリソース名の値を設定します。
location=westus
resourceGroup=ContosoResources
iotDeviceName=Contoso-Test-Device
一意である必要があるリソース名の値を設定します。 これらの名前は、末尾に連結された乱数を持ちます。
randomValue=$RANDOM
iotHubName=ContosoTestHub$randomValue
echo "IoT hub name = " $iotHubName
workspaceName=contoso-la-workspace$randomValue
echo "Log Analytics workspace name = " $workspaceName
このチュートリアルのすべてのリソースに使用するリソース グループを作成します。
az group create --name $resourceGroup --location $location
無料レベルで IoT ハブを作成します。 各サブスクリプションで使用できる無料 IoT ハブは 1 つのみです。 空きハブが既にある場合は、値を --sku
(basic) または B1
(standard) にS1
変更します。
az iot hub create --name $iotHubName --resource-group $resourceGroup --partition-count 2 --sku F1 --location $location
Log Analytics ワークスペースの作成
az monitor log-analytics workspace create --resource-group $resourceGroup --workspace-name $workspaceName --location $location
テストに使用する IoT デバイス ID を作成します。
az iot hub device-identity create --device-id $iotDeviceName --hub-name $iotHubName
デバイス ID のプライマリ接続文字列を取得し、ローカルにコピーします。 この接続文字列は、テスト フェーズ中にデバイス シミュレーションを実行するために必要です。
az iot hub device-identity connection-string show --device-id $iotDeviceName --hub-name $iotHubName
接続とデバイス テレメトリのログを収集する
IoT Hub は、複数のカテゴリの操作について、リソース ログを出力します。 これらのログを表示するには、診断設定を作成して同期先に送信する必要があります。 そのような送信先の 1 つが、Log Analytics ワークスペースで収集される Azure Monitor ログです。 IoT Hub リソース ログは、さまざまなカテゴリにグループ化されます。 Azure Monitor ログに送信するカテゴリを診断設定で選択できます。 この記事では、接続とデバイス テレメトリに関連する操作とエラーのログを収集します。 IoT Hub でサポートされているカテゴリの完全な一覧については、IoT Hub リソース ログに関するセクションをご覧ください。
IoT Hub リソース ログを Azure Monitor ログに送信するための診断設定を作成するには、次の手順に従います。
Azure Portal で、IoT ハブに移動します。 CLI コマンドを使用してリソースを作成した場合、IoT ハブはリソース グループ ContosoResources にあります。
ナビゲーション メニューの[監視] セクションの [診断設定] を選択します。 次に [診断設定を追加する] を選択します。
[診断設定] ページで次の詳細を指定します。
パラメーター 値 診断設定の名前 設定に「接続とテレメトリをログに送信する」など、わかりやすい名前を付けます。 ログ [カテゴリ] の一覧から [接続] と [デバイス テレメトリ] を選択します。 宛先の詳細 [Log Analytics ワークスペースに送信] を選択し、Log Analytics ワークスペース ピッカーを使用して、前にメ書き留めておいたワークスペースを選択します。 [保存] を選択して設定を保存します。 [診断設定] ペインを閉じます。 診断設定の一覧に新しい設定が表示されます。
メトリックを設定する
次に、メトリックス エクスプローラーを使用して、追跡するメトリックを表示するグラフを作成します。Azure portal の既定のダッシュボードにこのグラフをピン留めします。
IoT ハブ のメニューで、[監視] セクションから [メトリック] を選択します。
画面の上部にある [Last 24 hours (Automatic)](過去 24 時間 (自動)) を選択します。 表示されるドロップダウンでは、 [時間の範囲] で [過去 4 時間] を選択し、 [時間の粒度] を [1 分] に設定します。また、 [時刻の表示形式] で [ローカル] を選択します。 [適用] を選択して、これらの設定を保存します。 設定に、 [Local Time: Last 4 hours (1 minute)](ローカル時刻: 過去 4 時間 (1 分)) と表示されます。
グラフには、IoT ハブをスコープとする部分的なメトリック設定が表示されます。 [スコープ] と [メトリック名前空間] の値は既定値のままにしておきます。 [メトリック] 設定を選択して「Telemetry」と入力し、ドロップダウンから [Telemetry messages sent](送信済みテレメトリ メッセージ) を選択します。 [集計] は、自動的に [合計] に設定されます。 グラフのタイトルも変更されることに注意してください。
次に、 [メトリックの追加] を選択して、グラフに別のメトリックを追加します。 [メトリック] で、 [Total number of messages used](使用されているメッセージの合計数) を選択します。 [集計]で、[平均] を選択ます。グラフのタイトルがこのメトリックを含むように変更されたことがわかります。
これで画面には、最小化された [Telemetry messages sent](送信済みテレメトリ メッセージ) のメトリックに加え、新しく [Total number of messages used](使用されているメッセージの合計数) のメトリックが表示されます。
グラフの右上にある [ダッシュボードに保存] を選択し、ドロップダウン リストから [ダッシュボードにピン留めする] を選択します。
[ダッシュボードにピン留め] ペインで、 [既存] タブを選択します。 [プライベート] を選択し、[ダッシュボード] ドロップダウンから [ダッシュボード] を選択します。 最後に、 [ピン留め] を選択して、Azure portal の既定のダッシュボードにグラフをピン留めします。 グラフをダッシュボードにピン留めしていない場合、メトリックス エクスプローラーを終了すると、設定は保持されません。
メトリック アラートを設定する
次に、「Telemetry messages sent (送信済みテレメトリ メッセージ)」と「Total number of messages used (使用されているメッセージの合計数)」の 2 つのメトリックに対してトリガーするアラートを設定します。
「Telemetry messages sent (送信済みテレメトリ メッセージ)」は、メッセージのスループットを追跡し、回避するための優れたメトリックです。 Free レベルの IoT ハブの場合、調整制限は 1 秒あたり 100 メッセージです。単一のデバイスでは、そのようなスループットを達成できないため、代わりに、5 分間でメッセージ数が 1,000 を超えた場合にトリガーするアラートを設定します。 運用環境では、IoT ハブのレベル、エディション、ユニット数に基づいて、このシグナルをより大きな値に設定できます。
"Total number of messages used (使用されているメッセージの合計数) " では、使用されているメッセージの 1 日あたりの数を追跡します。 このメトリックは、毎日 00:00 UTC にリセットされます。 1 日あたりのクォータが特定のしきい値を超えると、IoT ハブはメッセージを受け入れなくなります。 Free レベルの IoT ハブの場合、1 日あたりのメッセージ クォータは 8,000 です。 メッセージの合計数が 4000 (クォータの 50%) を超えた場合にトリガーするアラートを設定します。 実際には、この割合をより大きな値に設定すると考えられます。 1 日あたりのクォータ値は、IoT ハブのレベル、エディション、ユニット数によって異なります。
IoT Hub のクォータと調整制限の詳細については、クォータと調整に関する記事をご覧ください。
メトリック アラートを設定するには、次の手順に従います。
IoT ハブ メニューの [監視] セクションから [アラート] を選択します。
[アラート ルールの作成] を選択します。
[アラート ルールの作成] ペインには、次の 4 つのセクションがあります。
- スコープは IoT ハブに既に設定されているため、このセクションはそのままにしておきます。
- [条件] では、アラートをトリガーするシグナルと条件を設定します。
- [アクション] では、アラートがトリガーされたときの動作を構成します。
- [詳細] では、アラートの名前と説明を設定できます。
まず、アラートがトリガーされる条件を構成します。
[条件] タブが開き [シグナルの選択] ウィンドウが開きます。 シグナル名の検索ボックスに「telemetry」と入力し、[送信されたテレメトリ メッセージ] を選択します。
[シグナル ロジックの構成] ペインで、 [アラート ロジック] の次のフィールドを設定または確認します (グラフは無視してかまいません)。
パラメーター 値 しきい値 静的 [オペレーター] より大きい 集計の種類 合計 しきい値 1000 単位 Count 集計の粒度 (期間) 5 分 評価の頻度 1 分ごと これらの設定により、5 分間のメッセージの数を合計するようにシグナルが設定されます。 この合計が 1 分ごとに評価され、前の 5 分間の合計が 1000 メッセージを超えると、アラートがトリガーされます。
[完了] を選択して、シグナル ロジックを保存します。
[次へ: アクション] を選択してアラートのアクションを構成します。
[アクション グループの作成] を選択します。
[アクション グループの作成] ウィンドウの [基本] タブで、アクション グループの名前と表示名を指定します。
[通知] タブを選択します。 [通知の種類] で、ドロップダウンから [Email/SMS message/Push/Voice](メール/SMS メッセージ/プッシュ/音声) を選択します。 [Email/SMS message/Push/Voice](メール/SMS メッセージ/プッシュ/音声) ペインが開きます。
[Email/SMS message/Push/Voice](メール/SMS メッセージ/プッシュ/音声) ペインで、メールを選択し、メール アドレスを入力して、 [OK] を選択します。
[通知] ペインに戻り、通知の名前を入力します。
(オプション)アクション グループでは、[アクション] タブの [アクションの種類] ドロップダウンには、アラートでトリガーできるアクションの種類が一覧表示されます。 この記事では通知のみを使用するため、このタブの設定は無視してかまいません。
[確認および作成] タブを選択し、設定を確認して、 [作成] を選択します。
アラート ルールの [アクション] タブに戻り、新しいアクション グループがアラートのアクションに追加されていることを確認します。
[次へ: 詳細] を選択して、アラート ルールの詳細を構成し、アラート ルールを保存します。
- [詳細] タブで、アラートの名前と説明を入力します。(例: 「5 分間に 1000 件を超えるメッセージがある場合に警告する」)
[確認と作成] を選択して、アラート ルールの詳細を確認します。 すべてが正しく表示される場合は、[作成] を選択して新しいルールを保存します。
次は、 [Total number of messages used](使用されているメッセージの合計数) 用に、もう 1 つアラートを設定します。 このメトリックは、使用されているメッセージの数が IoT ハブの 1 日あたりのクォータ (IoT ハブがメッセージを拒否し始める時点) に近づきつつあるときにアラートを送信したい場合に役立ちます。 次の違いを除き、前に行った手順に従います。
[シグナル ロジックの構成] ペインのシグナルでは、[Total number of messages used](使用されているメッセージの合計数) を選びます。
[シグナル ロジックの構成] ペインで、次のフィールドを設定または確認します (グラフは無視してかまいません)。
パラメーター 値 しきい値 静的 [オペレーター] より大きい 集計の種類 合計 しきい値 4000 単位 Count 集計の粒度 (期間) 1 分 評価の頻度 1 分ごと これらの設定により、メッセージ数が 4000 に達したときにシグナルを発するように設定されます。 メトリックは 1 分ごとに評価されます。
警告ルールのアクションを指定するときは、前のルールに対して作成したものと同じアクション グループを選択します。
アラートの詳細では、前とは異なる名前と説明を使用します。
IoT ハブの左ペインの [監視] で、 [アラート] を選択します。 次に、[アラート] ウィンドウの上部にあるメニューで、[アラート ルール] を選択します。 [[アラート ルール] ウィンドウが開きます。 次の 2 つのアラートが表示されます。
[アラート ルール] ウィンドウを閉じます。
これらの設定により、5 分以内に 1000 件を超えるメッセージが送信されたときと、使用されているメッセージの合計数が 4000 (Free レベルの IoT ハブの、1 日あたりのクォータの 50%) を超えたときに、アラートがトリガーされ、電子メール通知が送信されます。
シミュレーション済みデバイス アプリを実行する
「リソースを設定する」で、IoT デバイスの使用をシミュレートするために使用するデバイス ID を登録しました。 このセクションでは、device-to-cloud メッセージを IoT ハブに送信するデバイスをシミュレートする .NET コンソール アプリをダウンロードし、これらのメッセージを IoT ハブに送信するようにアプリを構成して実行します。
重要
アラートが IoT Hub によって完全に構成され、有効になるまでに最大 10 分かかることがあります。 最後のアラートを構成してから、シミュレートされたデバイス アプリを実行するまで、少なくとも 10 分お待ちください。
GitHub から Azure IoT C# SDK リポジトリ のソリューションをダウンロードまたは複製します。 このリポジトリには、いくつかのサンプルアプリケーションが含まれています。 このチュートリアルでは、iothub/device/samples/getting started/SimulatedDevice/ を使用します。
ローカル ターミナル ウィンドウで、ソリューションのルート フォルダーに移動します。 次に iothub\device\samples\getting started\SimulatedDeviceWithCommand フォルダーに移動します。
適当なテキスト エディターで SimulatedDevice.cs ファイルを開きます。
s_connectionString
変数の値を、スクリプトを実行してリソースを設定したときに書き留めておいたデバイス接続文字列に置き換えます。SendDeviceToCloudMessagesAsync
メソッドで、Task.Delay
を 1000 から 1 に変更します。これにより、メッセージの送信間隔が 1 秒から 0.001 秒に短縮されます。 この待ち時間を短くすることで、送信されるメッセージの数が増えます。 (1 秒あたり 100 メッセージのメッセージ レートは得られない可能性があります。)await Task.Delay(1);
変更を SimulatedDevice.cs に保存します。
ローカル ターミナル ウィンドウで次のコマンドを実行して、シミュレートされたデバイス アプリケーションに必要なパッケージをインストールします。
dotnet restore
ローカル ターミナル ウィンドウで次のコマンドを実行し、シミュレートされたデバイス アプリケーションをビルドして実行します。
dotnet run
次のスクリーンショットは、シミュレートされたデバイス アプリケーションが IoT Hub にテレメトリを送信したときの出力を示しています。
アプリケーションを少なくとも 10 から 15 分間実行します。 メッセージの送信を停止するまで実行するのが理想的です (約 20 から 30 分)。 これは、IoT ハブの 1 日あたりのメッセージ クォータを超え、それ以上のメッセージの受け入れを停止したときに発生します。
Note
メッセージの送信を停止した後、デバイス アプリを長時間実行したままにすると、例外が発生する場合があります。 この例外を無視し、アプリ ウィンドウを閉じてかまいません。
ダッシュボードにメトリックのグラフを表示する
Azure portal の左上隅にあるポータル メニューを開き、 [ダッシュボード] を選択します。
以前にピン留めしたグラフを見つけ、グラフ データの外側のタイル上の任意の場所をクリックして展開します。 送信済みテレメトリ メッセージと、使用されているメッセージの合計数がグラフに示されます。 グラフの下部に最新の数値が表示されます。 グラフ内でカーソルを移動して、特定の時間のメトリック値を確認できます。 グラフの上部にある時間値と粒度を変更して、データを関心がある期間に絞り込んだり拡大したりすることもできます。
このシナリオでは、シミュレートされたデバイスのメッセージ スループットは、IoT Hub によるメッセージ数の調整が発生するほど大きくありません。 実際に調整を伴うシナリオでは、限られた期間、送信済みテレメトリ メッセージが IoT ハブの調整制限を超える場合があります。 これは、バースト トラフィックに対応するためです。 詳細については、「トラフィック シェイプ」をご覧ください。
アラートを表示する
送信されたメッセージの数がアラート ルールで設定した上限を超えると、電子メール アラートが届き始めます。
アクティブなアラートがあるかどうかを確認するには、IoT ハブの左ペインの [監視] で [アラート] を選択します。 [アラート] ペインには、指定した時間範囲に発生したアラートの数が重大度順に表示されます。
重大度 3 の行を選択します。 [すべてのアラート] ペインが開き、発生した重大度 3 のアラートが一覧表示されます。
アラートのいずれかを選択すると、そのアラートの詳細が表示されます。
受信トレイで Microsoft Azure からの電子メールを確認します。 件名にトリガーされたアラートが記載されています (例: Azure: Activated Severity:3 Alert if more than 1000 messages over 5 minutes)。 本文は次の画像のようになります。
Azure Monitor ログを表示する
「接続とデバイス テレメトリのログを収集する」で、接続とデバイス テレメトリの操作について、IoT ハブによって出力されたリソース ログを Azure Monitor ログに送信するための診断設定を作成しました。 このセクションでは、Azure Monitor ログに対して Kusto クエリを実行して、発生したエラーを監視します。
Azure portal の IoT ハブの左ペインにある [監視] で [ログ] を選択します。 最初の [クエリ] ウィンドウが開いた場合は閉じます。
[新しいクエリ] ペインで、 [クエリ] タブを選択し、 [IoT Hub] を展開して既定のクエリの一覧を表示します。
[エラーの概要] クエリを選択します。 クエリ エディター ペインにクエリが表示されます。 エディター ペインで [実行] を選択し、クエリ結果を確認します。 行のいずれかを展開すると、詳細が表示されます。
注意
エラーが表示されない場合は、 [Recently connected devices](最近接続されたデバイス) クエリを実行してみてください。 これにより、シミュレートされたデバイスの行が返されます。
リソースをクリーンアップする
このチュートリアルで作成したリソースをすべて削除するには、リソース グループを削除します。 これにより、そのグループ内に含まれているすべてのリソースも削除されます。 ここでは、IoT ハブ、Log Analytics ワークスペース、およびリソース グループ自体が削除されます。 メトリックのグラフをダッシュボードにピン留めしている場合は、それらを手動で削除する必要があります。各グラフの右上隅にある 3 つのドットをクリックし、 [削除] を選択します。 グラフを削除したら、必ず変更を保存してください。
リソース グループを削除するには、az group delete コマンドを使います。
az group delete --name ContosoResources
次のステップ
このチュートリアルでは、次のタスクを実行することで、IoT Hub のメトリックとログの使用方法を学習しました。
- Azure CLI を使用して IoT ハブを作成し、シミュレートされたデバイスを登録して、Log Analytics ワークスペースを作成する。
- IoT Hub の接続およびデバイス テレメトリ リソース ログを、Log Analytics ワークスペース内の Azure Monitor ログに送信する。
- メトリックス エクスプローラーを使用して、選択したメトリックに基づいてグラフを作成し、ダッシュボードにピン留めする。
- 重要性の高い状態が生じたときに電子メールで通知を受け取ることができるように、メトリック アラートを作成する。
- IoT ハブにメッセージを送信する IoT デバイスをシミュレートするアプリをダウンロードして実行する。
- 特定の条件に合致したときにアラートを表示する。
- メトリックのグラフをダッシュボード上に表示する。
- Azure Monitor ログに IoT Hub のエラーと操作を表示する。
次のチュートリアルにでは、IoT Hub の障害復旧機能をテストする方法について説明します。