Azure IoT Hubまわりの監視の基礎

# はじめに
この記事では、AzureのIoT Hubの監視について、基本的な内容をまとめています。
個々の詳細に関しては、都度参考となるドキュメントへのリンクを貼ることで省略していきます。
マイクロソフトのドキュメントは膨大に存在していて自分が知りたい情報にたどり着くのに苦労することも多いかと思います。
ドキュメントを探す前段の情報としてご利用いただけますと幸いです。

主に以下を前提として記述しています。

- IoT HubはS1を1ユニット、東日本リージョンに作成
- Azureポータル内、作成したIoT Hubの画面を見ている
- デバイスを1つだけ作成


# Azureの監視で全員が必ず知るべき主となる2種類の情報
Azureの監視は2種類存在すると、とりあえず覚えてください。
ガバナンス、コスト、セキュリティ、監査、「そもそもAzure動いてるのか？？」等々"監視"のひとことに色々と入るのですが、必ず全員が知っておくべき2つを取り上げます。

- メトリック：個々のサービス上で収集される(主に時系列で確認する)状態
- リソースログ：個々のサービス上で発生するイベント情報

## メトリック
VMであれば「CPU使用率は37％です」とか、WebAppsであれば「リクエストが312回ありました」といった、指定期間内のサービスの状態を収集できます。
時系列での状態の遷移を知ることは重要です。
IoT Hubについても同様に、単位時間当たりに発生した数やサイズを収集しています。
たとえば、メッセージの数とか接続しているデバイスの数などです。
[Azure IoT Hub の監視データのリファレンス - メトリック](https://docs.microsoft.com/ja-jp/azure/iot-hub/monitor-iot-hub-reference#metrics)


## リソースログ
VMであれば「IIS動きましたよ」とか、WebAppsであれば「500エラー返しましたよ」といった、個々のサービス内で発生したイベントが発行されています。
イベントの内容と時刻を知ることは重要です。
IoT Hubについても同様に、内部で発生したイベントを収集しています。
たとえば、デバイス認証の有効期限切れやスロットリング(上限値到達)エラーなどです。
[Azure IoT Hub の監視データのリファレンス - リソースログ](https://docs.microsoft.com/ja-jp/azure/iot-hub/monitor-iot-hub-reference#resource-logs)

# IoT Hubの監視概要

ドキュメントはこちらを参照ください。
[Azure IoT Hub の監視](https://docs.microsoft.com/ja-jp/azure/iot-hub/monitor-iot-hub)

ドキュメント記載の監視に関する情報を個人的見解でまとめると以下です。

- "概要"タブで簡単に見える
- きちんと見るにはMonitorと連携する
- 収集するデータは"診断設定"タブで選択できる
- 収集データのルーティング(配信・保存)先は"診断設定"タブで選択できる
- "メトリック"タブと"ログ"タブで各々のデータを見ることができる
- ログをトリガーに外部で処理を動かすならAzure Event Hubsにルーティングすると良い
- Monitorの情報はタイムラグもあるしデータの到着順序の保証も無い前提で使う
- 個々のデバイスの接続状態をシビアに検出するシナリオでは、Azure Event Gridを使うと良い

# "概要"タブを確認
IoT Hubにおいて、もっとも簡単に監視する方法は"概要"タブにあります。
↓作成直後のIoT Hubの"概要"タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/e99b9361-97fe-07d8-49af-ed2b452cc470.png)
これを見るだけでも、とりあえず1日に収集できるメッセージ数には上限があることがわかります。上限はレベルとユニット数によって決定しています。
[Azure IoT Hub の価格](https://azure.microsoft.com/ja-jp/pricing/details/iot-hub/)
[参照 - IoT Hub のクォータと調整](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-quotas-throttling)
状況に応じてスケールさせることができますし、オートスケールの仕掛けを組み込むことも可能です。
[Auto-scale your Azure IoT Hub](https://docs.microsoft.com/ja-jp/samples/azure-samples/iot-hub-dotnet-autoscale/iot-hub-dotnet-autoscale/) ← 公式はこれだけど、もっと楽にできそうな気がする


# 監視データを連携してみる
監視データを収集するには、**"どのデータ"**を**"どこに貯める"**のか決定しなければなりません。
この選択は"診断設定"タブで実現できると記載がありましたので確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/531a8e6c-4b3a-9254-f94d-788f7b8707fe.png)
初期状態では何も設定されていませんが、診断設定は複数の設定が可能であることはわかります。
画面中央**"+ 診断設定を追加する"**をクリックして設定を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/461c12e3-bf40-612f-949f-11550b3c4451.png)
左側"カテゴリの詳細"を使い**何を**収集するのか選択、右側"宛先の詳細"を使い**どこに**収集するのかを選択します。
カテゴリはログの種類とメトリックを収集するか否かが選択できます。(メトリックは"AllMetrics"のみ)

診断設定の詳細はこちらを参照ください。
[プラットフォーム ログとメトリックを異なる宛先に送信するための診断設定を作成する](https://docs.microsoft.com/ja-jp/azure/azure-monitor/essentials/diagnostic-settings)

各々のログとメトリックの説明はこちらを参照ください。
[Azure IoT Hub の監視データのリファレンス](https://docs.microsoft.com/ja-jp/azure/iot-hub/monitor-iot-hub-reference)

## Monitorと連携
IoT Hubを生成した時から連携されているメトリックもありますが、そうではないメトリック、もしくはログについても連携をしたいと思います。
連携にはLog Analytics ワークスペース(Monitor内の保管場所だと理解ください)が必要になりますので新規作成します。
[Log Analytics ワークスペースの作成](https://docs.microsoft.com/ja-jp/azure/azure-monitor/essentials/quick-collect-activity-log-portal#create-a-log-analytics-workspace)
※診断設定はこのあと実施しますので、作成だけ実施してください

作成が終わりましたら、今一度IoT Hubに戻り、画面中央**"+ 診断設定を追加する"**をクリックして診断設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/ab431dd6-07d6-46fb-bb55-ebf48d0f8770.png)
今回はログとして"Connections"と"DeviceTelemetry"を、メトリックは"AllMetrics"を指定し、Log Analytics ワークスペースに流し込むように設定しました。

あとはデバイスなどを動作させたのち、"メトリック"タブもしくは"ログ"タブから情報を確認しましょう。

## "メトリック"タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/e5834852-f09f-7372-9839-f27f382616c0.png)
こんな感じの画面が出てくると思いますので、必要なメトリックを選択し、また右上の時間軸を自分に合う形に変えて確認ください。
見えるのは"概要"タブの内容と同じレベル感のデータとなります。
デバイスからメッセージ送信した数分後とかでしたら、メトリックに"Telemetry messages sent"、時間軸を"30分"などに変えて見ていただけたらと思います。

## "ログ"タブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/7b2629b5-5046-0bff-5597-bd6ea0ea37da.png)
こんな感じの画面が出てきたら、お勧めのクエリを選択するとすぐに結果を確認できます。
とりあえずログを眺めたい場合は、お勧めクエリを閉じてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/279ca3f3-9897-e3d0-78dd-e655dbba1d3b.png)
簡単に説明しますと、左下のテーブルとカラムが出力候補、それらを使って右上に**Kusto**といわれるクエリを書いて実行します。
"Azure Diagnostics"をダブルクリックして実行ボタンをダブルクリックした結果、このようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/723267dc-1173-fdf8-3a27-a73236847738.png)
接続のエラーを繰り返していることが確認できました。（そういうのを投げ込んでおきました。）

今度はAzureMetricsを確認します。メトリックもLog Analytics ワークスペースに収集したので確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/ca4955f7-a954-cee3-92af-aa206d045da6.png)
実際にご自身で確認いただくとわかるのですが、"devices.totalDevices","totalDeviceCount","dailyMessageQuotaUsed"の３つが延々と出てきてしまいますので、とりあえずの確認にも不適です。
この３つを簡単に除外したいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/6f6ba491-72dc-dff1-891f-9a1f103b3d32.png)
1. クエリ結果の左端にある" > "をクリックして行を展開する
2. "MetricName"というカラムを探し、上記３つのどれかであることを確認、カラム名の左側にフォーカスすると" ・・・ "が出るのでクリックする
3. "～～を除外する"という選択肢をクリックする
これを3項目に繰り返すと、クエリが変更されていることが確認できると思いますので実行してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/bd4abad9-60ca-3c04-ccc0-7507a0c1462b.png)
結果が使えるか否かでいえば使えませんが、とりあえず**Kusto**を使ってMetricsを検索しました。

