針對 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 意應見反社群。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應