メトリックの収集と転送

適用対象:IoT Edge 1.4 checkmark IoT Edge 1.4

重要

IoT Edge 1.4 がサポートされているリリースです。 以前のリリースの場合は、「IoT Edge を更新する」を参照してください。

Azure Monitor と組み込みのメトリックの統合を使用すると、IoT Edge フリートをリモートで監視できます。 デバイスでこの機能を有効にするには、metrics-collector モジュールをデプロイに追加し、モジュールのメトリックを収集して Azure Monitor に転送するように構成します。

IoT Edge デバイスで監視を構成するには、「チュートリアル: IoT Edge デバイスを監視する」に従います。 メトリック コレクター モジュールをデバイスに追加する方法について説明します。 この記事では、監視アーキテクチャの概要と、デバイスでメトリックを構成するためのオプションについて説明します。

IoT Edge と Azure Monitor の統合 (4:06)

アーキテクチャ

Screenshot of the metrics monitoring architecture with IoT Hub.

Note 説明
1 すべてのモジュールは、Prometheus データ モデルを使用してメトリックを出力する必要があります。 組み込みのメトリックを使用すると、既定で広範なワークロードの可視化が可能になりますが、カスタム モジュールを使用し、シナリオ固有のメトリックを出力して監視ソリューションを強化することもできます。 オープンソース ライブラリを使用してカスタム モジュールをインストルメントする方法については、「カスタム メトリックを追加する」を参照してください。
2️ metrics-collector モジュールは、ワークロード モジュールのメトリックを収集し、それらをオフデバイスに転送する、Microsoft が提供する IoT Edge モジュールです。 メトリック コレクションでは "プル" モデルが使用されます。 収集頻度、エンドポイント、フィルターは、モジュールから送信されるデータを制御するように構成できます。 詳細については、この記事の後半の「メトリック コレクターの構成」セクションを参照してください。
3️ metrics-collector モジュールからクラウドにメトリックを送信するには、2 つのオプションがあります。 "オプション 1" では、メトリックが Log Analytics に送信されます 1。収集されたメトリックは、InsightsMetrics という固定のネイティブ テーブルを使用して、指定された Log Analytics ワークスペースに取り込まれます。 このテーブルのスキーマは、Prometheus メトリック データ モデルと互換性があります。

このオプションを使用するには、送信ポート 443 でワークスペースにアクセスする必要があります。 Log Analytics ワークスペースの ID とキーは、モジュール構成の一部として指定する必要があります。 制限付きネットワークで有効にするには、この記事の後半の「制限付きネットワーク アクセス シナリオで有効にする」を参照してください。
4️ 各メトリック エントリには、モジュール構成の一部として指定された ResourceId が含まれています。 この関連付けにより、指定したリソース (たとえば、IoT Hub) に自動的にメトリックがリンクされます。 その結果、キュレーション IoT Edge ブック テンプレートでは、リソースに対してクエリを発行することでメトリックを取得できます。

また、この方法では、複数の IoT Hub で 1 つの Log Analytics ワークスペースをメトリック データベースとして安全に共有することもできます。
5️ "オプション 2" では、メトリックが IoT Hub に送信されます 1。コレクター モジュールは、収集されたメトリックを UTF-8 でエンコードされた JSON device-to-cloud メッセージとして edgeHub モジュール経由で送信するように構成できます。 このオプションを使用すると、IoT Hub エンドポイントへの外部アクセスのみを許可されている、ロックダウンされた IoT Edge デバイスの監視のロックが解除されます。 また、子デバイスが親デバイスにのみアクセスできる入れ子になった構成内の子 IoT Edge デバイスを監視することもできます。
6️ IoT Hub を使用してメトリックをルーティングする場合は、(1 回限りの) クラウド ワークフローを設定する必要があります。 このワークフローでは、metrics-collector モジュールから受信したメッセージを処理し、Log Analytics ワークスペースに送信します。 このワークフローを使用すると、この省略可能なパスを介して受信したメトリックに対しても、キュレーションされた視覚化アラートの機能が有効になります。 このクラウド ワークフローを設定する方法の詳細については、「IoT Hub を通じてメトリックをルーティングする」セクションを参照してください。