Kustoに関する説明はこちらを参照ください。
[Kusto クエリの概要](https://docs.microsoft.com/ja-jp/azure/data-explorer/kusto/query/)

# Event Hubsと連携
"サードパーティー製品やSIEM等と連携動作をする場合にはEvent Hubsから連携すると良いよ"とドキュメントに記載がありました。
が、ここは省略します。
Monitor(Log Analytics ワークスペース)と連携した時と同様にEvent Hubsと連携するだけですし、データの呼び出しはEvent Hubsのお話しですので省略したいと思います。

参考
[Azure IoT Hub の監視 - Azure Event Hubs からのログの読み取り](https://docs.microsoft.com/ja-jp/azure/iot-hub/monitor-iot-hub#read-logs-from-azure-event-hubs)
[クイック スタート:Azure portal を使用したイベント ハブの作成](https://docs.microsoft.com/ja-jp/azure/event-hubs/event-hubs-create)
[Azure Event Hubs との間でイベントを送受信する - .NET (Azure.Messaging.EventHubs) - 受信イベント](https://docs.microsoft.com/ja-jp/azure/event-hubs/event-hubs-dotnet-standard-getstarted-send#receive-events)

# Event Gridと連携
「デバイス**達**とIoT Hubが**おおよそ良い感じに**接続しているか？」を知りたいのであれば、Monitor等でデータを確認すれば問題無いかと思います。
しかし中には「**あの**デバイスが**今**つながって**いる**のか**いない**のか」を知りたいシナリオも存在するのではないでしょうか？
自社の工場のデバイスや、特定のお客様に提供しているデバイスなど、ざっくり言うと"相手の顔が見える"シナリオが想定されます。
このようなシナリオにおいて、たとえば"Connect"と"Disconnect"がサービス上重要な場合は、Event Gridを使います。

Event Gridに関する説明はこちらを参照ください。
[Azure Event Grid とは](https://docs.microsoft.com/ja-jp/azure/event-grid/overview)

詳細はマイクロソフトのドキュメントを参照いただくとして、さわりを少しだけやってみたいと思います。

## 利用開始画面の確認
IoT Hubの"イベント"タブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/b562963e-108c-69d4-0f65-620537749c14.png)
イベント画面を少しスクロールすると、以下のような画面も見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/fc3f95e5-548b-17e1-7f79-c148f6c28a76.png)
Event Gridの作成では、上の"＋ イベント サブスクリプション"をクリックするか、下の個々のサービスをクリックします。
合計９パターン準備されていますが、webhookがあるのでイベント通知先は無限に存在します。
また"はじめに"タブとは別に"イベントサブスクリプション"タブが存在するので、複数のイベント通知が作成可能であることがわかります。
取得可能なイベントは以下の5つです。

- デバイスの作成
- デバイスの削除
- デバイスの接続
- デバイスの切断
- テレメトリの送信 ←後述

## 基本的な流れ
- イベントをPushする先を作成する
- Event Gridのイベントサブスクリプションを作成する
- イベントサブスクリプション作成時に、対象イベントとPush先を指定する

基本的な流れはこのようになります。
Logic Appsだけ少し雰囲気が異なりますので、今回はLogic Appsで始めてみます

## Logic Appsの場合
左記の画面で"Logic Apps"をクリックすると、Logic Appsのデザイナー画面が開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/586a4bc4-667f-c0cc-2437-a2c801259ad2.png)
サインインを実施し、"続行"ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/0a99db19-4ef4-e967-442f-1743c0a54908.png)
リソースの種類を"Microsoft.Devices.IoTHubs"に変更し、対象とするイベントを選択します。
今回は"Microsoft.Devices.DeviceDisconnected"を選択したいと思います。
複数のイベントを選択する場合は、"＋ 新しい項目の追加"をクリックし同様にイベントを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/d5aff1ae-ef3c-2d4d-8ed4-aa6bff5abd0f.png)
"＋ 新しいステップ"をクリックし、AzureDevOpsに接続してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/77bfd2f1-c1bf-a2ff-7447-7cf0c67cac45.png)
完成形はこのような形です。デバイス接続が切れたらAzureDevOpsにIssueアイテムを発行しました。運用時の記録をAzureDevOpsで実施している想定です。
例えばメール通知等に関しては、AzureDevOpsに任せてしまうことができます。必要であれば、後続のアクションとして何かの通知を加えても良いかと思います。
"Add new parameter"すれば、もっと多くの情報を追加できるかと思います。例えば運用に特化した区分パスに投げ込むとかが考えられます。
保存し、実際にデバイス接続を切断してみました。
するとイベント発火し、以下のようにIssueアイテムが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/bd85cabd-3e38-7e42-13e2-c8a1c02c6fe9.png)
実際に運用するときは、このIssueアイテムに情報を追記して、最終的に問題が解消するまでの記録を残し、最後にアイテムをCloseすることになると思います。

