Felsöka programtelemetri som saknas i Azure Monitor Application Insights

Den här artikeln hjälper dig att identifiera steget i bearbetningspipelinen som gör att telemetri saknas genom att testa anslutning och telemetriinmatning med hjälp av PowerShell eller curl.

Steg som kan leda till att telemetri saknas

Följande bild visar steg där telemetri kan saknas under inmatning och förbrukning:

Steg som telemetrin skickar i bearbetningspipelinen.

Om programtelemetri inte visas i Azure Portal kan fel mellan stegen i bearbetningspipelinen vara orsaken:

  • Application Insights SDK eller agenten är felkonfigurerad och skickar inte programtelemetri till inmatningsslutpunkten.
  • SDK:n eller agenten är korrekt konfigurerad, men nätverket blockerar anrop till inmatningsslutpunkten.
  • Inmatningsslutpunkten släpper eller begränsar inkommande telemetri.
  • Inmatningspipelinen minskar eller saktar ned telemetrin allvarligt som en del av bearbetningen på grund av tjänstens hälsa.
  • (Ovanligt) Log Analytics har problem med tjänstens hälsotillstånd när telemetriposter sparas.
  • (Ovanligt) Fråge-API:et vid api.applicationinsights.io misslyckas när du frågar efter poster från Log Analytics.
  • Azure Portal kan inte hämta eller återge de poster som du försöker visa.

Identifiera steg genom att skicka exempeltelemetripost

Konfigurationsproblem eller tillfälliga problem kan uppstå var som helst i Application Insights-tjänsten. Om du vill identifiera steget i bearbetningspipelinen som orsakar symptom på data eller saknade data skickar du en exempeltelemetripost med hjälp av PowerShell eller curl. För PowerShell-skriptet eller curl-kommandot går du till följande avsnitt:

Om webbappen körs på en lokal server eller virtuell Azure-dator ansluter du till servern eller den virtuella datorn och skickar en enda telemetripost till Application Insights-tjänstinstansen med hjälp av PowerShell. Om webbappen som har problem med att skicka telemetri körs på Kudu kör du följande skript från Kudus PowerShell-felsökningskonsol i Azure Web Apps.

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

Obs!

  • Utfärda cmdleten Invoke-WebRequest innan du kör cmdleten $ProgressPreference = "SilentlyContinue" .
  • Du kan inte använda -Verbose eller -Debug. Använd -UseBasicParsingi stället .

När du har skickat en exempeltelemetripost med hjälp av PowerShell navigerar du till fliken Application Insights-loggar i Azure Portal och kontrollerar om den kommer. Om exempeltelemetriposten visas elimineras en stor del av bearbetningspipelinen.

En exempeltelemetripost som sparas och visas korrekt innebär:

  • Den lokala servern eller den virtuella datorn har DNS som matchar rätt IP-adress.
  • Nätverket levererade exemplet till inmatningsslutpunkten utan att blockera eller släppa.
  • Inmatningsslutpunkten accepterade exempelnyttolasten och bearbetade den via inmatningspipelinen.
  • Log Analytics sparade exempelposten korrekt.
  • Fliken Azure Portal loggar kan köra frågor mot API:et (api.applicationinsights.io) och återge exempelposten i Azure Portal.

Om den genererade exempelposten kommer till Application Insights-instansen och du kan fråga efter exempelposten med hjälp av resursmenyn Loggarfelsöker du Application Insights SDK eller agenten. Du kan sedan fortsätta med att samla in SDK-loggar, självdiagnostikloggar eller profileringsspårningar, beroende på vilket som är lämpligt för SDK eller agentversionen.

Följande avsnitt innehåller information om hur du skickar en exempeltelemetripost med PowerShell eller curl.

PowerShell-skript för att skicka tillgänglighetstestresultat

Tillgänglighetstestresultat är den perfekta telemetritypen att testa med. Anledningen är att inmatningspipelinen aldrig tar prov på tillgänglighetstestresultat. Om du skickar en telemetripost för begäran kan den samplas ut när du har aktiverat inmatningssampling. Börja med ett provresultat för tillgänglighetstest och prova sedan andra telemetrityper efter behov.

Här är ett PowerShell-exempelskript som skickar ett tillgänglighetstestresultat:

# 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

Det här skriptet skapar en rå REST-begäran för att leverera ett enda tillgänglighetstestresultat till Application Insights-komponenten. Ange parametern eller $InstrumentationKey när du använder det här skriptet$ConnectionString.

  • Om endast parametern anslutningssträng anges skickas telemetri till den regionala slutpunkten i anslutningssträng.
  • Om endast parametern instrumentationsnyckel (ikey) anges skickas telemetri till slutpunkten för global inmatning.
  • Om både anslutningssträng- och ikey-parametrarna anges skickar skriptet telemetri till den regionala slutpunkten i anslutningssträng.

