この記事では、REST API を使用して、Azure リソースのカスタム メトリックを Azure Monitor メトリック ストアに送信する方法について説明します。 メトリックがAzure Monitorされている場合は、標準メトリックを使用して行うすべての操作を実行できます。 たとえば、グラフやアラートを生成し、メトリックを他の外部ツールにルーティングできます。
注
REST API では、Azure リソースのカスタム メトリックの送信のみが許可されます。 他の環境またはオンプレミスにあるリソースのメトリックを送信するには、Application Insights を使用します。
REST 要求を送信してカスタム メトリックを取り込む
カスタム メトリックをAzure Monitorに送信する場合、メトリックで報告される各データ ポイントまたは値には、次の情報が含まれている必要があります。
認証
Azure Monitorにカスタム メトリックを送信するには、メトリックを送信するエンティティに、要求の Bearer ヘッダーに有効なMicrosoft Entra トークンが必要です。 有効なベアラー トークンを取得するには、次の方法がサポートされています。
Azure リソースの管理 ID。 マネージド ID を使用して、特定の操作を実行するためのアクセス許可をリソースに付与できます。 たとえば、自身に関するメトリックをリソースが出力できるようにします。 リソースまたはそのマネージド ID には、別のリソースに対する Monitoring Metrics Publisher アクセス許可を付与できます。 このアクセス許可を付与すると、そのマネージド ID で他のリソースのメトリックも生成できるようになります。
Microsoft Entra サービス プリンシパル。 このシナリオでは、Microsoft Entra アプリケーションまたはサービスに、Azure リソースに関するメトリックを出力するアクセス許可を割り当てることができます。 要求を認証するには、Azure Monitor Microsoft Entra公開キーを使用してアプリケーション トークンを検証します。 既存の Monitoring Metrics Publisher ロールには既にこのアクセス許可があります。 Azure ポータルで使用できます。
サービス プリンシパルには、カスタム メトリックを出力するリソースに応じて、必要なスコープで Monitoring Metrics Publisher ロールを指定できます。 (たとえば、サブスクリプション、リソース グループ、または特定のリソース)。
ヒント
カスタム メトリックを出力するMicrosoft Entra トークンを要求する場合は、トークンが要求される対象ユーザーまたはリソースが https://monitoring.azure.com/ であることを確認します。 必ず、末尾のスラッシュを含めるようにしてください。
承認トークンを取得する
マネージド ID またはサービス プリンシパルを作成し、Monitoring Metrics Publisher アクセス許可を割り当てると、承認トークンを取得できます。
トークンを要求するときは、resource: https://monitoring.azure.com を指定します。
次のいずれかの方法を使用して認証トークンを取得します。
- CLI
- REST API
- SDK
REST 要求を使用してトークンを取得する
トークンを取得するには、次の REST API 呼び出しを使用します。 この要求では、クライアント ID とクライアント シークレットを使用して要求を認証します。 クライアント ID とクライアント シークレットは、アプリケーションを Microsoft Entra ID に登録するときに取得されます。 詳細については、「承認トークンを要求し、API を操作するために、アプリを登録する」を参照してください。
curl -X POST 'https://login.microsoftonline.com/<tennant ID>/oauth2/token' \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id=<your apps client ID>' \
--data-urlencode 'client_secret=<your apps client secret' \
--data-urlencode 'resource={resource URI of the service you want to access, e.g. https://monitoring.azure.com>'}'
応答本文は、次の形式で表示されます。
{
"token_type": "Bearer",
"expires_in": "86399",
"ext_expires_in": "86399",
"expires_on": "1672826207",
"not_before": "1672739507",
"resource": "{resource URI of the service you want to access, e.g. https://monitoring.azure.com>'}",
"access_token": "eyJ0eXAiOiJKV1Qi....gpHWoRzeDdVQd2OE3dNsLIvUIxQ"
}
次の HTTP 要求で使用するために、応答のアクセス トークンを保存します。
サブジェクト
subject プロパティは、カスタム メトリックが報告される Azure リソース ID を記録します。 この情報は、API 呼び出しの URL にエンコードされます。 各 API は、1 つのAzure リソースに対してのみメトリック値を送信できます。
注
リソース グループまたはサブスクリプションのリソース ID に対してカスタム メトリックを出力することはできません。
リージョン
region プロパティは、メトリックを出力するリソースがデプロイされているAzureリージョンをキャプチャします。 メトリックは、リソースがデプロイされているリージョンと同じAzure Monitorリージョン エンドポイントに出力する必要があります。 たとえば、米国西部にデプロイされた VM のカスタム メトリックは、WestUS リージョンのAzure Monitor エンドポイントに送信する必要があります。 リージョン情報は API 呼び出しの URL にもエンコードされます。
タイムスタンプ
Azure Monitorに送信される各データ ポイントは、タイムスタンプでマークする必要があります。 このタイムスタンプはメトリック値が測定または収集された日時を表します。 Azure Monitorは、過去 20 分、将来 5 分までのタイムスタンプを持つメトリック データを受け入れます。 タイムスタンプは、ISO 8601 形式である必要があります。
Namespace
名前空間は類似のメトリックを分類またはグループ化する方法です。 名前空間を使用すると、収集する情報またはパフォーマンス指標に基づいてメトリックのグループを分離できます。 たとえば、contosomemorymetrics という名前空間では、アプリをプロファイリングするメモリ使用量メトリックを追跡し、 contosoapptransaction という別の名前空間では、アプリケーション内のユーザー トランザクションに関するすべてのメトリックを追跡するといったことが可能です。
名前
名前プロパティは、報告されるメトリックの名前です。 通常は、測定内容を識別するのに十分なほど説明的な名前です。 たとえば、VM で使用されるメモリのバイト数を測定するメトリックです。 Memory Bytes In Use などのようなメトリック名になります。
ディメンション キー
ディメンションは、収集されているメトリックに関する他の特性を説明するのに役立つキーと値のペアです。 他の特性を使用することで、より多くの情報をメトリックについて収集し、より深い洞察を得ることが可能になります。
たとえば、Memory Bytes In Use メトリックに Process というディメンション キーを追加して、VM 上の各プロセスが消費するメモリのバイト数を取得することもできます。 このキーを使用すれば、メトリックをフィルタリングし、メモリ固有のプロセスが使用する容量を確認したり、メモリ使用量で上位 5 つのプロセスを識別したりすることが可能になります。
ディメンションは省略可能です。すべてのメトリックがディメンションを持つとは限りません。 カスタム メトリックは最大 10 個のディメンションを持つことができます。
次元の値
メトリックのデータ ポイントを報告するとき、報告されるメトリックのディメンション キーごとに、対応するディメンション値が存在します。 たとえば、VM で ContosoApp によって使用されているメモリを報告する場合以下のようになります。
- メトリック名は Memory Bytes in Use、
- ディメンション キーは Process、
- ディメンション値は ContosoApp.exe のようになります。
メトリック値を発行するとき、ディメンション キーごとに 1 つのディメンション値しか指定できません。 VM 上の複数のプロセスについて同じメモリ使用率を収集する場合、そのタイムスタンプで複数のメトリック値を報告できます。 各メトリック値は、Process ディメンション キーに異なるディメンション値を指定します。
ディメンションは省略可能ですが、メトリックの投稿にディメンション キーが定義されている場合、対応するディメンション値は必須です。
メトリックの値
Azure Monitorでは、すべてのメトリックが 1 分の細分間隔で格納されます。 場合によっては、メトリックを 1 分間に複数回サンプリングする必要があります。 たとえば、CPU 使用率などがそうです。 または、サインイン トランザクションの待機時間など、多くの不連続イベントに対してメトリックを測定する必要がある場合があります。
Azure Monitorで出力して支払う必要がある生の値の数を制限するには、ローカルに事前集計し、集計された値を出力します。
- Min:1 分間のすべてのサンプルと測定値からの最小観測値。
- Max:1 分間のすべてのサンプルと測定値からの最大観測値。
- Sum:1 分間のすべてのサンプルと測定値からのすべての観測値の合計。
- Count:1 分間に取得されたサンプルと測定値の数。
注
Azure Monitorでは、カスタム メトリックの Units の定義はサポートされていません。
たとえば、1 分の間に、アプリへのサインイン トランザクションが 4 件あり、それぞれについて測定された待機時間の結果が次のとおりであったとします。
| トランザクション 1 | トランザクション 2 | トランザクション 3 | トランザクション 4 |
|---|---|---|---|
| 7 ミリ秒 | 4 ミリ秒 | 13 ミリ秒 | 16 ミリ秒 |
その結果として、メトリック情報はAzure Monitorに公開され、次のようになります。
- 最小:4
- 最大:16
- 合計:40
- カウント:4
アプリケーションにおいて、ローカルでの事前集計ができず、収集してすぐに個別のサンプルまたはイベントを出力する必要がある場合、未処理の測定値を出力することができます。 たとえば、アプリでサインイン トランザクションが発生するたびに、単一の測定値を持つメトリックを Azure Monitor に発行します。 その場合、サインイン トランザクションに要した時間が 12 ミリ秒だとすると、送信されるメトリックは次のようになります。
- 最小:12
- 最大:12
- 合計:12
- カウント:1
このプロセスでは、ある 1 分の間に、同じメトリックとディメンションの組み合わせに対して複数の値を出力できます。 Azure Monitorは、ある特定の1分間に対して取得したすべての未加工の値を集計します。
カスタム メトリックの送信例
次の例では、仮想マシン用のメトリック名前空間 Memory Profile の下に Memory Bytes in Use という名前のカスタム メトリックを作成します。 このメトリックは Process という 1 つのディメンションを持ちます。 タイムスタンプについては、メトリック値は 2 つのプロセスに対して出力されます。
次の JSON をローカル コンピューター上の custommetric.json という名前のファイルに格納します。 過去 20 分以内になるように time パラメーターを更新します。 出力からの時間が 20 分を超えたメトリックはストアに保存できません。
{
"time": "2024-01-07T11:25:20-7:00",
"data": {
"baseData": {
"metric": "Memory Bytes in Use",
"namespace": "Memory Profile",
"dimNames": [
"Process"
],
"series": [
{
"dimValues": [
"ContosoApp.exe"
],
"min": 10,
"max": 89,
"sum": 190,
"count": 4
},
{
"dimValues": [
"SalesApp.exe"
],
"min": 10,
"max": 23,
"sum": 86,
"count": 4
}
]
}
}
}
次の変数を使用して、次の HTTP POST 要求を送信します。
location: メトリックを出力するリソースのデプロイ リージョン。resourceId: メトリックを追跡するAzure リソースのリソース ID。accessToken: 「承認トークンを取得する」の手順で取得した承認トークン。curl -X POST 'https://<location>.monitoring.azure.com/<resourceId>/metrics' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer <accessToken>' \ -d @custommetric.json
メトリックの表示
Azure ポータルにサインインします。
左側のメニューで [監視] を選択します。
[モニター] ページで、 [メトリック] を選択します。
集計の期間を [過去 1 時間] に変更します。
[スコープ] ドロップダウン リストで、メトリックを送信する対象のリソースを選択します。
[メトリックの名前空間] ドロップダウン リストで、[メモリ プロファイル] を選択します。
[メトリック] ドロップダウン リストで、[使用中のメモリ バイト数] を選択します。
トラブルシューティング
プロセスのどこかでエラー メッセージを受信した場合は、次のトラブルシューティング情報を考慮してください。
- サブスクリプションまたはリソース グループまたはリソースに対してメトリックを発行できない場合は、アプリケーションまたはサービス プリンシパルに、Monitoring Metrics Publisher ロールが Access control (IAM) で割り当てられていることを確認します。
- ディメンション名の数が値の数と一致することを確認します。
- 適切なAzure Monitorリージョン エンドポイントにメトリックを出力していることを確認します。 たとえば、リソースが米国西部にデプロイされている場合、米国西部のリージョン エンドポイントにメトリックを出力する必要があります。
- タイムスタンプが過去 20 分以内であることを確認します。
- タイムスタンプが ISO 8601 形式であることを確認します。
次のステップ
カスタム メトリックの詳細を確認します。