6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure Monitor の Data Collection Rule でデータ収集失敗時の原因を特定する方法

6
Last updated at Posted at 2026-03-19

はじめに

Azure Monitor では、ログをどのように収集し、どこへ送信するかを「データ収集ルール(Data Collection Rule、以下 DCR)」という設定で管理します。
この DCR を使ってログを取り込む際に問題が発生すると、Log AnalyticsのテーブルにDCRLogErrors というエラーが残ります。
本記事では、DCR のエラーを意図的に発生させて、エラー内容を具体的に確認する方法を検証しました。
Azure Monitor をご利用される方は、是非ご一読ください。

DCRのエラーログ (DCRLogErrors) とは

DCR のエラーログ(DCRLogErrors)とは、Azure Monitor によるログ収集処理でエラーが発生した場合に、その内容が Log Analytics のテーブルに記録されるログです。

たとえば、次のような場合にエラーログが記録されます。

参考:Azure Monitor での DCR データ収集を監視する

エラー ログは、データが Azure Monitor インジェスト パイプラインに到達したが、宛先に到達できない場合に生成されます。 エラー条件の例を次に示します。

・ログ配信エラー
・ログの構造によって変換 KQL が無効になる変換エラー
・ログ インジェスト API 呼び出し:
 ・200/202 以外の HTTP 応答がある場合
 ・ペイロードに形式が正しくないデータが含まれている場合
 ・任意のインジェスト制限を超えるペイロードがある場合
 ・API 呼び出し制限の超過による調整

検証のシナリオ

実運用において比較的発生しやすい失敗パターンである可能性が高いLogs Ingestion API 呼び出し時の権限不足のエラーを検証対象としました。

本検証では、Logs Ingestion API を呼び出すサービスプリンシパルに対して、
ログ送信に必要な権限が付与されていない状態で API を実行した場合の挙動を確認しました。
具体的には、API 呼び出し時に返されるエラー内容と、
当該エラーが DCRLogErrors に記録されるか検証します。

検証手順

1.Logs ingestion API を使用して Azure Monitor にデータを送信するための準備

Microsoft Entra ID にアプリケーションを登録し、サービス プリンシパルを作成する

Log Ingest API を利用するには、Microsoft Entra ID のテナント IDとアプリケーションIDが必要になります。アプリケーションIDは、Microsoft Entra ID のアプリの登録から作成します。
image.png

アプリケーションIDは、Microsoft Entra ID のアプリの登録から作成するため、+新規登録をクリックします。

image.png

名前を入れて登録を選択します。
image.png

アプリのページを開いたら、証明書とシークレットタブから「新しいクライアントシークレット」へ進みシークレットを作成します。追加する際に、シークレットの値を控えておきます。また、アプリケーション ID (クライアント ID) も同じく後ほど利用します。

image.png

データ収集エンドポイントを作成する

次にデータ収集エンドポイントを作成します。
このデータ収集エンドポイントがLogs Ingestion API 用の認証・通信に使用されるエンドポイントとして利用するため、赤枠のURLはコピーしておきましょう。後ほどデータ送信テストをするのに使用します。
image.png

2. PowerShellを使用してLogs Ingestion APIへリクエストを送信する

上記で作成した設定内容をコマンドに反映し、Logs Ingestion API を使用してデータ送信します。
この際、使用するサービスプリンシパルに適切な権限(監視メトリクス発行者など)を付与せずに実行したため、
DCRへのアクセス権限不足によるエラーが発生し、403 Forbiddenエラーとなります。

以下は、Logs Ingestion API を使ってログを送信する PowerShell のサンプルです。
※ ID やシークレットはダミー値に置き換えています。
このスクリプトでは、あえて必要な権限を持たない状態で実行するため、送信は失敗します。

