Rozwiązywanie problemów z brakującą telemetrią aplikacji w usłudze Azure Monitor Application Insights

Ten artykuł pomaga zidentyfikować krok w potoku przetwarzania, który powoduje brak danych telemetrycznych, testując pozyskiwanie łączności i telemetrii przy użyciu programu PowerShell lub curl.

Kroki, które mogą powodować brak danych telemetrycznych

Na poniższej ilustracji przedstawiono kroki, w których może brakować danych telemetrycznych podczas pozyskiwania i użycia:

Kroki, które telemetria przechodzi w potoku przetwarzania.

Jeśli dane telemetryczne aplikacji nie są wyświetlane w Azure Portal, przyczyną mogą być błędy między krokami w potoku przetwarzania:

  • Zestaw SDK lub agent usługi Application Insights jest błędnie 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 do punktu końcowego pozyskiwania.
  • Punkt końcowy pozyskiwania spada 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.
  • (Niezbyt często) Usługa Log Analytics napotyka problemy ze kondycją usługi podczas zapisywania rekordów telemetrii.
  • (Niezbyt często) Interfejs API zapytań w oknie kończy się api.applicationinsights.io niepowodzeniem podczas wykonywania zapytań o rekordy z usługi Log Analytics.
  • Azure Portal nie może ściągać ani renderować rekordów, które próbujesz wyświetlić.

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ące dane, wyślij przykładowy rekord telemetrii przy użyciu programu PowerShell lub curl. Aby uzyskać skrypt programu PowerShell lub polecenie 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 Application Insights przy użyciu programu PowerShell. Jeśli aplikacja internetowa, która ma problemy z wysyłaniem danych telemetrycznych, działa na platformie Kudu, uruchom następujący skrypt z konsoli debugowania programu PowerShell kudu na platformie Azure Web Apps.

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

Uwaga

  • Przed uruchomieniem Invoke-WebRequest polecenia cmdlet wydaj $ProgressPreference = "SilentlyContinue" polecenie 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 Azure Portal i sprawdź, czy nadejdzie. Jeśli zostanie wyświetlony przykładowy rekord telemetrii, zostanie wyeliminowana duża część potoku przetwarzania.

Przykładowy rekord telemetrii, który został poprawnie zapisany i wyświetlony, oznacza:

  • Serwer lokalny lub maszyna wirtualna ma system DNS, który jest rozpoznawana jako poprawny adres IP.
  • Sieć dostarczyła próbkę do punktu końcowego pozyskiwania bez blokowania lub upuszczania.
  • Punkt końcowy pozyskiwania zaakceptował przykładowy ładunek i przetworował go za pośrednictwem potoku pozyskiwania.
  • Usługa Log Analytics poprawnie zapisała przykładowy rekord.
  • Karta dzienników Azure Portal umożliwia wykonywanie zapytań względem interfejsu API (api.applicationinsights.io) i renderowanie przykładowego rekordu w 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 lub agentem usługi Application Insights. Następnie możesz kontynuować zbieranie dzienników zestawu SDK, dzienników samo diagnostycznych lub śledzenia profilera, w zależności od tego, która z tych wartości jest odpowiednia 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 narzędzia curl.

Skrypt programu PowerShell do wysyłania wyników testu dostępności

Wyniki testu dostępności są idealnym typem 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, może on zostać pobrany do próbkowania po włączeniu próbkowania pozyskiwania. Zacznij od przykładowego wyniku testu dostępności, a następnie w razie potrzeby wypróbuj inne typy telemetrii.

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. W przypadku korzystania z tego skryptu podaj $ConnectionString parametr lub $InstrumentationKey .

  • Jeśli podano tylko parametr parametry połączenia, dane telemetryczne zostaną wysłane do regionalnego punktu końcowego w parametry połączenia.
  • Jeśli podano tylko parametr klucza instrumentacji (ikey), dane telemetryczne zostaną wysłane do globalnego punktu końcowego pozyskiwania.
  • Jeśli zostaną podane parametry parametry połączenia i ikey, skrypt wyśle dane telemetryczne do regionalnego punktu końcowego w parametry połączenia.

Uwaga

  • Przetestuj połączenie nawiązane przez aplikację. Jeśli włączysz usługę Application Insights w Azure Portal, prawdopodobnie będziesz polegać na parametrach połączenia z regionalnymi punktami końcowymi. https://<region>.in.applicationinsights.azure.com Jeśli konfiguracja zestawu SDK dostarcza tylko klucz ikey, należy polegać 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 ikey.
  • 31 marca 2025 r. zakończy się obsługa pozyskiwania kluczy instrumentacji. Pozyskiwanie klucza instrumentacji będzie nadal działać, ale nie będziemy już zapewniać aktualizacji ani obsługi tej funkcji. Przejście do parametrów połączenia w celu skorzystania z nowych możliwości.

Najłatwiej jest uruchomić ten skrypt ze środowiska ŚRODOWISKA ISE programu PowerShell w wystąpieniu zestawu skalowania maszyn wirtualnych platformy IaaS lub platformy Azure . Możesz również skopiować i wkleić skrypt do konsoli debugowania interfejsu App Service Kudu programu PowerShell, a następnie uruchomić go.

Po wykonaniu skryptu poszukaj odpowiedzi HTTP 200 i przejrzyj szczegóły odpowiedzi. W ramach ładunku JSON odpowiedzi oczekuje się następujących szczegółów:

  • Liczba itemsReceived jest zgodna z wartością itemsAccepted.
  • Punkt końcowy pozyskiwania informuje klienta: wysłano jeden rekord telemetrii i zaakceptowaliśmy jeden rekord telemetrii.

Skorzystaj z poniższego zrzutu ekranu jako przykładu:

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.

Poniżej przedstawiono 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 rekordu telemetrii pojedynczego żą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 testu 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 nie powiedzie się, rozwiąż problemy z konfiguracją protokołu SSL lub TLS. Większość punktów końcowych pozyskiwania wymaga, aby klienci korzystali z 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. Jeśli chcesz zdiagnozować bezpieczny kanał w ramach połączenia między maszyną wirtualną klienta a punktami końcowymi pozyskiwania, dołącz następujące fragmenty kodu.

  • 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 do dowolnego z następujących wierszy, usuwając # znak i dodając go przed Invoke-WebRequest poleceniem cmdlet w skrypcie programu PowerShell, aby kontrolować protokół używany 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ążaniu 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 używa domyślnych ustawień protokołu TLS systemu lub serwera, zmień te ustawienia domyślne w rejestrze na maszynach z systemem Windows. Aby uzyskać szczegółowe informacje, zobacz Transport Layer Security (TLS) registry settings (Transport Layer Security) registry settings (Ustawienia rejestru usługi 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 temacie Transport Layer Security (TLS) best practices with the .NET Framework (Najlepsze rozwiązania dotyczące zabezpieczeń warstwy transportu (TLS) w .NET Framework.

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 curl zakończy się pomyślnie, brak danych telemetrycznych jest prawdopodobnie spowodowany problemami 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 programu 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:

  • System DNS w sieci nie może rozpoznać punktu końcowego pozyskiwania prawidłowego 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órym łą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.
  • Może wystąpić więcej niż jedna Private Link usługi Azure Monitor wpływająca na sieć prywatną, która może zastąpić wpisy DNS w celu rozpoznania punktu końcowego pozyskiwania nieprawidłowego prywatnego adresu 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 platformy Azure.