Azure Monitor Application Insights でアプリケーション テレメトリが見つからない場合のトラブルシューティング

この記事では、PowerShell または curl を使用して接続とテレメトリインジェストをテストすることでテレメトリが欠落する処理パイプラインの手順を特定するのに役立ちます。

テレメトリが欠落する原因となる可能性のある手順

次の図は、インジェストと消費中にテレメトリが欠落する可能性がある手順を示しています。

テレメトリが処理パイプラインで渡す手順。

アプリケーション テレメトリがAzure portalに表示されない場合は、処理パイプラインのステップ間でエラーが発生する可能性があります。

  • Application Insights SDK またはエージェントが正しく構成されておらず、アプリケーション テレメトリがインジェスト エンドポイントに送信されません。
  • SDK またはエージェントは正しく構成されていますが、ネットワークはインジェスト エンドポイントへの呼び出しをブロックします。
  • インジェスト エンドポイントは、受信テレメトリをドロップまたはスロットルします。
  • インジェスト パイプラインは、 サービスの正常性のために、処理の一環としてテレメトリを削除または大幅に遅くします。
  • (一般的でない)Log Analytics は、テレメトリ レコードを保存するときにサービス正常性の問題に直面します。
  • (一般的でない)でのクエリ API api.applicationinsights.io は、Log Analytics からレコードのクエリを実行すると失敗します。
  • Azure portalは、表示しようとしているレコードをプルまたはレンダリングできません。

サンプル テレメトリ レコードを送信して手順を特定する

構成の問題または一時的な問題は、Applications Insights サービス全体の任意の場所で発生する可能性があります。 データがない、またはデータが欠落している現象を引き起こす処理パイプライン内の手順を特定するには、PowerShell または curl を使用してサンプル テレメトリ レコードを送信します。 PowerShell スクリプトまたは curl コマンドについては、次のセクションを参照してください。

Web アプリがオンプレミス サーバーまたは Azure VM で実行されている場合は、サーバーまたは VM に接続し、PowerShell を使用して Applications Insights サービス インスタンスに 1 つのテレメトリ レコードを送信します。 テレメトリの送信に問題がある Web アプリが Kudu で実行されている場合は、Azure Web Appsの Kudu の PowerShell デバッグ コンソールから次のスクリプトを実行します。

$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $availabilityData -UseBasicParsing

注:

  • コマンドレットを実行する前に Invoke-WebRequest 、コマンドレットを発行します $ProgressPreference = "SilentlyContinue"
  • または -Debugを使用-Verboseすることはできません。 代わりに、 を使用します -UseBasicParsing

PowerShell を使用してサンプル テレメトリ レコードを送信した後、Azure portalの [Application Insights ログ] タブに移動し、到着した場合はチェックします。 サンプル テレメトリ レコードが表示されている場合、処理パイプラインの大部分は削除されます。

正しく保存され、表示されるサンプル テレメトリ レコードは、次のことを意味します。

  • ローカル サーバーまたは VM には、正しい IP アドレスに解決される DNS があります。
  • ネットワークは、サンプルをブロックまたは削除せずにインジェスト エンドポイントに配信しました。
  • インジェスト エンドポイントはサンプル ペイロードを受け入れ、インジェスト パイプラインを介して処理しました。
  • Log Analytics によってサンプル レコードが正しく保存されました。
  • [Azure portal ログ] タブでは、API (api.applicationinsights.io) に対してクエリを実行し、Azure portalでサンプル レコードをレンダリングできます。

生成されたサンプル レコードが Application Insights インスタンスに到着し、[ ログ] リソース メニューを使用してサンプル レコードのクエリを実行できる場合 は、Application Insights SDK またはエージェントのトラブルシューティングを行います。 その後、SDK ログ、自己診断ログ、またはプロファイラー トレースの収集を続行できます。SDK またはエージェントのバージョンに適した方です。

次のセクションでは、PowerShell または curl を使用してサンプル テレメトリ レコードを送信する方法について説明します。

可用性テスト結果を送信する PowerShell スクリプト

