針對 Azure 監視器 Application Insights 中遺失的應用程式遙測進行疑難排解
本文可協助您識別處理管線中的步驟,藉由使用PowerShell或 curl測試連線能力和遙測擷取,導致遙測遺失。
可能導致遙測遺失的步驟
下圖顯示擷取和取用期間可能會遺漏遙測的步驟:
如果應用程式遙測未顯示在 Azure 入口網站 中,處理管線中跨步驟失敗可能是原因:
- Application Insights SDK 或代理程式設定錯誤,且不會將應用程式遙測傳送至擷取端點。
- SDK 或代理程式已正確設定,但網路會封鎖對擷取端點的呼叫。
- 擷取端點會卸除或節流輸入遙測。
- 擷取管線會因為服務健康情況而卸除或嚴重減緩遙測,作為其處理一部分。
- (不常見)儲存遙測記錄時,Log Analytics 會面臨服務健康情況問題。
- (不常見)從 Log Analytics 查詢記錄時,查詢 API 失敗
api.applicationinsights.io
。 - Azure 入口網站 無法提取或轉譯您嘗試檢視的記錄。
藉由傳送範例遙測記錄來識別步驟
設定問題或暫時性問題可能會在 Application 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
注意
- 執行
Invoke-WebRequest
Cmdlet 之前,請發出$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 通訊協定,請遵循 .NET Framework 的傳輸層安全性 (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 監視器 Private Link 會影響您的專用網,這可能會覆寫您的 DNS 專案,以將擷取端點解析為錯誤的私人 IP 位址。
與我們連絡,以取得說明
如果您有問題或需要相關協助,請建立支援要求,或詢問 Azure community 支援。 您也可以向 Azure 意見反應社群提交產品意見反應。