Solución de problemas de telemetría de aplicaciones que faltan en Azure Monitor Application Insights

Este artículo le ayuda a identificar el paso de la canalización de procesamiento que hace que falte telemetría mediante la prueba de la conectividad y la ingesta de telemetría mediante PowerShell o curl.

Pasos que pueden hacer que falte telemetría

En el gráfico siguiente se muestran los pasos en los que puede faltar telemetría durante la ingesta y el consumo:

Pasos que la telemetría pasa en la canalización de procesamiento.

Si la telemetría de la aplicación no se muestra en el Azure Portal, los errores en los pasos de la canalización de procesamiento podrían ser la causa:

  • El SDK o agente de Application Insights está mal configurado y no envía telemetría de la aplicación al punto de conexión de ingesta.
  • El SDK o el agente están configurados correctamente, pero la red bloquea las llamadas al punto de conexión de ingesta.
  • El punto de conexión de ingesta cae o limita la telemetría entrante.
  • La canalización de ingesta cae o ralentiza gravemente la telemetría como parte de su procesamiento debido al estado del servicio.
  • (Poco frecuente) Log Analytics se enfrenta a problemas de mantenimiento del servicio al guardar registros de telemetría.
  • (Poco frecuente) Se produce un error en la API de consulta en api.applicationinsights.io al consultar registros de Log Analytics.
  • El Azure Portal no puede extraer ni representar los registros que intenta ver.

Identificación del paso mediante el envío de un registro de telemetría de ejemplo

Pueden producirse problemas de configuración o transitorios en cualquier lugar del servicio Applications Insights. Para identificar el paso dentro de la canalización de procesamiento que provoca síntomas de que no hay datos o faltan datos, envíe un registro de telemetría de ejemplo mediante PowerShell o curl. Para el script de PowerShell o el comando curl, vaya a las secciones siguientes:

Si la aplicación web se ejecuta en un servidor local o una máquina virtual de Azure, conéctese al servidor o a la máquina virtual y envíe un único registro de telemetría a la instancia del servicio Applications Insights mediante PowerShell. Si la aplicación web que tiene problemas para enviar telemetría se ejecuta en Kudu, ejecute el siguiente script desde la consola de depuración de PowerShell de Kudu en Azure Web Apps.

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

Nota:

  • Antes de ejecutar el Invoke-WebRequest cmdlet, emita el $ProgressPreference = "SilentlyContinue" cmdlet .
  • No se puede usar -Verbose ni -Debug. En su lugar, use -UseBasicParsing.

Después de enviar un registro de telemetría de ejemplo mediante PowerShell, vaya a la pestaña Registros de Application Insights en el Azure Portal y compruebe si llega. Si se muestra el registro de telemetría de ejemplo, se elimina una gran parte de la canalización de procesamiento.

Un registro de telemetría de ejemplo que se guarda y muestra correctamente significa:

  • El servidor local o la máquina virtual tiene DNS que se resuelve en la dirección IP correcta.
  • La red entregó el ejemplo al punto de conexión de ingesta sin bloquear ni quitar.
  • El punto de conexión de ingesta aceptó la carga de ejemplo y la procesó a través de la canalización de ingesta.
  • Log Analytics guardó correctamente el registro de ejemplo.
  • La pestaña Registros de Azure Portal puede consultar la API (api.applicationinsights.io) y representar el registro de ejemplo en el Azure Portal.

Si el registro de ejemplo generado llega a la instancia de Application Insights y puede consultar el registro de ejemplo mediante el menú de recursos Registros , solucione los problemas del SDK o agente de Application Insights. A continuación, puede continuar con la recopilación de registros del SDK, registros de autodiagnóstica o seguimientos del generador de perfiles, lo que sea adecuado para la versión del SDK o del agente.

En las secciones siguientes se proporciona información sobre el envío de un registro de telemetría de ejemplo mediante PowerShell o curl.

Script de PowerShell para enviar el resultado de la prueba de disponibilidad

Los resultados de las pruebas de disponibilidad son el tipo de telemetría ideal con el que probar. El motivo es que la canalización de ingesta nunca muestra los resultados de las pruebas de disponibilidad. Si envía un registro de telemetría de solicitud, se podría muestrear cuando haya habilitado el muestreo de ingesta. Comience con un resultado de prueba de disponibilidad de ejemplo y, a continuación, pruebe otros tipos de telemetría según sea necesario.

Este es un script de PowerShell de ejemplo que envía un resultado de prueba de disponibilidad:

# 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

Este script crea una solicitud REST sin procesar para entregar un único resultado de prueba de disponibilidad al componente de Application Insights. Cuando use este script, proporcione el $ConnectionString parámetro o $InstrumentationKey .

  • Si solo se proporciona el parámetro cadena de conexión, la telemetría se enviará al punto de conexión regional en el cadena de conexión.
  • Si solo se proporciona el parámetro de clave de instrumentación (ikey), la telemetría se enviará al punto de conexión de ingesta global.
  • Si se proporcionan los parámetros cadena de conexión e ikey, el script enviará telemetría al punto de conexión regional en el cadena de conexión.