1 現在、"オプション 1" を使用して IoT Edge デバイスから Log Analytics にメトリックを直接転送する方が、必要なセットアップが最小限となる簡単なパスです。 特定のシナリオで IoT Edge デバイスが IoT Hub とのみ通信する "オプション 2" のアプローチが必要な場合を除いて、1 つ目のオプションが推奨されます。

メトリック コレクター モジュール

Microsoft 提供の metrics-collector モジュールを IoT Edge デプロイに追加して、モジュール メトリックを収集し、それらを Azure Monitor に送信できます。 モジュール コードはオープンソースであり、IoT Edge GitHub リポジトリで利用できます。

metrics-collector モジュールは、Linux X64、ARM32、ARM64、Windows X64 (バージョン 1809) をサポートするマルチアーキテクチャの Docker コンテナー イメージとして提供されます。 これは、mcr.microsoft.com/azureiotedge-metrics-collector で一般公開されています。

また、IoT Edge のモジュール マーケットプレースでも利用できます。

メトリック コレクターの構成

metrics-collector のすべての構成は、環境変数を使用して行われます。 少なくとも、この表で「必須」とマークされている変数は指定する必要があります。

Environment variable name 説明
ResourceId デバイスが通信する IoT Hub のリソース ID。 詳細については、「リソース ID」セクションを参照してください。

必須

既定値: none
UploadTarget メトリックを HTTPS 経由で Azure Monitor に直接送信するか、D2C メッセージとして IoT Hub に送信するかを制御します。 詳細については、「ターゲットをアップロードする」を参照してください。

AzureMonitor または IoTMessage のいずれかを指定できます

不要

既定値: AzureMonitor
LogAnalyticsWorkspaceId Log Analytics ワークスペース ID

UploadTargetAzureMonitor の場合にのみ必須

既定値: none
LogAnalyticsSharedKey Log Analytics ワークスペース キー

UploadTargetAzureMonitor の場合にのみ必須

既定値: none
ScrapeFrequencyInSecs メトリックを収集して転送する定期的な実行間隔 (秒)。

例: 600

不要

既定値: 300
MetricsEndpointsCSV Prometheus メトリックを収集するエンドポイントのコンマ区切りの一覧。 メトリックを収集するモジュール エンドポイントはすべて、この一覧に含まれている必要があります。

例: http://edgeAgent:9600/metrics, http://edgeHub:9600/metrics, http://MetricsSpewer:9417/metrics

不要

既定値: http://edgeHub:9600/metrics, http://edgeAgent:9600/metrics
AllowedMetrics 収集するメトリックの一覧。他のメトリックはすべて無視されます。 空の文字列に設定すると無効になります。 詳細については、「許可リストと禁止リスト」を参照してください。

