Partager via


Consultez Résoudre les problèmes de données de télémétrie d’application manquantes dans Azure Monitor Application Insights

Cet article vous aide à identifier l’étape du pipeline de traitement qui entraîne l’absence de données de télémétrie en testant la connectivité et l’ingestion de télémétrie à l’aide de PowerShell ou curl.

Étapes qui peuvent entraîner l’absence de données de télémétrie

Le graphique suivant montre les étapes où la télémétrie peut être manquante pendant l’ingestion et la consommation :

Étapes que les données de télémétrie passent dans le pipeline de traitement.

Si la télémétrie d’application ne s’affiche pas dans le Portail Azure, les échecs entre les étapes du pipeline de traitement peuvent être la cause :

  • Le SDK ou l’agent Application Insights est mal configuré et n’envoie pas de données de télémétrie d’application au point de terminaison d’ingestion.
  • Le SDK ou l’agent est configuré correctement, mais le réseau bloque les appels au point de terminaison d’ingestion.
  • Le point de terminaison d’ingestion supprime ou limite les données de télémétrie entrantes.
  • Le pipeline d’ingestion diminue ou ralentit gravement la télémétrie dans le cadre de son traitement en raison de l’intégrité du service.
  • (Rare) Log Analytics rencontre des problèmes d’intégrité du service lors de l’enregistrement des enregistrements de télémétrie.
  • (Rare) L’API de requête échoue api.applicationinsights.io lors de l’interrogation d’enregistrements à partir de Log Analytics.
  • La Portail Azure ne parvient pas à extraire ou à afficher les enregistrements que vous essayez d’afficher.

Identifier l’étape en envoyant un exemple d’enregistrement de télémétrie

Des problèmes de configuration ou des problèmes temporaires peuvent se produire n’importe où dans le service Applications Insights. Pour identifier l’étape du pipeline de traitement qui provoque des symptômes d’absence de données ou de données manquantes, envoyez un exemple d’enregistrement de télémétrie à l’aide de PowerShell ou curl. Pour la commande PowerShell ou curl, accédez aux sections suivantes :

Si l’application web s’exécute sur un serveur local ou une machine virtuelle Azure, connectez-vous au serveur ou à la machine virtuelle et envoyez un enregistrement de télémétrie unique à l’instance de service Applications Insights à l’aide de PowerShell. Si l’application web qui rencontre des problèmes lors de l’envoi de données de télémétrie sur Kudu, exécutez le script suivant à partir de la console de débogage PowerShell de Kudu dans Azure Web Apps.

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

Note

  • Avant d’exécuter l’applet de Invoke-WebRequest commande, émettez l’applet $ProgressPreference = "SilentlyContinue" de commande.
  • Vous ne pouvez pas utiliser -Verbose ou -Debug. Utilisez plutôt -UseBasicParsing.

Après avoir envoyé un exemple d’enregistrement de télémétrie à l’aide de PowerShell, accédez à l’onglet Journaux Application Insights dans le Portail Azure et vérifiez s’il arrive. Si l’exemple d’enregistrement de télémétrie est affiché, une grande partie du pipeline de traitement est supprimée.

Un exemple d’enregistrement de télémétrie correctement enregistré et affiché signifie :

  • Le serveur local ou la machine virtuelle dispose d’un DNS qui se résout à l’adresse IP correcte.
  • Le réseau a remis l’exemple au point de terminaison d’ingestion sans bloquer ou supprimer.
  • Le point de terminaison d’ingestion a accepté l’exemple de charge utile et l’a traité via le pipeline d’ingestion.
  • Log Analytics a correctement enregistré l’exemple d’enregistrement.
  • L’onglet Journaux d’activité Portail Azure peut interroger l’API (api.applicationinsights.io) et afficher l’exemple d’enregistrement dans le Portail Azure.

