Solucionar problemas de telemetria de aplicativos ausente no Application Insights do Azure Monitor
Este artigo ajuda você a identificar a etapa no pipeline de processamento que faz com que a telemetria esteja ausente testando a conectividade e a ingestão de telemetria usando o PowerShell ou curl.
Etapas que podem fazer com que a telemetria esteja ausente
O gráfico a seguir mostra as etapas em que a telemetria pode estar ausente durante a ingestão e o consumo:
Se a telemetria do aplicativo não for exibida no portal do Azure, as falhas nas etapas do pipeline de processamento poderão ser a causa:
- O SDK ou agente do Application Insights está configurado incorretamente e não envia telemetria do aplicativo para o ponto de extremidade de ingestão.
- O SDK ou agente está configurado corretamente, mas a rede bloqueia chamadas para o ponto de extremidade de ingestão.
- O ponto de extremidade de ingestão descarta ou limita a telemetria de entrada.
- O pipeline de ingestão descarta ou retarda severamente a telemetria como parte de seu processamento devido à integridade do serviço.
- (Incomum) O Log Analytics enfrenta problemas de integridade do serviço ao salvar registros de telemetria.
- (Incomum) A API de consulta em
api.applicationinsights.io
falha ao consultar registros do Log Analytics. - O portal do Azure falha ao efetuar pull ou renderizar os registros que você está tentando exibir.
Identificar etapa enviando um registro de telemetria de exemplo
Problemas de configuração ou problemas transitórios podem ocorrer em qualquer lugar no serviço Application Insights. Para identificar a etapa dentro do pipeline de processamento que causa sintomas de ausência de dados ou dados ausentes, envie um registro de telemetria de exemplo usando o PowerShell ou curl. Para o script do PowerShell ou o comando curl, vá para as seguintes seções:
- Script do PowerShell para enviar o resultado do teste de disponibilidade
- Curl para enviar o resultado do teste de disponibilidade
- Script do PowerShell para enviar registro de telemetria de solicitação
Se o aplicativo Web for executado em um servidor local ou VM do Azure, conecte-se ao servidor ou à VM e envie um único registro de telemetria para a instância de serviço do Application Insights usando o PowerShell. Se o aplicativo Web que tem problemas para enviar telemetria for executado no Kudu, execute o script a seguir no console de depuração do PowerShell do Kudu nos Aplicativos Web do Azure.
$ProgressPreference = "SilentlyContinue"
Invoke-WebRequest -Uri $url -Method POST -Body $availabilityData -UseBasicParsing
Observação
- Antes de executar o cmdlet, emita
Invoke-WebRequest
o$ProgressPreference = "SilentlyContinue"
cmdlet. - Você não pode usar
-Verbose
ou-Debug
. Em vez disso, use-UseBasicParsing
.
Depois de enviar um registro de telemetria de exemplo usando o PowerShell, navegue até a guia Logs do Application Insights no portal do Azure e verifique se ele chega. Se o registro de telemetria de exemplo for mostrado, uma grande parte do pipeline de processamento será eliminada.
Um registro de telemetria de exemplo salvo e exibido corretamente significa:
- O servidor local ou VM tem DNS que resolve para o endereço IP correto.
- A rede entregou a amostra ao endpoint de ingestão sem bloquear ou descartar.
- O ponto de extremidade de ingestão aceitou a carga de amostra e a processou por meio do pipeline de ingestão.
- O Log Analytics salvou corretamente o registro de exemplo.
- A guia Logs do portal do Azure é capaz de consultar a API (
api.applicationinsights.io
) e renderizar o registro de exemplo no portal do Azure.
Se o registro de exemplo gerado chegar à sua instância do Application Insights e você puder consultar o registro de exemplo usando o menu de recursos Logs, solucione problemas do SDK ou do agente do Application Insights. Em seguida, você pode prosseguir com a coleta de logs do SDK, logs de autodiagnóstico ou rastreamentos do criador de perfil, o que for apropriado para a versão do SDK ou do agente.
As seções a seguir fornecem informações sobre como enviar um registro de telemetria de exemplo usando o PowerShell ou curl.
Script do PowerShell para enviar o resultado do teste de disponibilidade
Os resultados do teste de disponibilidade são o tipo de telemetria ideal para testar. O motivo é que o pipeline de ingestão nunca obtém amostras dos resultados do teste de disponibilidade. Se você enviar um registro de telemetria de solicitação, ele poderá ser amostrado quando você tiver habilitado a amostragem de ingestão. Comece com um resultado de teste de disponibilidade de exemplo e tente outros tipos de telemetria conforme necessário.
Aqui está um exemplo de script do PowerShell que envia um resultado de teste de disponibilidade:
# 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
Esse script cria uma solicitação REST bruta para fornecer um único resultado de teste de disponibilidade ao componente Application Insights. Ao usar esse script, forneça o $ConnectionString
parâmetro or $InstrumentationKey
.
- Se apenas o parâmetro de cadeia de conexão for fornecido, a telemetria será enviada para o ponto de extremidade regional na cadeia de conexão.
- Se apenas o parâmetro de chave de instrumentação (ikey) for fornecido, a telemetria será enviada para o ponto de extremidade de ingestão global.
- Se os parâmetros de cadeia de conexão e ikey forem fornecidos, o script enviará telemetria para o ponto de extremidade regional na cadeia de conexão.
Observação
- Teste a conexão feita pelo seu aplicativo. Se você habilitar o Application Insights no portal do Azure, provavelmente dependerá de cadeias de conexão com pontos de extremidade regionais,
https://<region>.in.applicationinsights.azure.com
. Se a configuração do SDK fornecer apenas o ikey, você contará com o endpoint global,https://dc.applicationinsights.azure.com
. Certifique-se de preencher o parâmetro de script que corresponde à configuração do SDK do aplicativo Web, fornecendo a cadeia de conexão ou o ikey. - Em 31 de março de 31, 2025, o suporte à ingestão de chave de instrumentação será encerrado. A ingestão de chave de instrumentação continuará funcionando, mas não forneceremos mais atualizações ou suporte para o recurso. Transição para cadeias de conexão para aproveitar as novas funcionalidades.
É mais fácil executar esse script no ambiente do ISE do PowerShell em uma instância do conjunto de dimensionamento de máquinas virtuais do IaaS ou do Azure. Você também pode copiar e colar o script no console de depuração do PowerShell da interface Kudu do Serviço de Aplicativo e executá-lo.
Quando o script for executado, procure uma resposta HTTP 200 e revise os detalhes da resposta. Como parte da carga JSON de resposta, os seguintes detalhes são esperados:
- A
itemsReceived
contagem corresponde aoitemsAccepted
. - O ponto de extremidade de ingestão informa ao cliente: você enviou um registro de telemetria e nós aceitamos um registro de telemetria.
Consulte a captura de tela a seguir como exemplo:
Curl para enviar o resultado do teste de disponibilidade
Se você estiver executando VMs do Linux, use curl em vez do PowerShell para enviar uma solicitação REST semelhante. Você precisa ajustar o nome do host do ponto de extremidade de ingestão, o iKey
valor e os time
valores. O ponto de extremidade de ingestão do Application Insights não aceita registros com mais de 48 horas.
Aqui estão exemplos de comandos curl que enviam um único resultado de teste de disponibilidade:
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 do PowerShell para enviar registro de telemetria de solicitação
Para solucionar problemas de telemetria de solicitação ausente, use o script do PowerShell a seguir para testar o envio de um único registro de telemetria de solicitação. Esse tipo de telemetria é suscetível à configuração de amostragem de ingestão do lado do servidor. Verifique se a amostragem de ingestão está desativada para confirmar se o registro de teste foi salvo corretamente.
# 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
Solucionar problemas de configuração de SSL ou TLS
Se os scripts acima falharem, solucione problemas de configuração SSL ou TLS. A maioria dos pontos de extremidade de ingestão exige que os clientes usem o TLS 1.2 e conjuntos de criptografia específicos. Nesse caso, ajuste como o PowerShell participa como cliente no protocolo SSL ou TLS. Inclua os snippets a seguir se precisar diagnosticar um canal seguro como parte da conexão entre a VM do cliente e os pontos de extremidade de ingestão.
Opção 1: controlar qual protocolo SSL ou TLS é usado pelo PowerShell para fazer uma conexão com o ponto de extremidade de ingestão.
Remova o comentário de qualquer uma das seguintes linhas removendo o
#
caractere e adicione-as antes doInvoke-WebRequest
cmdlet no script do PowerShell para controlar o protocolo usado na solicitação REST de teste:# 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
Opção 2: ignore quaisquer problemas de validação de certificado SSL.
Se você tiver um firewall ou servidor proxy que participe do descarregamento de certificado SSL, ignore quaisquer problemas de certificado SSL adicionando o seguinte snippet antes do
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 o aplicativo usar como padrão as configurações TLS padrão do sistema ou do servidor, altere essas configurações padrão no Registro em computadores Windows. Para obter detalhes, consulte Configurações do Registro TLS (Transport Layer Security).
Se você precisar alterar o protocolo TLS/SSL padrão usado por um aplicativo .NET, siga as diretrizes em Práticas recomendadas de TLS (Transport Layer Security) com o .NET Framework.
Solucionar problemas de instalação ou configuração do SDK ou agente do Application Insights
Se o envio de telemetria do computador host do aplicativo usando o PowerShell ou curl for bem-sucedido, a telemetria ausente provavelmente ocorrerá devido a problemas de instalação ou configuração do SDK ou agente do Application Insights. Habilite o monitoramento do Application Insights para o host do aplicativo e a linguagem de programação para verificar se todas as configurações ou códigos seguem as diretrizes e os exemplos adequados.
Se os testes executados usando o PowerShell ou curl não enviarem telemetria para o ponto de extremidade de ingestão, verifique alguns problemas comuns relacionados ao lado do cliente que podem contribuir para o problema:
- O DNS em sua rede não consegue resolver o ponto de extremidade de ingestão para o endereço IP correto.
- A conexão TCP do servidor de aplicativos com o terminal de ingestão pode ser bloqueada por firewalls ou dispositivos de gateway.
- O ponto de extremidade de ingestão ao qual o SDK se conecta pode exigir o TLS 1.2, mas seu aplicativo pode, por padrão, usar o TLS 1.0 ou o TLS 1.1.
- Você pode ter mais de um Link Privado do Azure Monitor afetando sua rede privada, o que pode substituir suas entradas DNS para resolver o ponto de extremidade de ingestão para o endereço IP privado errado.
Entre em contato conosco para obter ajuda
Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.