可用性テストの結果は、テストに最適なテレメトリの種類です。 その理由は、インジェスト パイプラインが可用性テストの結果をサンプリングしないということです。 要求テレメトリ レコードを送信すると、インジェスト サンプリングを有効にしたときにサンプリングされる可能性があります。 サンプルの可用性テスト結果から始めて、必要に応じて他のテレメトリの種類を試してください。

可用性テスト結果を送信するサンプル PowerShell スクリプトを次に示します。

# Info: Provide either the connection string or ikey for your Application Insights resource
$ConnectionString = ""
$InstrumentationKey = ""
function ParseConnectionString {
param ([string]$ConnectionString)
  $Map = @{}
  foreach ($Part in $ConnectionString.Split(";")) {
     $KeyValue = $Part.Split("=")
     $Map.Add($KeyValue[0], $KeyValue[1])
  }
  return $Map
}
# If ikey is the only parameter supplied, we'll send telemetry to the global ingestion endpoint instead of regional endpoint found in connection strings
If (($InstrumentationKey) -and ("" -eq $ConnectionString)) {
$ConnectionString = "InstrumentationKey=$InstrumentationKey;IngestionEndpoint=https://dc.services.visualstudio.com/"
}
$map = ParseConnectionString($ConnectionString)
$url = $map["IngestionEndpoint"] + "v2/track"
$ikey = $map["InstrumentationKey"]
$lmUrl = $map["LiveEndpoint"]
$time = (Get-Date).ToUniversalTime().ToString("o")
$availabilityData = @"
{
  "data": {
        "baseData": {
            "ver": 2,
            "id": "SampleRunId",
            "name": "Microsoft Support Sample Webtest Result",
            "duration": "00.00:00:10",
            "success": true,
            "runLocation": "Region Name",
            "message": "Sample Webtest Result",
            "properties": {
                "Sample Property": "Sample Value"
                }
        },
        "baseType": "AvailabilityData"
  },
  "ver": 1,
  "name": "Microsoft.ApplicationInsights.Metric",
  "time": "$time",
  "sampleRate": 100,
  "iKey": "$ikey",
  "flags": 0
}
"@
# Uncomment one or more of the following lines to test client TLS/SSL protocols other than the machine default option
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::SSL3
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS11
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS12
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS13
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $availabilityData -UseBasicParsing

このスクリプトは、単一の可用性テスト結果を Application Insights コンポーネントに配信する生の REST 要求を構築します。 このスクリプトを使用する場合は、 または $InstrumentationKey パラメーターを$ConnectionString指定します。

  • 接続文字列 パラメーターのみが指定されている場合、テレメトリは接続文字列のリージョン エンドポイントに送信されます。
  • インストルメンテーション キー (ikey) パラメーターのみが指定されている場合、テレメトリはグローバル インジェスト エンドポイントに送信されます。
  • 接続文字列パラメーターと ikey パラメーターの両方が指定されている場合、スクリプトは接続文字列のリージョン エンドポイントにテレメトリを送信します。

注:

  • アプリケーションによって行われた接続をテストします。 Azure portalで Application Insights を有効にした場合、リージョン エンドポイントを持つ接続文字列に依存している可能性がありますhttps://<region>.in.applicationinsights.azure.com。 SDK 構成で ikey のみが提供されている場合は、グローバル エンドポイント https://dc.applicationinsights.azure.comである に依存します。 接続文字列または ikey を指定して、Web アプリケーション SDK の構成に一致するスクリプト パラメーターを設定してください。
  • 2025 年 3 月 31 日、インストルメンテーション キー インジェストのサポートは終了します。 インストルメンテーション キー インジェストは引き続き機能しますが、この機能の更新プログラムやサポートは提供されなくなります。 新しい機能を利用するために接続文字列に移行します。

このスクリプトは、IaaS または Azure 仮想マシン スケール セット インスタンス上の PowerShell ISE 環境から実行するのが最も簡単です。 スクリプトをコピーして、App Service Kudu インターフェイスの PowerShell デバッグ コンソールに貼り付けて実行することもできます。