Nota:

  • Pruebe la conexión realizada por la aplicación. Si habilita Application Insights en el Azure Portal, probablemente se basa en cadenas de conexión con puntos de conexión regionales, https://<region>.in.applicationinsights.azure.com. Si la configuración del SDK solo proporciona la clave ikey, se basa en el punto de conexión global, https://dc.applicationinsights.azure.com. Asegúrese de rellenar el parámetro de script que coincida con la configuración del SDK de la aplicación web, ya sea proporcionando el cadena de conexión o la clave ikey.
  • El 31 de marzo de 2025 finalizará la compatibilidad con la ingesta de claves de instrumentación. La ingesta de claves de instrumentación seguirá funcionando, pero ya no proporcionaremos actualizaciones ni compatibilidad con la característica. Transición a cadenas de conexión para aprovechar las nuevas funcionalidades.

Es más fácil ejecutar este script desde el entorno de PowerShell ISE en una instancia del conjunto de escalado de máquinas virtuales de Azure o IaaS. También puede copiar y pegar el script en la consola de depuración de PowerShell de la interfaz de Kudu App Service y, a continuación, ejecutarlo.

Cuando se ejecute el script, busque una respuesta HTTP 200 y revise los detalles de la respuesta. Como parte de la carga json de respuesta, se esperan los detalles siguientes:

  • El itemsReceived recuento coincide con .itemsAccepted
  • El punto de conexión de ingesta informa al cliente: ha enviado un registro de telemetría y hemos aceptado un registro de telemetría.

Consulte la captura de pantalla siguiente como ejemplo:

Código que muestra la cantidad de elementos recibidos y los elementos aceptados.

Comando curl para enviar el resultado de la prueba de disponibilidad

Si ejecuta máquinas virtuales Linux, use curl en lugar de PowerShell para enviar una solicitud REST similar. Debe ajustar el nombre de host del punto de conexión de ingesta, el iKey valor y los time valores. El punto de conexión de ingesta de Application Insights no acepta registros anteriores a 48 horas.

Estos son comandos de curl de ejemplo que envían un único resultado de prueba de disponibilidad:

  • Comando Curl para 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 para 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 de PowerShell para enviar el registro de telemetría de solicitudes

Para solucionar problemas de telemetría de solicitudes que faltan, use el siguiente script de PowerShell para probar el envío de un único registro de telemetría de solicitud. Este tipo de telemetría es susceptible a la configuración de muestreo de ingesta del lado servidor. Compruebe que el muestreo de ingesta está desactivado para confirmar si el registro de prueba se guarda correctamente.

# 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

Solución de problemas de configuración de SSL o TLS

Si se produce un error en los scripts anteriores, solucione los problemas de configuración de SSL o TLS. La mayoría de los puntos de conexión de ingesta requieren que los clientes usen TLS 1.2 y conjuntos de cifrado específicos. En este caso, ajuste la forma en que PowerShell participa como cliente en el protocolo SSL o TLS. Incluya los siguientes fragmentos de código si necesita diagnosticar un canal seguro como parte de la conexión entre la máquina virtual cliente y los puntos de conexión de ingesta.

  • Opción 1: controlar qué protocolo SSL o TLS usa PowerShell para establecer una conexión con el punto de conexión de ingesta.

    Quite la marca de comentario de cualquiera de las líneas siguientes quitando el # carácter y agréguelos antes del cmdlet en el Invoke-WebRequest script de PowerShell para controlar el protocolo usado en la solicitud REST de prueba:

    # 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
    
  • Opción 2: Omitir los problemas de validación de certificados SSL.

    Si tiene un firewall o servidor proxy que participa en la descarga de certificados SSL, omita los problemas de certificado SSL agregando el siguiente fragmento de código justo antes 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
    

Si la aplicación tiene como valor predeterminado la configuración de TLS predeterminada del sistema o servidor, cambie esa configuración predeterminada en el Registro en máquinas Windows. Para obtener más información, consulte Configuración del Registro de seguridad de la capa de transporte (TLS).

Si necesita cambiar el protocolo TLS/SSL predeterminado que usa una aplicación .NET, siga las instrucciones de procedimientos recomendados de Seguridad de la capa de transporte (TLS) con .NET Framework.

Solución de problemas de configuración o configuración del SDK o agente de Application Insights

Si el envío de telemetría desde la máquina host de la aplicación mediante PowerShell o curl es correcto, es probable que falte telemetría debido a problemas de configuración o configuración del SDK o agente de Application Insights. Habilite la supervisión de Application Insights para el host de la aplicación y el lenguaje de programación para comprobar que todas las configuraciones o el código siguen las instrucciones y los ejemplos adecuados.

Si las pruebas realizadas mediante PowerShell o curl no pueden enviar telemetría al punto de conexión de ingesta, compruebe algunos problemas comunes relacionados con el lado cliente que pueden contribuir al problema:

  • DNS en la red no puede resolver el punto de conexión de ingesta en la dirección IP correcta.
  • La conexión TCP desde el servidor de aplicaciones al punto de conexión de ingesta puede estar bloqueada por firewalls o dispositivos de puerta de enlace.
  • El punto de conexión de ingesta al que se conecta el SDK puede requerir TLS 1.2, pero la aplicación puede usar TLS 1.0 o TLS 1.1 de forma predeterminada.
  • Es posible que tenga más de un Private Link de Azure Monitor que afecte a la red privada, lo que puede sobrescribir las entradas DNS para resolver el punto de conexión de ingesta en la dirección IP privada incorrecta.

Ponte en contacto con nosotros para obtener ayuda

Si tiene preguntas o necesita ayuda, cree una solicitud de soporte o busque consejo en la comunidad de Azure. También puede enviar comentarios sobre el producto con los comentarios de la comunidad de Azure.