## Logic Apps 以外
Logic Apps以外は基本的にすべて同じ以下の画面にたどり着きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439826/a48ed24d-9484-3c53-d667-b56b0bc07f49.png)
こちらでは様々な情報を追加できます。
各種設定はEvent Gridのドキュメントを参照ください。(作成画面に表示される各"詳細情報"のリンクからいくと楽できます。)


## テレメトリの送信イベントに関連して
テレメトリの送信イベントの利用は、個人的にはお勧めしていません。
EventGridは順序保証もありませんし、通過する情報はイベントだけです。実際のテレメトリの内容ではありません。
以下の情報を参考に、何を処理したいのか、コストはどうなるのかを比較検討いただけたらと思います。
[IoT Hub のメッセージ ルーティングと Event Grid の比較](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-event-grid-routing-comparison)

## IoT HubとEvent Gridに関して詳細
詳細はこちらをご確認ください。
[Event Grid を使用し IoT Hub のイベントに対応してアクションをトリガーする](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-event-grid) ←利用に際しての注意事項も記載されています
[Azure IoT Hub から Azure Cosmos DB を使用してデバイス接続イベントを順序付ける](https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-how-to-order-connection-state-events)


# その他ドキュメントへのリンク
今回はご紹介できませんでしたが、必要な情報は多々存在します。
開発中は見ないフリしたいけど知ってないと運用で困りそうなものを中心にドキュメントへのリンクを掲載します。
監視系に関連しそうなものを思いつくままに羅列していますので、抜け漏れある参考情報だと思ってご確認いただけますと幸いです。

