Solucionar problemas de telemetria de aplicativo ausente no Azure Monitor Application Insights

Este artigo ajuda você a identificar a etapa do pipeline de processamento que faz com que a telemetria fique ausente testando a conectividade e a ingestão de telemetria usando o PowerShell ou o 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:

Etapas que a telemetria passa no pipeline de processamento.

Se a telemetria do aplicativo não aparecer no portal do Azure, falhas em todas as etapas do pipeline de processamento poderão ser a causa:

  • O SDK ou agente do Application Insights está configurado incorretamente e não envia a telemetria do aplicativo para o ponto de extremidade de ingestão.
  • O SDK ou o agente está configurado corretamente, mas a rede bloqueia chamadas para o ponto de extremidade de ingestão.
  • O ponto de extremidade de ingestão cai ou limita a telemetria de entrada.
  • O pipeline de ingestão cai ou reduz 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 falha ao api.applicationinsights.io consultar registros do Log Analytics.
  • O portal do Azure falha ao puxar 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 do serviço Applications Insights. Para identificar a etapa dentro do pipeline de processamento que causa sintomas de nenhum dado ou dados ausentes, envie um registro de telemetria de exemplo usando PowerShell ou curl. Para o script do PowerShell ou o comando curl, acesse as seguintes seções:

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 Applications Insights usando o PowerShell. Se o aplicativo Web que tem problemas para enviar a telemetria for executado no Kudu, execute o script a seguir do console de depuração do PowerShell do Kudu no Azure Aplicativos Web.

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

Observação

  • Antes de executar o Invoke-WebRequest cmdlet, emita 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 marcar se ele chegar. Se o registro de telemetria de exemplo for mostrado, uma grande parte do pipeline de processamento será eliminada.

Um registro de telemetria de exemplo que é salvo e exibido corretamente significa:

  • O servidor local ou VM tem DNS que resolve para o endereço IP correto.
  • A rede entregou o exemplo ao ponto de extremidade de ingestão sem bloquear ou soltar.
  • O ponto de extremidade de ingestão aceitou a carga de exemplo e a processou por meio do pipeline de ingestão.
  • O Log Analytics salvou corretamente o registro de exemplo.
  • A guia Logs 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 à instância do Application Insights e você puder consultar o registro de exemplo usando o menu de recursos logs , solucionar problemas do SDK ou do agente do Application Insights. Em seguida, você pode continuar coletando logs do SDK, logs de autognó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 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 amostra os resultados do teste de disponibilidade. Se você enviar um registro de telemetria de solicitação, ele poderá ser amostrado quando 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 script de exemplo 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 para o componente Application Insights. Ao usar esse script, forneça o $ConnectionString parâmetro ou $InstrumentationKey .

  • Se apenas o parâmetro cadeia de conexão for fornecido, a telemetria será enviada para o ponto de extremidade regional no cadeia de conexão.
  • Se apenas o parâmetro da chave de instrumentação (ikey) for fornecido, a telemetria será enviada para o ponto de extremidade de ingestão global.
  • Se os parâmetros cadeia de conexão e ikey forem fornecidos, o script enviará telemetria para o ponto de extremidade regional no cadeia de conexão.

Observação

  • Teste a conexão feita pelo 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 apenas fornecer a chave, você confiará no ponto de extremidade 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 o cadeia de conexão ou o ikey.
  • Em 31 de março de 2025, o suporte à ingestão de chave de instrumentação terminará. A ingestão de chave de instrumentação continuará funcionando, mas não forneceremos mais atualizações ou suporte para o recurso. Faça a transição para cadeias de conexão para aproveitar novas funcionalidades.

É mais fácil executar esse script do ambiente ISE do PowerShell em uma instância de 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 Serviço de Aplicativo e executá-lo.

Quando o script for executado, procure uma resposta HTTP 200 e examine os detalhes da resposta. Como parte do conteúdo JSON de resposta, os seguintes detalhes são esperados:

  • A itemsReceived contagem corresponde ao itemsAccepted.
  • O ponto de extremidade de ingestão informa o cliente: você enviou um registro de telemetria e aceitamos um registro de telemetria.

Consulte a captura de tela a seguir como um exemplo:

Código que mostra a quantidade de itens recebidos e itens aceitos.

Comando Curl para enviar o resultado do teste de disponibilidade

Se você estiver executando VMs 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 comandos de curl de exemplo 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, solução de problemas da 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 um cliente no protocolo SSL ou TLS. Inclua os snippets a seguir se você 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.

    Descompacte qualquer uma das seguintes linhas removendo o # caractere e adicionando-os antes do Invoke-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: ignorar quaisquer problemas de validação de certificado SSL.

    Se você tiver um firewall ou servidor proxy que participe do descarregamento de certificadoSL, ignore quaisquer problemas de certificado SSL adicionando o seguinte snippet pouco 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 padrão para 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 de registro TLS (Transport Layer Security).

Se você precisar alterar o protocolo TLS/SSL padrão usado por um aplicativo .NET, siga as diretrizes nas práticas recomendadas do TLS (Transport Layer Security) com o .NET Framework.

Solucionar problemas de configuraçã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 o curl for bem-sucedido, a telemetria ausente provavelmente será devido a problemas de configuração ou configuração do SDK ou agente do Application Insights. Habilite o monitoramento do Application Insights para seu host de aplicativo e linguagem de programação para verificar se todas as suas configurações ou código seguem as diretrizes e exemplos adequados.

Se os testes realizados usando o PowerShell ou o 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 falha ao resolve o ponto de extremidade de ingestão para o endereço IP correto.
  • A conexão TCP do servidor de aplicativo com o ponto de extremidade 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 TLS 1.2, mas seu aplicativo pode, por padrão, usar O TLS 1.0 ou TLS 1.1.
  • Você pode ter mais de uma Link Privado do Azure Monitor afetando sua rede privada, o que pode substituir suas entradas DNS para resolve 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.