次の方法で共有


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

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

テレメトリが見つからない原因となる可能性がある手順

次の図は、取り込みと使用中にテレメトリが欠落する可能性がある手順を示しています。

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

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

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

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

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

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

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

Note

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

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

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

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

生成されたサンプル レコードが Application Insights インスタンスに到着し、 Logs リソース メニューを使用してサンプル レコードのクエリを実行できる場合は、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 要求を作成します。 このスクリプトを使用する場合は、 $ConnectionString または $InstrumentationKey パラメーターを指定します。

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

Note

  • アプリケーションによって行われた接続をテストします。 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 ペイロードの一部として、次の詳細が必要です。

  • itemsReceived数はitemsAcceptedと一致します。
  • インジェスト エンドポイントは、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 つの要求テレメトリ レコードの送信をテストします。 このテレメトリの種類は、サーバー側のインジェスト サンプリング構成の影響を受けやすくなります。 ingestion サンプリングがオフになっていることを確認して、テスト レコードが正しく保存されているかどうかを確認します。

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

    # 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 マシン上のレジストリ内の既定の設定を変更します。 詳細については、「 Transport Layer Security (TLS) レジストリ設定を参照してください。

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

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 フィードバック コミュニティに製品フィードバックを送信することもできます。