Risolvere i problemi di telemetria delle applicazioni mancanti in Application Insights di Monitoraggio di Azure

Questo articolo consente di identificare il passaggio nella pipeline di elaborazione che causa la mancanza di dati di telemetria testando la connettività e l'inserimento di telemetria con PowerShell o curl.

Passaggi che possono causare la mancanza di dati di telemetria

L'immagine seguente mostra i passaggi in cui i dati di telemetria possono essere mancanti durante l'inserimento e l'utilizzo:

Passaggi passati dalla telemetria nella pipeline di elaborazione.

Se i dati di telemetria dell'applicazione non vengono visualizzati nel portale di Azure, gli errori nei passaggi della pipeline di elaborazione potrebbero essere la causa:

  • L'SDK o l'agente di Application Insights non è configurato correttamente e non invia i dati di telemetria dell'applicazione all'endpoint di inserimento.
  • L'SDK o l'agente è configurato correttamente, ma la rete blocca le chiamate all'endpoint di inserimento.
  • L'endpoint di inserimento elimina o limita i dati di telemetria in ingresso.
  • La pipeline di inserimento elimina o rallenta gravemente i dati di telemetria durante l'elaborazione a causa dell'integrità del servizio.
  • (Non comune) Log Analytics si trova ad affrontare problemi di integrità del servizio durante il salvataggio dei record di telemetria.
  • (Non comune) L'API di query in api.applicationinsights.io ha esito negativo quando si eseguono query sui record da Log Analytics.
  • Il portale di Azure non riesce a eseguire il pull o il rendering dei record che si sta tentando di visualizzare.

Identificare il passaggio inviando un record di telemetria di esempio

I problemi di configurazione o temporanei possono verificarsi ovunque nel servizio Applications Insights. Per identificare il passaggio all'interno della pipeline di elaborazione che causa sintomi di dati non o dati mancanti, inviare un record di telemetria di esempio usando PowerShell o curl. Per lo script o il comando curl di PowerShell, passare alle sezioni seguenti:

Se l'app Web viene eseguita in un server locale o in una macchina virtuale di Azure, connettersi al server o alla macchina virtuale e inviare un singolo record di telemetria all'istanza del servizio Applications Insights tramite PowerShell. Se l'app Web che presenta problemi durante l'invio di dati di telemetria viene eseguita in Kudu, eseguire lo script seguente dalla console di debug di PowerShell di Kudu in Azure App Web.

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

Nota

  • Prima di eseguire il Invoke-WebRequest cmdlet, eseguire il $ProgressPreference = "SilentlyContinue" cmdlet.
  • Non è possibile usare -Verbose o -Debug. -UseBasicParsingUsare invece .

Dopo aver inviato un record di telemetria di esempio usando PowerShell, passare alla scheda Log di Application Insights nel portale di Azure e verificare se arriva. Se viene visualizzato il record di telemetria di esempio, viene eliminata una parte elevata della pipeline di elaborazione.

Un record di telemetria di esempio salvato e visualizzato correttamente significa:

  • Il server locale o la macchina virtuale dispone di DNS che si risolve nell'indirizzo IP corretto.
  • La rete ha recapitato l'esempio all'endpoint di inserimento senza blocco o eliminazione.
  • L'endpoint di inserimento ha accettato il payload di esempio ed è stato elaborato tramite la pipeline di inserimento.
  • Log Analytics ha salvato correttamente il record di esempio.
  • La scheda Log portale di Azure è in grado di eseguire query sull'API (api.applicationinsights.io) ed eseguire il rendering del record di esempio nel portale di Azure.

Se il record di esempio generato arriva all'istanza di Application Insights ed è possibile eseguire query per il record di esempio usando il menu della risorsa Log , risolvere i problemi relativi all'SDK o all'agente di Application Insights. È quindi possibile procedere con la raccolta di log SDK, log di diagnostica automatica o tracce del profiler, a seconda di quale sia appropriato per l'SDK o la versione dell'agente.

Nelle sezioni seguenti vengono fornite informazioni sull'invio di un record di telemetria di esempio tramite PowerShell o curl.

Script di PowerShell per inviare il risultato del test di disponibilità

I risultati dei test di disponibilità sono il tipo di telemetria ideale con cui eseguire il test. Il motivo è che la pipeline di inserimento non esegue mai un'analisi dei risultati dei test di disponibilità. Se si invia un record di telemetria della richiesta, potrebbe essere campionato quando è stato abilitato il campionamento di inserimento. Iniziare con un risultato del test di disponibilità di esempio e quindi provare altri tipi di telemetria in base alle esigenze.

Ecco uno script di PowerShell di esempio che invia un risultato del test di disponibilità:

# 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

Questo script compila una richiesta REST non elaborata per distribuire un singolo risultato del test di disponibilità al componente Application Insights. Quando si usa questo script, specificare il $ConnectionString parametro o $InstrumentationKey .

  • Se viene fornito solo il parametro stringa di connessione, i dati di telemetria verranno inviati all'endpoint di area nel stringa di connessione.
  • Se viene specificato solo il parametro della chiave di strumentazione (ikey), i dati di telemetria verranno inviati all'endpoint di inserimento globale.
  • Se vengono forniti sia i parametri stringa di connessione che ikey, lo script invierà dati di telemetria all'endpoint di area nel stringa di connessione.