# 認証情報の構成(ID類はダミー値に置き換えています)
$tenantId = "00000000-0000-0000-0000-000000000000"
$appId = "11111111-1111-1111-1111-111111111111"
$appSecret = "************************"
$endpoint_uri = "https://<your-endpoint-name>.japaneast-1.ingest.monitor.azure.com"
$dcrImmutableId = "dcr-00000000000000000000000000000000"
$streamName = "DummyStreamId"

# アクセストークンの取得
$scope="https://monitor.azure.com/.default"
$body = "client_id=$appId&scope=$scope&client_secret=$appSecret&grant_type=client_credentials";
$headers = @{"Content-Type"="application/x-www-form-urlencoded"};
$uri = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token"
$bearerToken = (Invoke-RestMethod -Uri $uri -Method "Post" -Body $body -Headers $headers).access_token


# サンプルデータ
$currentTime = Get-Date ([datetime]::UtcNow) -Format O
$staticData = @"
[
  {
    "Time": "$currentTime",
    "Computer": "Computer1",
    "AdditionalContext": {
      "InstanceName": "user1",
      "TimeZone": "Pacific Time",
      "Level": 4,
      "CounterName": "AppMetric1",
      "CounterValue": 15.3
    }
  },
  {
    "Time": "$currentTime",
    "Computer": "Computer2",
    "AdditionalContext": {
      "InstanceName": "user2",
      "TimeZone": "Central Time",
      "Level": 3,
      "CounterName": "AppMetric1",
      "CounterValue": 23.5
    }
  }
]
"@

# データの送信実行
$uri = "$endpoint_uri/dataCollectionRules/$dcrImmutableId/streams/$streamName?api-version=2023-01-01"
$uploadResponse = Invoke-RestMethod -Uri $uri -Method "Post" -Body $body -Headers $headers

参考:Logs ingestion API を使用して Azure Monitor にデータを送信するサンプル コード

スプリプト実行結果
実行した結果、期待通り以下のような403エラーが確認できました。実際に確認できたエラーは、以下のような内容でした。

Invoke-RestMethod : The remote server returned an error: (403) Forbidden.
At line:1 char:19
+ ... dResponse = Invoke-RestMethod -Uri $uri -Method "Post" -Body $body -H ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

3. DCRLogErrors の出力内容を確認する

リクエスト失敗後、Log Analytics ワークスペースで以下のクエリを実行し、エラーのログが出力されているか確認します。

リクエストが失敗した後、
Log Analytics ワークスペースで次のクエリを実行します。

DCRLogErrors
| sort by TimeGenerated desc
| limit 10

出力内容
実行した結果、以下のようなエラーログが確認できました。実際に確認できたエラーログは、以下のような内容でした。

TenantId              : 00000000-0000-0000-0000-000000000000
TimeGenerated [UTC]   : 2025-12-26T02:05:33.515Z
OperationName         : Ingestion
CorrelationId         : XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
InputStreamId         : DummyStreamId
Message               : The authentication token provided does not have access to ingest data for the data collection rule with immutable Id 'dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.
ClientRequestId       :  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
_ResourceId           : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-xxxx/providers/microsoft.insights/datacollectionrules/dcr-xxxx
Type                  : DCRLogErrors

Message欄を確認すると、サービスプリンシパルに、対象のDCRに対するデータを取り込むためのアクセス権がないことについて明記されています。

このように、API 側で 403 エラーが発生した際、その詳細な理由が DCRLogErrors に記録されることが確認できました。

なお、エラーを解消するには、DCR へのアクセス許可としてサービスリンシパルに監視メトリック発行者のロールを付与する必要がございます。

image.png

参考:ログ インジェスト API を使用して Azure Monitor ログにデータを送信する (Azure portal)

まとめ

今回の検証により、DCRのデータ収集でエラーが発生すると、その具体的な原因がDCRLogErrorsテーブルに記録されることを確認できました。
特に、Messageにはエラー原因が示されているため、問題発生時の原因特定を迅速に行えるものと存じます。

本記事が、DCRのトラブルシューティングや監視設計の一助となれば幸いです。

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?