## ガバナンスやコストなど
開発というよりも、Azureを使い始める前に必要そうな情報
[Azure ガバナンスのドキュメント](https://docs.microsoft.com/ja-jp/azure/governance/)
[Azure Policy のドキュメント](https://docs.microsoft.com/ja-jp/azure/governance/policy/)
[Azure Cost Management および Billing のドキュメント](https://docs.microsoft.com/ja-jp/azure/cost-management-billing/)
[リージョン別の利用可能な製品](https://azure.microsoft.com/ja-jp/global-infrastructure/services/)
[料金計算ツール](https://azure.microsoft.com/ja-jp/pricing/calculator/)

## セキュリティについて知りたい
[Azure のセキュリティのドキュメント](https://docs.microsoft.com/ja-jp/azure/security/)
[Azure セキュリティの技術的な機能](https://docs.microsoft.com/ja-jp/azure/security/fundamentals/technical-capabilities)
[Azure セキュリティのログと監査](https://docs.microsoft.com/ja-jp/azure/security/fundamentals/log-audit)
[Azure Security Center](https://azure.microsoft.com/ja-jp/services/security-center/)
[Azure Defender](https://azure.microsoft.com/ja-jp/services/azure-defender/)
[Azure Defender for IoT](https://docs.microsoft.com/ja-jp/azure/defender-for-iot/)

## Azureそのものの状態を知りたい
[Azure Service Health のドキュメント](https://docs.microsoft.com/ja-jp/azure/service-health/)
[Azure の状態](https://status.azure.com/ja-jp/status)

## Microsoft Learn
[アラートとメトリックを使用して Azure IoT Hub を管理する](https://docs.microsoft.com/ja-jp/learn/modules/manage-azure-iot-hub-with-metrics-alerts/)

# さいごに
IoT Hub監視系のドキュメントを読むためのドキュメントを書いてみました。
みなさまのIoT Hub利用の一助となれば幸いです。