Nota

  • Testare la connessione eseguita dall'applicazione. Se si abilita Application Insights nel portale di Azure, è probabile che ci si basi su stringhe di connessione con endpoint internazionali, https://<region>.in.applicationinsights.azure.com. Se la configurazione dell'SDK fornisce solo la chiave ikey, si fa affidamento sull'endpoint globale, https://dc.applicationinsights.azure.com. Assicurarsi di popolare il parametro script corrispondente alla configurazione dell'SDK dell'applicazione Web, specificando il stringa di connessione o la chiave ikey.
  • Il 31 marzo 2025 il supporto per l'inserimento di chiavi di strumentazione terminerà. L'inserimento della chiave di strumentazione continuerà a funzionare, ma non verranno più forniti aggiornamenti o supporto per la funzionalità. Passare alle stringhe di connessione per sfruttare le nuove funzionalità.

È più semplice eseguire questo script dall'ambiente PowerShell ISE in un'istanza del set di scalabilità di macchine virtuali IaaS o Azure. È anche possibile copiare e incollare lo script nella console di debug di PowerShell dell'interfaccia servizio app Kudu e quindi eseguirlo.

Quando viene eseguito lo script, cercare una risposta HTTP 200 ed esaminare i dettagli della risposta. Come parte del payload JSON della risposta, sono previsti i dettagli seguenti:

  • Il itemsReceived conteggio corrisponde a itemsAccepted.
  • L'endpoint di inserimento informa il client: è stato inviato un record di telemetria ed è stato accettato un record di telemetria.

Fare riferimento allo screenshot seguente come esempio:

Codice che mostra la quantità di elementi ricevuti e gli elementi accettati.

Comando Curl per inviare il risultato del test di disponibilità

Se si eseguono macchine virtuali Linux, usare curl anziché PowerShell per inviare una richiesta REST simile. È necessario modificare il nome host dell'endpoint di inserimento, il iKey valore e i time valori. L'endpoint di inserimento di Application Insights non accetta record precedenti a 48 ore.

Ecco i comandi curl di esempio che inviano un singolo risultato del test di disponibilità:

  • Comando Curl per 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
    
  • Comando Curl per 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
    

Script di PowerShell per inviare il record di telemetria della richiesta

Per risolvere i problemi di telemetria delle richieste mancanti, usare lo script di PowerShell seguente per testare l'invio di un singolo record di telemetria della richiesta. Questo tipo di telemetria è soggetto alla configurazione del campionamento di inserimento sul lato server. Verificare che il campionamento di inserimento sia disattivato per verificare se il record di test è stato salvato correttamente.

# 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

Risolvere i problemi di configurazione ssl o TLS

Se gli script precedenti hanno esito negativo, risolvere i problemi relativi alla configurazione SSL o TLS. La maggior parte degli endpoint di inserimento richiede ai client di usare TLS 1.2 e pacchetti di crittografia specifici. In questo caso, modificare la modalità di partecipazione di PowerShell come client nel protocollo SSL o TLS. Includere i frammenti di codice seguenti se è necessario diagnosticare un canale sicuro come parte della connessione tra la macchina virtuale client e gli endpoint di inserimento.

  • Opzione 1: controllare quale protocollo SSL o TLS viene usato da PowerShell per stabilire una connessione all'endpoint di inserimento.

    Rimuovere il commento da una delle righe seguenti rimuovendo il # carattere e aggiungendoli prima del Invoke-WebRequest cmdlet nello script di PowerShell per controllare il protocollo usato nella richiesta REST di test:

    # 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
    
  • Opzione 2: ignorare eventuali problemi di convalida del certificato SSL.

    Se si dispone di un firewall o di un server proxy che partecipa all'offload del certificato SSL, ignorare eventuali problemi relativi ai certificati SSL aggiungendo il frammento di codice seguente poco prima del Invoke-WebRequest 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
    

Se l'applicazione usa per impostazione predefinita le impostazioni TLS predefinite del sistema o del server, modificare tali impostazioni predefinite all'interno del Registro di sistema nei computer Windows. Per informazioni dettagliate, vedere Impostazioni del Registro di sistema transport layer security (TLS).

Se è necessario modificare il protocollo TLS/SSL predefinito usato da un'applicazione .NET, seguire le indicazioni in Procedure consigliate di Transport Layer Security (TLS) con .NET Framework.

Risolvere i problemi di installazione o configurazione dell'SDK o dell'agente di Application Insights

Se l'invio di dati di telemetria dal computer host dell'applicazione tramite PowerShell o curl ha esito positivo, è probabile che la telemetria mancante sia dovuta a problemi di configurazione o configurazione dell'SDK o dell'agente di Application Insights. Abilitare il monitoraggio di Application Insights per l'host dell'applicazione e il linguaggio di programmazione per verificare che tutte le configurazioni o il codice seguano le indicazioni ed esempi appropriati.

Se i test eseguiti usando PowerShell o curl non riescono a inviare dati di telemetria all'endpoint di inserimento, verificare alcuni problemi comuni correlati sul lato client che possono contribuire al problema:

  • Dns nella rete non riesce a risolvere l'endpoint di inserimento nell'indirizzo IP corretto.
  • La connessione TCP dal server applicazioni all'endpoint di inserimento può essere bloccata da firewall o dispositivi gateway.
  • L'endpoint di inserimento a cui si connette l'SDK può richiedere TLS 1.2, ma l'applicazione può usare per impostazione predefinita TLS 1.0 o TLS 1.1.
  • È possibile che più di un monitoraggio di Azure collegamento privato influirà sulla rete privata, che potrebbe sovrascrivere le voci DNS per risolvere l'endpoint di inserimento nell'indirizzo IP privato errato.

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.