Condividi tramite


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

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

Passaggi che possono causare la mancanza dei 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 che i dati di telemetria passano nella pipeline di elaborazione.

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

  • Application Insights SDK o l'agente 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 riscontra problemi di integrità del servizio durante il salvataggio dei record di telemetria.
  • (Non comune) L'API di query in caso api.applicationinsights.io di errore durante l'esecuzione di 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 i problemi temporanei possono verificarsi in qualsiasi punto del servizio Applications Insights. Per identificare il passaggio all'interno della pipeline di elaborazione che causa sintomi di nessun dato o di dati mancanti, inviare un record di telemetria di esempio usando PowerShell o curl. Per lo script di PowerShell o il comando curl, 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 usando PowerShell. Se l'app Web con problemi di invio dei 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

Note

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

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

Un record di telemetria di esempio salvato e visualizzato significa:

  • Il server locale o la macchina virtuale dispone di DNS che viene risolto nell'indirizzo IP corretto.
  • La rete ha recapitato l'esempio all'endpoint di inserimento senza bloccare o eliminare.
  • L'endpoint di inserimento ha accettato il payload di esempio ed 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 nella 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 delle risorse Log, risolvere i problemi relativi ad Application Insights SDK o all'agente. È quindi possibile procedere con la raccolta di log SDK, log auto diagnostici o tracce del profiler, a seconda dell'SDK o della versione dell'agente.

Le sezioni seguenti forniscono 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 campiona mai i risultati dei test di disponibilità. Se si invia un record di telemetria della richiesta, è possibile che venga 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 un esempio di script di PowerShell 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 recapitare 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 a livello di area nel stringa di connessione.
  • Se viene fornito solo il parametro di chiave di strumentazione (ikey), i dati di telemetria verranno inviati all'endpoint di inserimento globale.
  • Se vengono forniti entrambi i parametri stringa di connessione e ikey, lo script invierà dati di telemetria all'endpoint a livello di area nel stringa di connessione.

Note

  • Testare la connessione effettuata dall'applicazione. Se si abilita Application Insights nella portale di Azure, è probabile che ci si basi su stringa di connessione con endpoint a livello di area, https://<region>.in.applicationinsights.azure.com. Se la configurazione dell'SDK fornisce solo l'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 l'ikey.
  • Il 31 marzo 2025, il supporto per l'inserimento delle chiavi di strumentazione terminerà. L'inserimento delle chiavi di strumentazione continuerà a funzionare, ma non saranno più garantiti aggiornamenti o supporto per la funzionalità. Eseguire la transizione 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 di Azure o IaaS. È anche possibile copiare e incollare lo script nella console di debug di PowerShell dell'interfaccia Kudu servizio app 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 ed 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 alcuni 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 di campionamento per l'inserimento sul lato server. Verificare che il campionamento di inserimento sia disattivato per verificare se il record di test viene 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 un server proxy che partecipa all'offload del certificato SSL, ignorare eventuali problemi di certificato SSL aggiungendo il frammento di codice seguente subito 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 le 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 per Transport Layer Security (TLS) con .NET Framework.

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

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 installazione 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 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 relativi al lato client che potrebbero contribuire al problema:

  • IL 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 potrebbe richiedere TLS 1.2, ma per impostazione predefinita l'applicazione può usare TLS 1.0 o TLS 1.1.
  • Potrebbero essere presenti più di un monitoraggio di Azure collegamento privato che influisce 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.