Si l’exemple d’enregistrement généré arrive à votre instance Application Insights et que vous pouvez interroger l’exemple d’enregistrement à l’aide du menu de ressources Journaux, résolvez les problèmes liés au Kit de développement logiciel (SDK) ou à l’agent Application Insights. Vous pouvez ensuite continuer à collecter les journaux du SDK, les journaux d’activité de diagnostic automatique ou les traces de profileur, le cas échéant pour la version du KIT de développement logiciel (SDK) ou de l’agent.

Les sections suivantes fournissent des informations sur l’envoi d’un exemple d’enregistrement de télémétrie à l’aide de PowerShell ou curl.

Script PowerShell pour envoyer le résultat du test de disponibilité

Les résultats des tests de disponibilité sont le type de télémétrie idéal à tester. La raison est que le pipeline d’ingestion n’échantillonne jamais les résultats des tests de disponibilité. Si vous envoyez un enregistrement de télémétrie de requête, il peut être échantillonné lorsque vous avez activé l’échantillonnage d’ingestion. Commencez par un exemple de résultat de test de disponibilité, puis essayez d’autres types de télémétrie si nécessaire.

Voici un exemple de script PowerShell qui envoie un résultat de test de 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

Ce script génère une requête REST brute pour fournir un résultat de test de disponibilité unique au composant Application Insights. Lorsque vous utilisez ce script, fournissez le ou $InstrumentationKey le $ConnectionString paramètre.

  • Si seul le paramètre chaîne de connexion est fourni, les données de télémétrie sont envoyées au point de terminaison régional dans le chaîne de connexion.
  • Si seul le paramètre de clé d’instrumentation (ikey) est fourni, les données de télémétrie sont envoyées au point de terminaison d’ingestion global.
  • Si les paramètres chaîne de connexion et ikey sont fournis, le script envoie des données de télémétrie au point de terminaison régional dans le chaîne de connexion.

Note

  • Testez la connexion établie par votre application. Si vous activez Application Insights dans le Portail Azure, vous vous appuyez probablement sur des chaîne de connexion avec des points de terminaison régionaux, https://<region>.in.applicationinsights.azure.com. Si votre configuration du Kit de développement logiciel (SDK) fournit uniquement l’ikey, vous vous appuyez sur le point de terminaison https://dc.applicationinsights.azure.comglobal. Veillez à remplir le paramètre de script qui correspond à la configuration du Kit de développement logiciel (SDK) de votre application web, en fournissant la chaîne de connexion ou l’ikey.
  • Le support de l’ingestion de clé d’instrumentation prendra fin le 31 mars 2025. L’ingestion de clé d’instrumentation continuera de fonctionner, mais nous ne fournirons plus de mises à jour ni de support pour la fonctionnalité. Passez aux chaînes de connexion pour tirer parti des nouvelles fonctionnalités.

Il est plus simple d’exécuter ce script à partir de l’environnement PowerShell ISE sur une instance de groupe de machines virtuelles identiques IaaS ou Azure. Vous pouvez également copier et coller le script dans la console de débogage PowerShell de l’interface App Service Kudu , puis l’exécuter.

Lorsque le script est exécuté, recherchez une réponse HTTP 200 et passez en revue les détails de la réponse. Dans le cadre de la charge utile JSON de réponse, les détails suivants sont attendus :

  • Le itemsReceived nombre correspond au itemsAccepted.
  • Le point de terminaison d’ingestion informe le client : vous avez envoyé un enregistrement de télémétrie et nous avons accepté un enregistrement de télémétrie.

Reportez-vous à la capture d’écran suivante comme exemple :

Code qui indique la quantité d’éléments reçus et d’éléments acceptés.

Commande Curl pour envoyer le résultat du test de disponibilité

Si vous exécutez des machines virtuelles Linux, utilisez curl au lieu de PowerShell pour envoyer une requête REST similaire. Vous devez ajuster le nom d’hôte du point de terminaison d’ingestion, la iKey valeur et les time valeurs. Le point de terminaison d’ingestion Application Insights n’accepte aucun enregistrement antérieur à 48 heures.

Voici des exemples de commandes curl qui envoient un résultat de test de disponibilité unique :

  • Commande Curl pour 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
    
  • Commande Curl pour 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 PowerShell pour envoyer un enregistrement de télémétrie de requête

