Udostępnij za pośrednictwem


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:

Kroki, które dane telemetryczne przechodzą w potoku przetwarzania.

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:

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:

Kod pokazujący ilość odebranych elementów i zaakceptowanych elementów.

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 przed Invoke-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.