スクリプトが実行されたら、HTTP 200 応答を探し、応答の詳細を確認します。 応答 JSON ペイロードの一部として、次の詳細が必要です。

  • カウントは itemsReceiveditemsAccepted一致します。
  • インジェスト エンドポイントは、1 つのテレメトリ レコードを送信し、1 つのテレメトリ レコードを受け入れたことをクライアントに通知します。

例として、次のスクリーンショットを参照してください。

受信したアイテムと受け入れられたアイテムの量を示すコード。

Curl コマンドを使用して可用性テスト結果を送信する

Linux VM を実行している場合は、PowerShell の代わりに curl を使用して、同様の REST 要求を送信します。 インジェスト エンドポイントのホスト名、値、および値をiKey調整するtime必要があります。 Application Insights インジェスト エンドポイントでは、48 時間を超えるレコードは受け入れられません。

1 つの可用性テスト結果を送信する curl コマンドの例を次に示します。

  • Linux/MacOS の Curl コマンド:

    curl -H "Content-Type: application/json" -X POST -d '{"data":{"baseData":{"ver":2,"id":"SampleRunId","name":"MicrosoftSupportSampleWebtestResultUsingCurl","duration":"00.00:00:10","success":true,"runLocation":"RegionName","message":"SampleWebtestResult","properties":{"SampleProperty":"SampleValue"}},"baseType":"AvailabilityData"},"ver":1,"name":"Microsoft.ApplicationInsights.Metric","time":"2022-09-01T12:00:00.0000000Z","sampleRate":100,"iKey":"########-####-####-####-############","flags":0}' https://dc.applicationinsights.azure.com/v2.1/track
    
  • Windows の Curl コマンド:

    curl -H "Content-Type: application/json" -X POST -d {\"data\":{\"baseData\":{\"ver\":2,\"id\":\"SampleRunId\",\"name\":\"MicrosoftSupportSampleWebtestResultUsingCurl\",\"duration\":\"00.00:00:10\",\"success\":true,\"runLocation\":\"RegionName\",\"message\":\"SampleWebtestResult\",\"properties\":{\"SampleProperty\":\"SampleValue\"}},\"baseType\":\"AvailabilityData\"},\"ver\":1,\"name\":\"Microsoft.ApplicationInsights.Metric\",\"time\":\"2021-10-05T22:00:00.0000000Z\",\"sampleRate\":100,\"iKey\":\"########-####-####-####-############\",\"flags\":0} https://dc.applicationinsights.azure.com/v2/track
    

要求テレメトリ レコードを送信する PowerShell スクリプト

不足している要求テレメトリのトラブルシューティングを行うには、次の PowerShell スクリプトを使用して、1 つの要求テレメトリ レコードの送信をテストします。 このテレメトリの種類は、サーバー側のインジェスト サンプリング構成の影響を受けやすいです。 インジェスト サンプリングがオフになっていることを確認して、テスト レコードが正しく保存されているかどうかを確認します。

# Info: Provide either the connection string or ikey for your Application Insights resource
$ConnectionString = ""
$InstrumentationKey = ""
function ParseConnectionString {
param ([string]$ConnectionString)
  $Map = @{}
  foreach ($Part in $ConnectionString.Split(";")) {
     $KeyValue = $Part.Split("=")
     $Map.Add($KeyValue[0], $KeyValue[1])
  }
  return $Map
}
# If ikey is the only parameter supplied, we'll send telemetry to the global ingestion endpoint instead of regional endpoint found in connection strings
If (($InstrumentationKey) -and ("" -eq $ConnectionString)) {
$ConnectionString = "InstrumentationKey=$InstrumentationKey;IngestionEndpoint=https://dc.services.visualstudio.com/"
}
$map = ParseConnectionString($ConnectionString)
$url = $map["IngestionEndpoint"] + "v2/track"
$ikey = $map["InstrumentationKey"]
$lmUrl = $map["LiveEndpoint"]
$time = (Get-Date).ToUniversalTime().ToString("o")
$requestData = @"
{
   "data": {
      "baseType": "RequestData",
      "baseData": {
        "ver": 2,
        "id": "22093920382029384",
        "name": "GET /msftsupport/requestdata/",
        "starttime": "$time",
        "duration": "00:00:01.0000000",
        "success": true,
        "responseCode": "200",
        "url": "https://localhost:8080/requestData/sampleurl",
        "httpMethod": "GET"
       }
   },
   "ver": 1,
   "iKey": "$ikey",
   "name": "Microsoft.ApplicationInsights.Request",
   "time": "$time",
   "sampleRate": 100,
   "flags": 0
}
"@
# Uncomment one or more of the following lines to test client TLS/SSL protocols other than the machine default option
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::SSL3
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS11
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS12
# [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS13
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $requestData -UseBasicParsing

SSL または TLS 構成のトラブルシューティング

上記のスクリプトが失敗した場合は、SSL または TLS 構成のトラブルシューティングを行います。 ほとんどのインジェスト エンドポイントでは、クライアントが TLS 1.2 と特定の暗号スイートを使用する必要があります。 この場合、PowerShell が SSL または TLS プロトコルでクライアントとして参加する方法を調整します。 クライアント VM とインジェスト エンドポイント間の接続の一部としてセキュリティで保護されたチャネルを診断する必要がある場合は、次のスニペットを含めます。

  • オプション 1: PowerShell がインジェスト エンドポイントに接続するために使用する SSL または TLS プロトコルを制御します。

    文字を削除して次のいずれかの行のコメントを # 解除し、PowerShell スクリプトのコマンドレットの Invoke-WebRequest 前に追加して、テスト REST 要求で使用されるプロトコルを制御します。

    # Uncomment one or more of these lines to test TLS/SSL protocols other than the machine default option
    # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::SSL3
    # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS
    # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS11
    # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS12
    # [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::TLS13
    
  • オプション 2: SSL 証明書の検証に関する問題は無視します。

    SSL 証明書オフロードに参加するファイアウォールまたはプロキシ サーバーがある場合は、コマンドレットの直前に次のスニペットを追加して、SSL 証明書の問題を Invoke-WebRequest 無視します。

    # Ignore mismatched SSL certificate
    add-type @"
        using System.Net;
        using System.Security.Cryptography.X509Certificates;
        public class TrustAllCertsPolicy : ICertificatePolicy {
            public bool CheckValidationResult(
                ServicePoint srvPoint, X509Certificate certificate,
                WebRequest request, int certificateProblem) {
                return true;
            }
        }
    "@
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
    

アプリケーションが既定でシステムまたはサーバーの既定の TLS 設定に設定されている場合は、Windows マシンのレジストリ内でこれらの既定の設定を変更します。 詳細については、「 トランスポート層セキュリティ (TLS) レジストリ設定」を参照してください。

.NET アプリケーションで使用される既定の TLS/SSL プロトコルを変更する必要がある場合は、「トランスポート層セキュリティ (TLS) のベスト プラクティス」のガイダンスに従って、.NET Framework。

Application Insights SDK またはエージェントのセットアップまたは構成のトラブルシューティング

PowerShell または curl を使用してアプリケーションのホスト コンピューターからテレメトリを送信すると、Application Insights SDK またはエージェントのセットアップまたは構成の問題が原因でテレメトリが見つからない可能性があります。 アプリケーション ホストとプログラミング言語の Application Insights 監視を有効にして、すべての構成またはコードが適切なガイダンスと例に従っていることを確認します。

PowerShell または curl を使用して実行されたテストがインジェスト エンドポイントにテレメトリを送信できない場合は、問題の原因となる可能性のあるいくつかの一般的なクライアント側関連の問題を確認します。

  • ネットワーク上の DNS は、インジェスト エンドポイントを正しい IP アドレスに解決できません。
  • アプリケーション サーバーからインジェスト エンドポイントへの TCP 接続は、ファイアウォールまたはゲートウェイ デバイスによってブロックされる可能性があります。
  • SDK が接続するインジェスト エンドポイントには TLS 1.2 が必要な場合がありますが、アプリケーションでは既定で TLS 1.0 または TLS 1.1 を使用する場合があります。
  • プライベート ネットワークに影響を与える Azure Monitor Private Linkが複数ある場合があります。これにより、DNS エントリが上書きされ、インジェスト エンドポイントが間違ったプライベート IP アドレスに解決される可能性があります。

お問い合わせはこちらから

質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。