Rozwiązywanie problemów z brakującymi danymi telemetrycznymi aplikacji funkcji Application Insights w usłudze Azure Monitor
Ten artykuł pomaga zidentyfikować krok w potoku przetwarzania, który powoduje brak danych telemetrycznych, testując łączność i pozyskiwanie danych telemetrycznych przy użyciu programu PowerShell lub programu curl.
Kroki, które mogą spowodować brak danych telemetrycznych
Na poniższej ilustracji przedstawiono kroki, w których brakuje danych telemetrycznych podczas pozyskiwania i zużycia:
Jeśli telemetria aplikacji nie jest wyświetlana w witrynie Azure Portal, przyczyną mogą być błędy między krokami w potoku przetwarzania:
- Zestaw SDK usługi Application Insights lub agent jest nieprawidłowo skonfigurowany i nie wysyła danych telemetrycznych aplikacji do punktu końcowego pozyskiwania.
- Zestaw SDK lub agent jest poprawnie skonfigurowany, ale sieć blokuje wywołania punktu końcowego pozyskiwania.
- Punkt końcowy pozyskiwania przerywa lub ogranicza dane telemetryczne dla ruchu przychodzącego.
- Potok pozyskiwania spada lub poważnie spowalnia dane telemetryczne w ramach przetwarzania z powodu kondycji usługi.
- (Nietypowe) Usługa Log Analytics napotyka problemy z kondycją usługi podczas zapisywania rekordów telemetrii.
- (Nietypowe) Interfejs API zapytań kończy
api.applicationinsights.io
się niepowodzeniem podczas wykonywania zapytań dotyczących rekordów z usługi Log Analytics. - Nie można ściągnąć lub renderować rekordów, które próbujesz wyświetlić w witrynie Azure Portal.
Identyfikowanie kroku przez wysłanie przykładowego rekordu telemetrii
Problemy z konfiguracją lub przejściowe problemy mogą wystąpić w dowolnym miejscu w usłudze Application Insights. Aby zidentyfikować krok w potoku przetwarzania, który powoduje objawy braku danych lub brakujących danych, wyślij przykładowy rekord telemetrii przy użyciu programu PowerShell lub curl. W przypadku skryptu programu PowerShell lub polecenia curl przejdź do następujących sekcji:
- Skrypt programu PowerShell na potrzeby wysyłania wyników testu dostępności
- Polecenie Curl w celu wysłania wyniku testu dostępności
- Skrypt programu PowerShell do wysyłania rekordu telemetrii żądania
Jeśli aplikacja internetowa działa na serwerze lokalnym lub maszynie wirtualnej platformy Azure, połącz się z serwerem lub maszyną wirtualną i wyślij pojedynczy rekord telemetrii do wystąpienia usługi Applications Insights przy użyciu programu PowerShell. Jeśli aplikacja internetowa, która ma problemy z wysyłaniem danych telemetrycznych w usłudze Kudu, uruchom następujący skrypt z konsoli debugowania programu PowerShell kudu w usłudze Azure Web Apps.
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $availabilityData -UseBasicParsing
Uwaga 16.
- Przed uruchomieniem
Invoke-WebRequest
polecenia cmdlet wydaj polecenie$ProgressPreference = "SilentlyContinue"
cmdlet . - Nie można użyć ani
-Verbose
-Debug
. Zamiast tego użyj polecenia-UseBasicParsing
.
Po wysłaniu przykładowego rekordu telemetrii przy użyciu programu PowerShell przejdź do karty Dzienniki usługi Application Insights w witrynie Azure Portal i sprawdź, czy dotarł. Jeśli zostanie wyświetlony przykładowy rekord telemetrii, zostanie wyeliminowana duża część potoku przetwarzania.
Przykładowy rekord telemetrii, który jest poprawnie zapisany i wyświetlany, oznacza:
- Serwer lokalny lub maszyna wirtualna ma system DNS rozpoznawany jako poprawny adres IP.
- Sieć dostarczyła przykład do punktu końcowego pozyskiwania bez blokowania lub upuszczania.
- Punkt końcowy pozyskiwania zaakceptował przykładowy ładunek i przetworzył go za pośrednictwem potoku pozyskiwania.
- Usługa Log Analytics poprawnie zapisała przykładowy rekord.
- Karta Dzienniki witryny Azure Portal umożliwia wykonywanie zapytań względem interfejsu API (
api.applicationinsights.io
) i renderowanie przykładowego rekordu w witrynie Azure Portal.
Jeśli wygenerowany przykładowy rekord dociera do wystąpienia usługi Application Insights i możesz wykonać zapytanie dotyczące przykładowego rekordu przy użyciu menu zasobów Dzienniki, rozwiąż problemy z zestawem SDK usługi Application Insights lub agentem. Następnie możesz kontynuować zbieranie dzienników zestawu SDK, dzienników samodzielnej diagnostyki lub śladów profilera, zależnie od tego, co jest odpowiednie dla zestawu SDK lub wersji agenta.
Poniższe sekcje zawierają informacje dotyczące wysyłania przykładowego rekordu telemetrii przy użyciu programu PowerShell lub programu curl.
Skrypt programu PowerShell na potrzeby wysyłania wyników testu dostępności
Wyniki testu dostępności to idealny typ telemetrii do przetestowania. Powodem jest to, że potok pozyskiwania nigdy nie próbkuje wyników testu dostępności. Jeśli wyślesz rekord telemetrii żądania, po włączeniu próbkowania pozyskiwania może zostać pobrane próbkowanie. Rozpocznij od przykładowego wyniku testu dostępności, a następnie wypróbuj inne typy telemetrii zgodnie z potrzebami.
Oto przykładowy skrypt programu PowerShell, który wysyła wynik testu dostępności:
# 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
Ten skrypt tworzy nieprzetworzone żądanie REST w celu dostarczenia pojedynczego wyniku testu dostępności do składnika usługi Application Insights. Jeśli używasz tego skryptu $ConnectionString
, podaj parametr or $InstrumentationKey
.
- Jeśli zostanie podany tylko parametr parametry połączenia, dane telemetryczne zostaną wysłane do regionalnego punktu końcowego w parametry połączenia.
- Jeśli zostanie podany tylko parametr klucza instrumentacji (ikey), dane telemetryczne zostaną wysłane do globalnego punktu końcowego pozyskiwania.
- Jeśli podano zarówno parametry parametry połączenia, jak i ikey, skrypt wyśle dane telemetryczne do regionalnego punktu końcowego w parametry połączenia.
Uwaga 16.
- Przetestuj połączenie nawiązane przez aplikację. Jeśli włączysz usługę Application Insights w witrynie Azure Portal, prawdopodobnie korzystasz z parametry połączenia z regionalnymi punktami końcowymi.
https://<region>.in.applicationinsights.azure.com
Jeśli konfiguracja zestawu SDK dostarcza tylko klucz ikey, należy opierać się na globalnym punkcie końcowym ,https://dc.applicationinsights.azure.com
. Pamiętaj, aby wypełnić parametr skryptu zgodny z konfiguracją zestawu SDK aplikacji internetowej, podając parametry połączenia lub klucz ikey. - 31 marca 2025 r. zostanie zakończone świadczenie pomocy technicznej dla pozyskiwania klucza instrumentacji. Pozyskiwanie klucza instrumentacji będzie nadal działać, ale nie udostępnimy już aktualizacji ani obsługi funkcji. Przejście do parametry połączenia w celu skorzystania z nowych funkcji.
Najłatwiej jest uruchomić ten skrypt ze środowiska ŚRODOWISKA ISE programu PowerShell w wystąpieniu zestawu skalowania maszyn wirtualnych IaaS lub Azure. Możesz również skopiować i wkleić skrypt do konsoli debugowania programu PowerShell interfejsu usługi App Service Kudu , a następnie uruchomić go.
Po wykonaniu skryptu poszukaj odpowiedzi HTTP 200 i przejrzyj szczegóły odpowiedzi. W ramach ładunku JSON odpowiedzi oczekiwane są następujące szczegóły:
- Liczba jest zgodna
itemsReceived
z .itemsAccepted
- Punkt końcowy pozyskiwania informuje klienta: wysłano jeden rekord telemetrii i zaakceptowaliśmy jeden rekord telemetrii.
Zapoznaj się z poniższym zrzutem ekranu w przykładzie:
Polecenie Curl w celu wysłania wyniku testu dostępności
Jeśli używasz maszyn wirtualnych z systemem Linux, użyj narzędzia curl zamiast programu PowerShell, aby wysłać podobne żądanie REST. Musisz dostosować nazwę hosta punktu końcowego pozyskiwania, iKey
wartość i time
wartości. Punkt końcowy pozyskiwania usługi Application Insights nie akceptuje żadnych rekordów starszych niż 48 godzin.
Oto przykładowe polecenia curl, które wysyłają pojedynczy wynik testu dostępności:
Polecenie Curl dla systemu Linux/MacOS:
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
Polecenie Curl dla systemu Windows:
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
Skrypt programu PowerShell do wysyłania rekordu telemetrii żądania
Aby rozwiązać problemy z brakującą telemetrią żądania, użyj następującego skryptu programu PowerShell, aby przetestować wysyłanie pojedynczego rekordu telemetrii żądania. Ten typ telemetrii jest podatny na konfigurację próbkowania pozyskiwania po stronie serwera. Sprawdź, czy próbkowanie pozyskiwania jest wyłączone, aby potwierdzić, czy rekord testowy został zapisany poprawnie.
# 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
Rozwiązywanie problemów z konfiguracją protokołu SSL lub TLS
Jeśli powyższe skrypty kończą się niepowodzeniem, rozwiąż problemy z konfiguracją protokołu SSL lub TLS. Większość punktów końcowych pozyskiwania wymaga od klientów używania protokołu TLS 1.2 i określonych zestawów szyfrowania. W takim przypadku dostosuj sposób, w jaki program PowerShell uczestniczy jako klient w protokole SSL lub TLS. Dołącz następujące fragmenty kodu, jeśli musisz zdiagnozować bezpieczny kanał w ramach połączenia między maszyną wirtualną klienta a punktami końcowymi pozyskiwania.
Opcja 1. Kontrolowanie, który protokół SSL lub TLS jest używany przez program PowerShell do nawiązywania połączenia z punktem końcowym pozyskiwania.
Usuń komentarz z dowolnego z następujących wierszy, usuwając
#
znak i dodając je przedInvoke-WebRequest
poleceniem cmdlet w skrypce programu PowerShell w celu kontrolowania protokołu używanego w testowym żądaniu 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
Opcja 2. Ignoruj wszelkie problemy z weryfikacją certyfikatu SSL.
Jeśli masz zaporę lub serwer proxy, który uczestniczy w odciążeniu certyfikatu SSL, zignoruj wszelkie problemy z certyfikatem SSL, dodając następujący fragment kodu tuż przed
Invoke-WebRequest
poleceniem cmdlet:# 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
Jeśli aplikacja domyślnie jest ustawiona na domyślne ustawienia protokołu TLS systemu lub serwera, zmień te ustawienia domyślne w rejestrze na maszynach z systemem Windows. Aby uzyskać szczegółowe informacje, zobacz Ustawienia rejestru protokołu Transport Layer Security (TLS).
Jeśli musisz zmienić domyślny protokół TLS/SSL używany przez aplikację platformy .NET, postępuj zgodnie ze wskazówkami w artykule Transport Layer Security (TLS) best practices with the .NET Framework (Najlepsze rozwiązania dotyczące protokołu TLS).
Rozwiązywanie problemów z konfiguracją lub konfiguracją zestawu SDK lub agenta usługi Application Insights
Jeśli wysyłanie danych telemetrycznych z maszyny hosta aplikacji przy użyciu programu PowerShell lub programu curl zakończy się pomyślnie, prawdopodobnie brakuje danych telemetrycznych z powodu problemów z konfiguracją lub konfiguracją zestawu SDK lub agenta usługi Application Insights. Włącz monitorowanie usługi Application Insights dla hosta aplikacji i języka programowania, aby sprawdzić, czy wszystkie konfiguracje lub kod są zgodne z odpowiednimi wskazówkami i przykładami.
Jeśli testy wykonywane przy użyciu programu PowerShell lub curl nie mogą wysyłać danych telemetrycznych do punktu końcowego pozyskiwania, sprawdź kilka typowych problemów związanych z klientem, które mogą przyczynić się do problemu:
- Usługa DNS w sieci nie może rozpoznać punktu końcowego pozyskiwania do poprawnego adresu IP.
- Połączenie TCP z serwera aplikacji do punktu końcowego pozyskiwania może zostać zablokowane przez zapory lub urządzenia bramy.
- Punkt końcowy pozyskiwania, z którego łączy się zestaw SDK, może wymagać protokołu TLS 1.2, ale aplikacja może domyślnie używać protokołu TLS 1.0 lub TLS 1.1.
- Być może masz więcej niż jedną usługę Azure Monitor Private Link , która może mieć wpływ na sieć prywatną, co może zastąpić wpisy DNS w celu rozpoznania punktu końcowego pozyskiwania na nieprawidłowy prywatny adres IP.
Skontaktuj się z nami, aby uzyskać pomoc
Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii na temat platformy Azure.