例: metricToScrape{quantile=0.99}[endpoint=http://MetricsSpewer:9417/metrics]

不要

既定値: ""
BlockedMetrics 無視するメトリックの一覧。 AllowedMetrics をオーバーライドします。そのため、メトリックが両方の一覧に含まれている場合、そのメトリックは報告されません。 詳細については、「許可リストと禁止リスト」を参照してください。

例: metricToIgnore{quantile=0.5}[endpoint=http://VeryNoisyModule:9001/metrics], docker_container_disk_write_bytes

不要

既定値: ""
CompressForUpload メトリックをアップロードするときに圧縮を使用する必要があるかどうかを制御します。 すべてのアップロード ターゲットに適用されます。

例: true

不要

既定値: true
AzureDomain メトリックを Log Analytics に直接取り込むときに使用する最上位の Azure ドメインを指定します。

例: azure.us

不要

既定値: azure.com

Resource ID

metrics-collector モジュールには、IoT Edge デバイスが属する IoT Hub の Azure Resource Manager ID が必要です。 ResourceID 環境変数の値としてこの ID を指定します。

リソース ID の形式は次のとおりです。

/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Devices/IoTHubs/<iot hub name>

リソース ID は、Azure Portal 内の IoT Hub の [プロパティ] ページにあります。

Screenshot the shows how to retrieve your resource ID from the IoT Hub properties.

または、次のように az resource show コマンドを使用して ID を取得します。

az resource show -g <resource group> -n <hub name> --resource-type "Microsoft.Devices/IoTHubs"

ターゲットをアップロードする

UploadTarget 構成オプションでは、メトリックを Azure Monitor に直接送信するか、IoT Hub に送信するかが制御されます。

UploadTargetIoTMessage に設定した場合、モジュール メトリックは IoT メッセージとして発行されます。 これらのメッセージは、エンドポイント /messages/modules/<metrics collector module name>/outputs/metricOutput から UTF8 でエンコードされた json として出力されます。 たとえば、IoT Edge メトリック コレクター モジュールが IoTEdgeMetricsCollector という名前の場合、エンドポイントは /messages/modules/IoTEdgeMetricsCollector/outputs/metricOutput です。 形式は次のとおりです。

[{
    "TimeGeneratedUtc": "<time generated>",
    "Name": "<prometheus metric name>",
    "Value": <decimal value>,
    "Label": {
        "<label name>": "<label value>"
    }
}, {
    "TimeGeneratedUtc": "2020-07-28T20:00:43.2770247Z",
    "Name": "docker_container_disk_write_bytes",
    "Value": 0.0,
    "Label": {
        "name": "AzureMonitorForIotEdgeModule"
    }
}]

許可リストと禁止リスト

AllowedMetricsBlockedMetrics の構成オプションは、メトリック セレクターのスペースまたはコンマ区切りの一覧です。 メトリックは一覧と照合され、いずれかの一覧の 1 つまたは複数のメトリックに一致した場合は、追加または除外されます。

メトリック セレクターでは、PromQL クエリ言語のサブセットに似た形式を使用します。

metricToSelect{quantile=0.5,otherLabel=~Re[ge]*|x}[http://VeryNoisyModule:9001/metrics]

メトリック セレクターは、次の 3 つの部分で構成されます。

メトリック名 (metricToSelect)。

  • メトリック名には、ワイルドカード * (任意の文字列) と ? (任意の 1 文字) を使用できます。 たとえば、*CPUmaxCPUminCPU に一致しますが、CPUMaximum とは一致しません。 ???CPUmaxCPUminCPU に一致しますが、maximumCPU とは一致しません。
  • メトリック セレクターのこのコンポーネントは必須です。

ラベルに基づくセレクター ({quantile=0.5,otherLabel=~Re[ge]*|x})。

  • 中かっこには複数のメトリック値を含めることができます。 複数の値はコンマで区切る必要があります。
  • セレクター内の少なくともすべてのラベルが存在し、一致する場合にメトリックが一致します。
  • PromQL と同様に、次の照合演算子を使用できます。
    • = は、指定された文字列と厳密に等しいラベルに一致します (大文字と小文字が区別されます)。
    • != は、指定された文字列と厳密に等しくはないラベルに一致します。
    • =~ は、ラベルを指定された正規表現に一致させます。 例: label=~CPU|Mem|[0-9]*
    • !~ は、指定された正規表現に適合しないラベルに一致します。
    • 正規表現は完全に固定されます (各正規表現の先頭と末尾には、^$ が自動的に追加されます)。
    • メトリック セレクターのこのコンポーネントはオプションです。

エンドポイント セレクター ([http://VeryNoisyModule:9001/metrics])。

  • URL は、MetricsEndpointsCSV に示されている URL と完全に一致している必要があります。
  • メトリック セレクターのこのコンポーネントはオプションです。

メトリックは、選択されたセレクターのすべての部分に一致する必要があります。 これは名前が一致し、"なおかつ" 同じラベルの値がすべて一致し、"なおかつ" 指定されたエンドポイントから取得されている必要があります。 たとえば、mem{quantile=0.5,otherLabel=foobar}[http://VeryNoisyModule:9001/metrics] はセレクター mem{quantile=0.5,otherLabel=~foo|bar}[http://VeryNoisyModule:9001/metrics] と一致しません。 複数のセレクターを使用すると、「かつ」のような動作ではなく、「または」のような動作が作成されます。

たとえば、カスタム メトリック mem にはモジュール module1 のすべてのラベルを許可するが、module2 の同じメトリックにはラベル agg=p99 のみを許可するには、AllowedMetrics に次のセレクターを追加します。

mem{}[http://module1:9001/metrics] mem{agg="p99"}[http://module2:9001/metrics]

または、すべてのラベルまたはエンドポイントにカスタム メトリック memcpu を許可するには、AllowedMetrics に次を追加します。

mem cpu

制限付きネットワーク アクセス シナリオで有効にする

メトリックを Log Analytics ワークスペースに直接送信している場合は、次の URL への発信アクセスを許可します。

  • https://<LOG_ANALYTICS_WORKSPACE_ID>.ods.opinsights.azure.com/*
  • https://<LOG_ANALYTICS_WORKSPACE_ID>.oms.opinsights.azure.com/*

プロキシに関する考慮事項

metrics-collector モジュールは .NET Core で記述されています。 そのため、システム モジュールと同じガイダンスを使用して、プロキシ サーバー経由の通信を許可します。

ローカル モジュールからのメトリックの収集には、http プロトコルを使用します。 NO_PROXY 環境変数を設定することによって、プロキシ サーバー経由の通信からローカル通信を除外します。

NO_PROXY の値を、除外するホスト名のコンマ区切りの一覧に設定します。 ホスト名にはモジュール名を使用します。 例: edgeHub,edgeAgent,myCustomModule

ルート メトリック

メトリックを Log Analytics に直接送信するのではなく、IoT Hub を介して取り込む必要がある場合があります。 たとえば、入れ子になった構成で IoT Edge デバイスを監視するときに、子デバイスが親デバイスの IoT Edge ハブにのみアクセスできるようにする場合などです。 もう 1 つの例は、IoT Hub に対してのみ送信ネットワーク アクセスを有効にした IoT Edge デバイスをデプロイする場合です。

このシナリオで監視を有効にするために、metrics-collector モジュールは、edgeHub モジュールを介して device-to-cloud (D2C) メッセージとしてメトリックを送信するように構成できます。 この機能を有効にするには、コレクター構成UploadTarget 環境変数を IoTMessage に設定します。

ヒント

コレクター モジュールから IoT Hub にメトリック メッセージを配信するために、必ず edgeHub ルートを追加してください。 FROM /messages/modules/replace-with-collector-module-name/* INTO $upstream のように表示されます。

このオプションを選択すると、IoT Hub に到着したメトリック メッセージを Log Analytics ワークスペースに配信するための追加の設定 (クラウド ワークフロー) が必要になります。 この設定がないと、キュレーションされた視覚化アラートなど、統合のもう 1 つの部分は機能しません。

Note

このオプションを使用する場合は、追加のコストに注意してください。 メトリック メッセージは、IoT Hub メッセージ クォータに対してカウントされます。 また、Log Analytics インジェストとクラウド ワークフロー リソースに対しても課金されます。

サンプル クラウド ワークフロー

IoT Hub から Log Analytics にメトリック メッセージを配信するクラウド ワークフローは、IoT Edge のログ記録と監視のサンプルの一部として利用できます。 このサンプルは、既存のクラウド リソースにデプロイすることも、運用環境のデプロイの参照として使用することもできます。

次のステップ

Azure Monitor によって有効になるキュレーションされた視覚化の種類を探索します。