Pour résoudre les problèmes de télémétrie des demandes manquantes, utilisez le script PowerShell suivant pour tester l’envoi d’un enregistrement de télémétrie de requête unique. Ce type de télémétrie est susceptible de la configuration d’échantillonnage d’ingestion côté serveur. Vérifiez que l’échantillonnage d’ingestion est désactivé pour confirmer si l’enregistrement de test est enregistré correctement.

# 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

Résoudre les problèmes de configuration SSL ou TLS

Si les scripts ci-dessus échouent, résolvez les problèmes de configuration SSL ou TLS. La plupart des points de terminaison d’ingestion nécessitent que les clients utilisent des suites de chiffrement TLS 1.2 et spécifiques. Dans ce cas, ajustez la façon dont PowerShell participe en tant que client au protocole SSL ou TLS. Incluez les extraits de code suivants si vous devez diagnostiquer un canal sécurisé dans le cadre de la connexion entre la machine virtuelle cliente et les points de terminaison d’ingestion.

  • Option 1 : Contrôler le protocole SSL ou TLS utilisé par PowerShell pour établir une connexion au point de terminaison d’ingestion.

    Supprimez les marques de commentaire des lignes suivantes en supprimant le # caractère et en les ajoutant avant l’applet Invoke-WebRequest de commande de votre script PowerShell pour contrôler le protocole utilisé dans la requête REST de 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
    
  • Option 2 : Ignorer les problèmes de validation de certificat SSL.

    Si vous disposez d’un pare-feu ou d’un serveur proxy qui participe au déchargement de certificat SSL, ignorez les problèmes de certificat SSL en ajoutant l’extrait de code suivant juste avant l’applet Invoke-WebRequest de commande :

    # 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 l’application a la valeur par défaut des paramètres TLS par défaut du système ou du serveur, modifiez ces paramètres par défaut dans le Registre sur les machines Windows. Pour plus d’informations, consultez les paramètres de Registre TLS (Transport Layer Security).

Si vous devez modifier le protocole TLS/SSL par défaut utilisé par une application .NET, suivez les instructions des meilleures pratiques TLS (Transport Layer Security) avec le .NET Framework.

Résoudre les problèmes d’installation ou de configuration du Kit de développement logiciel (SDK) Ou de l’agent Application Insights

Si l’envoi de données de télémétrie à partir de l’ordinateur hôte de votre application à l’aide de PowerShell ou curl réussit, les données de télémétrie manquantes sont probablement dues à des problèmes d’installation ou de configuration du Kit de développement logiciel (SDK) Ou de l’agent Application Insights. Activez l’analyse Application Insights pour votre hôte d’application et votre langage de programmation pour vérifier que toutes vos configurations ou code suivent des instructions et des exemples appropriés.

Si les tests effectués à l’aide de PowerShell ou curl n’envoient pas de données de télémétrie au point de terminaison d’ingestion, vérifiez quelques problèmes courants liés côté client susceptibles de contribuer au problème :

  • Dns sur votre réseau ne parvient pas à résoudre le point de terminaison d’ingestion en l’adresse IP correcte.
  • La connexion TCP de votre serveur d’applications au point de terminaison d’ingestion peut être bloquée par des pare-feu ou des appareils de passerelle.
  • Le point de terminaison d’ingestion auquel le SDK se connecte peut nécessiter TLS 1.2, mais votre application peut par défaut utiliser TLS 1.0 ou TLS 1.1.
  • Vous pouvez avoir plusieurs liaisons privées Azure Monitor impactant votre réseau privé, ce qui peut remplacer vos entrées DNS pour résoudre le point de terminaison d’ingestion en une adresse IP privée incorrecte.

Contactez-nous pour obtenir de l’aide

Pour toute demande ou assistance, créez une demande de support ou posez une question au support de la communauté Azure. Vous pouvez également soumettre des commentaires sur les produits à la communauté de commentaires Azure.