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 falten datos de telemetría mediante la prueba de la conectividad y la ingesta de telemetría mediante PowerShell o curl.
Pasos que pueden provocar que falten datos de telemetría
En el gráfico siguiente se muestran los pasos en los que la telemetría puede faltar durante la ingesta y el consumo:
Si la telemetría de la aplicación no se muestra en Azure Portal, los errores en los pasos de la canalización de procesamiento podrían ser la causa:
- El SDK o el agente de Application Insights están mal configurados y no envían telemetría de la aplicación al punto de conexión de ingesta.
- El SDK o el agente se configuran correctamente, pero la red bloquea las llamadas al punto de conexión de ingesta.
- El punto de conexión de ingesta quita o limita la telemetría entrante.
- La canalización de ingesta disminuye 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
api.applicationinsights.io
la API de consulta al consultar registros de Log Analytics. - Azure Portal no puede extraer o representar los registros que está intentando ver.
Identificación paso mediante el envío de un registro de telemetría de ejemplo
Los problemas de configuración o los problemas transitorios pueden producirse en cualquier lugar del servicio Applications Insights. Para identificar el paso dentro de la canalización de procesamiento que causa síntomas de ningún dato o datos que faltan, 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:
- Script de PowerShell para enviar el resultado de la prueba de disponibilidad
- Comando Curl para enviar el resultado de la prueba de disponibilidad
- Script de PowerShell para enviar el registro de telemetría de solicitudes
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 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 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 el agente de Application Insights. A continuación, puede continuar con la recopilación de registros del SDK, registros de autodiagnóstico 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 cómo enviar 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 muestrea los resultados de las pruebas de disponibilidad. Si envía un registro de telemetría de solicitud, se podría muestrear cuando ha habilitado el muestreo de ingesta. Comience con un resultado de prueba de disponibilidad de ejemplo y 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 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 Azure Portal, es probable que confíe en cadena 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 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 la característica ya no recibirá actualizaciones ni soporte técnico. Transición a las 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 de 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 kudu de App Service y, a continuación, ejecutarlo.
Cuando se ejecuta 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: envió un registro de telemetría y aceptamos un registro de telemetría.
Consulte la captura de pantalla siguiente como ejemplo:
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 los comandos 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 cómo Participa PowerShell como cliente en el protocolo SSL o TLS. Incluya los fragmentos de código siguientes 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 elInvoke-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 cualquier problema 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 del servidor, cambie esa configuración predeterminada en el Registro en las máquinas Windows. Para 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 se realiza correctamente, 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 instrucciones y 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 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 una instancia de 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.