針對 Azure 監視器 Application Insights 中遺失的應用程式遙測進行疑難解答

本文透過使用PowerShell或 curl 測試連線能力和遙測擷取,協助您識別導致遙測遺失之處理管線中的步驟。

可能導致遙測遺失的步驟

下圖顯示在擷取和取用期間遺失遙測的步驟:

遙測在處理管線中傳遞的步驟。

如果應用程式遙測未顯示在 Azure 入口網站 中,則處理管線中各個步驟的失敗可能是原因:

  • Application Insights SDK 或代理程式設定錯誤,且不會將應用程式遙測傳送至擷取端點。
  • SDK 或代理程式已正確設定,但網路會封鎖對擷取端點的呼叫。
  • 擷取端點會捨棄或節流輸入遙測。
  • 擷取管線會因為 服務健康情況而捨棄或嚴重降低遙測在處理過程中的速度。
  • (在儲存遙測記錄時,) Log Analytics 遇到服務健康情況問題。
  • (不常見) 從 Log Analytics 查詢記錄時,位於 的查詢 API api.applicationinsights.io 會失敗。
  • Azure 入口網站 無法提取或轉譯您嘗試檢視的記錄。

藉由傳送範例遙測記錄來識別步驟

設定問題或暫時性問題可能會發生在Applications Insights服務的任何位置。 若要識別處理管線中造成沒有數據或數據遺失徵兆的步驟,請使用PowerShell或 curl 傳送範例遙測記錄。 針對 PowerShell 腳本或 curl 命令,請移至下列各節:

如果 Web 應用程式在內部部署伺服器或 Azure VM 上執行,請連線到伺服器或 VM,並使用 PowerShell 將單一遙測記錄傳送至 Applications Insights 服務實例。 如果傳送遙測有問題的 Web 應用程式在 Kudu 上執行,請從 Azure Web Apps 中的 Kudu PowerShell 偵錯控制台執行下列腳本。

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

注意事項

  • 執行 Cmdlet Invoke-WebRequest 之前,請發出 $ProgressPreference = "SilentlyContinue" Cmdlet。
  • 您無法使用 -Verbose-Debug。 請改用 -UseBasicParsing

使用 PowerShell 傳送範例遙測記錄之後,請流覽至 Azure 入口網站 中的 [Application Insights 記錄] 索引卷標,並檢查它是否抵達。 如果顯示範例遙測記錄,則會排除處理管線的很大一部分。

正確儲存和顯示的範例遙測記錄表示:

  • 本地伺服器或 VM 具有解析為正確 IP 位址的 DNS。
  • 網路會將範例傳遞至擷取端點,而不會封鎖或卸除。
  • 擷取端點已接受範例承載,並透過擷取管線加以處理。
  • Log Analytics 已正確儲存範例記錄。
  • [Azure 入口網站 記錄] 索引標籤可以查詢 API (api.applicationinsights.io) ,並在 Azure 入口網站 中轉譯範例記錄。

如果產生的範例記錄抵達您的 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

此腳本會建置原始 REST 要求,以將單一可用性測試結果傳遞給 Application Insights 元件。 當您使用此文稿時,請提供 $ConnectionString$InstrumentationKey 參數。

  • 如果只提供 連接字串 參數,遙測會傳送至 連接字串 中的區域端點。
  • 如果只提供 ikey) 參數 (檢測密鑰,則會將遙測傳送至全域擷取端點。
  • 如果同時提供 連接字串 和 ikey 參數,腳本會將遙測傳送至 連接字串 中的區域端點。

注意事項

  • 測試應用程式所建立的連線。 如果您在 Azure 入口網站 中啟用 Application Insights,則可能依賴具有區域端點 的連接字串 https://<region>.in.applicationinsights.azure.com 如果您的 SDK 組態只提供 ikey,您會依賴全域端點 https://dc.applicationinsights.azure.com。 請務必填入符合 Web 應用程式 SDK 設定的腳本參數,提供 連接字串 或 ikey。
  • 在 2025 年 3 月 31 日,將終止對檢測密鑰擷取的支援。 檢測密鑰擷取將繼續運作,但我們不會再提供功能的更新或支援。 轉換為連接字串 以利用 新功能

從 IaaS 或 Azure 虛擬機擴展集 實例上的 PowerShell ISE 環境執行此腳本最簡單。 您也可以將腳本複製並貼到 App Service Kudu 介面 PowerShell 偵錯控制台,然後加以執行。

執行腳本時,請尋找 HTTP 200 回應並檢閱回應詳細數據。 作為回應 JSON 承載的一部分,預期會有下列詳細數據:

  • 計數 itemsReceived 符合 itemsAccepted
  • 擷取端點會通知用戶端:您已傳送一筆遙測記錄,而我們已接受一筆遙測記錄。

請參閱下列螢幕快照作為範例:

顯示已接收項目數量和已接受項目的程序代碼。

用來傳送可用性測試結果的 Curl 命令

如果您執行的是Linux VM,請使用 curl 而不是PowerShell來傳送類似的REST要求。 您需要調整 擷取端點主機名iKey 值和 time 值。 Application Insights 擷取端點不接受超過 48 小時的任何記錄。

以下是傳送單一可用性測試結果的範例 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腳本來測試傳送單一要求遙測記錄。 此遙測類型容易受到伺服器端擷取取樣設定的影響。 確認已關閉 擷取取樣 ,以確認測試記錄是否已正確儲存。

# 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 腳本中的 Cmdlet 之前 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 憑證卸除的防火牆或 Proxy 伺服器,請在 Cmdlet 前面 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 計算機的登錄內變更這些預設設定。 如需詳細資訊,請 參閱 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 監視器 Private Link 影響您的專用網,這可能會覆寫您的 DNS 專案,以將擷取端點解析為錯誤的私人 IP 位址。

與我們連絡,以取得說明

如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以將產品意見反應提交給 Azure 意應見反社群