Obs!

  • Testa anslutningen som görs av ditt program. Om du aktiverar Application Insights i Azure Portal förlitar du dig förmodligen på anslutningssträngar med regionala slutpunkter, https://<region>.in.applicationinsights.azure.com. Om SDK-konfigurationen bara tillhandahåller ikey förlitar du dig på den globala slutpunkten, https://dc.applicationinsights.azure.com. Se till att fylla i skriptparametern som matchar SDK-konfigurationen för webbprogrammet, antingen genom att ange anslutningssträng eller ikey.
  • Den 31 mars 2025 upphör stödet för inmatning av instrumenteringsnycklar. Inmatningen av instrumenteringsnyckeln fortsätter att fungera, men vi kommer inte längre att tillhandahålla uppdateringar eller stöd för funktionen. Övergång till anslutningssträngar för att dra nytta av nya funktioner.

Det är enklast att köra det här skriptet från PowerShell ISE-miljön på en IaaS- eller Azure VM-skalningsuppsättningsinstans . Du kan också kopiera och klistra in skriptet i App Service Kudu-gränssnittets PowerShell-felsökningskonsol och sedan köra det.

När skriptet körs letar du upp ett HTTP 200-svar och granskar svarsinformationen. Som en del av JSON-nyttolasten för svar förväntas följande information:

  • Antalet itemsReceived matchar itemsAccepted.
  • Inmatningsslutpunkten informerar klienten: du skickade en telemetripost och vi accepterade en telemetripost.

Se följande skärmbild som ett exempel:

Kod som visar mängden mottagna objekt och godkända objekt.

Curl-kommando för att skicka tillgänglighetstestresultat

Om du kör virtuella Linux-datorer använder du curl i stället för PowerShell för att skicka en liknande REST-begäran. Du måste justera värdnamnet för inmatningsslutpunkten, iKey värdet och time värdena. Application Insights-inmatningsslutpunkten accepterar inte poster som är äldre än 48 timmar.

Här är exempel på curl-kommandon som skickar ett enda tillgänglighetstestresultat:

  • Curl-kommando för 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
    
  • Curl-kommando för 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
    

PowerShell-skript för att skicka telemetripost för begäran

Om du vill felsöka telemetri för begäranden som saknas använder du följande PowerShell-skript för att testa att skicka en enda telemetripost för begäranden. Den här telemetritypen är mottaglig för inmatningssamplingskonfigurationen på serversidan. Kontrollera att inmatningssampling är inaktiverat för att bekräfta om testposten har sparats korrekt.

# 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

Felsöka SSL- eller TLS-konfiguration

Om skripten ovan misslyckas felsöker du SSL- eller TLS-konfigurationen. De flesta inmatningsslutpunkter kräver att klienter använder TLS 1.2 och specifika chiffersviter. I det här fallet justerar du hur PowerShell deltar som klient i SSL- eller TLS-protokollet. Inkludera följande kodfragment om du behöver diagnostisera en säker kanal som en del av anslutningen mellan den virtuella klientdatorn och inmatningsslutpunkterna.

  • Alternativ 1: Kontrollera vilket SSL- eller TLS-protokoll som används av PowerShell för att upprätta en anslutning till inmatningsslutpunkten.

    Ta bort kommentaren från någon av följande rader genom att ta bort # tecknet och lägga till dem före cmdleten Invoke-WebRequest i PowerShell-skriptet för att styra det protokoll som används i REST-testbegäran:

    # 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
    
  • Alternativ 2: Ignorera eventuella problem med validering av SSL-certifikat.

    Om du har en brandvägg eller proxyserver som deltar i SSL-certifikatavlastning ignorerar du eventuella SSL-certifikatproblem genom att lägga till följande kodfragment precis före cmdleten Invoke-WebRequest :

    # 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
    

Om programmet som standard använder systemets eller serverns standardinställningar för TLS ändrar du standardinställningarna i registret på Windows-datorer. Mer information finns i Registerinställningar för Transport Layer Security (TLS).

Om du behöver ändra standardprotokollet för TLS/SSL som används av ett .NET-program följer du riktlinjerna i Metodtips för Transport Layer Security (TLS) med .NET Framework.

Felsöka installation eller konfiguration av Application Insights SDK eller agent

Om det lyckas att skicka telemetri från programmets värddator med hjälp av PowerShell eller curl beror den saknade telemetrin troligen på konfigurationsproblem med Application Insights SDK eller agenten. Aktivera Application Insights-övervakning för programvärden och programmeringsspråket för att kontrollera att alla konfigurationer eller kod följer rätt vägledning och exempel.

Om tester som utförs med PowerShell eller curl inte kan skicka telemetri till inmatningsslutpunkten kontrollerar du några vanliga problem på klientsidan som kan bidra till problemet:

  • DNS i nätverket kan inte matcha inmatningsslutpunkten med rätt IP-adress.
  • TCP-anslutningen från programservern till inmatningsslutpunkten kan blockeras av brandväggar eller gatewayenheter.
  • Inmatningsslutpunkten som SDK:t ansluter till kan kräva TLS 1.2, men programmet kan som standard använda TLS 1.0 eller TLS 1.1.
  • Du kan ha fler än en Azure Monitor-Private Link som påverkar ditt privata nätverk, vilket kan skriva över dina DNS-poster för att matcha inmatningsslutpunkten till fel privat IP-adress.

Kontakta oss för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.