Résoudre les problèmes 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 des données de télémétrie à l’aide de PowerShell ou de curl.

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

Le graphique suivant montre les étapes où les données de télémétrie peuvent être manquantes pendant l’ingestion et la consommation :

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

Si les données de télémétrie de l’application ne s’affichent pas dans le Portail Azure, les échecs entre les étapes du pipeline de traitement peuvent en ê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 correctement configuré, mais le réseau bloque les appels au point de terminaison d’ingestion.
  • Le point de terminaison d’ingestion supprime ou limite la télémétrie entrante.
  • Le pipeline d’ingestion supprime 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 sur api.applicationinsights.io échoue lors de l’interrogation d’enregistrements à partir de Log Analytics.
  • Le Portail Azure ne parvient pas à extraire ou à restituer 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 temporaires peuvent se produire n’importe où dans le service Applications Insights. Pour identifier l’étape dans le 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 de curl. Pour le script PowerShell ou la commande 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 au service Applications Insights instance à l’aide de PowerShell. Si l’application web qui rencontre des problèmes d’envoi de données de télémétrie s’exécute 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

Remarque

  • Avant d’exécuter l’applet de Invoke-WebRequest commande, émettez l’applet de $ProgressPreference = "SilentlyContinue" 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 case activée s’il arrive. Si l’exemple d’enregistrement de télémétrie est affiché, une grande partie du pipeline de traitement est éliminé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 correspond à l’adresse IP correcte.
  • Le réseau a remis l’exemple au point de terminaison d’ingestion sans blocage ni suppression.
  • 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 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 ressource Journaux, résolvez les problèmes liés au Kit de développement logiciel (SDK) Application Insights ou à l’agent. Vous pouvez ensuite procéder à la collecte des journaux du SDK, des journaux d’auto-diagnostic ou des traces du profileur, selon ce qui est approprié pour la version du 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 de 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 avec lequel tester. La raison en 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 $ConnectionString paramètre ou $InstrumentationKey .

  • 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.

Remarque

  • Testez la connexion établie par votre application. Si vous activez Application Insights dans le Portail Azure, vous vous appuyez probablement sur des chaînes 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 global, https://dc.applicationinsights.azure.com. Veillez à renseigner le paramètre de script qui correspond à la configuration de votre sdk d’application web, en fournissant le chaîne de connexion ou l’ikey.
  • Le 31 mars 2025, la prise en charge de l’ingestion des clés d’instrumentation prendra fin. L’ingestion des clés d’instrumentation continuera de fonctionner, mais nous ne fournirons plus de mises à jour ni de prise en charge de la fonctionnalité. Passez aux chaînes de connexion pour tirer parti des nouvelles fonctionnalités.

Il est plus facile d’exécuter ce script à partir de l’environnement PowerShell ISE sur un groupe de machines virtuelles identiques IaaS ou Azure instance. Vous pouvez également copier et coller le script dans la console de débogage PowerShell App Service interface 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 la réponse, les détails suivants sont attendus :

  • Le itemsReceived nombre correspond à .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 données de télémétrie est sensible à la configuration de l’échantillonnage d’ingestion côté serveur. Vérifiez que l’échantillonnage d’ingestion est désactivé pour vérifier si l’enregistrement de test est correctement enregistré.

# 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 exigent que les clients utilisent TLS 1.2 et des suites de chiffrement 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 l’ajoutant avant l’applet Invoke-WebRequest de commande dans 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 avez un pare-feu ou 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 de Invoke-WebRequest 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 utilise par défaut les paramètres TLS par défaut du système ou du serveur, modifiez ces paramètres par défaut dans le Registre sur les ordinateurs Windows. Pour plus d’informations, consultez Paramètres du Registre TLS (Transport Layer Security).

Si vous devez modifier le protocole TLS/SSL par défaut utilisé par une application .NET, suivez les instructions fournies dans 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) Application Insights ou de l’agent

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 de curl réussit, les données de télémétrie manquantes sont probablement dues à des problèmes d’installation ou de configuration du SDK ou de l’agent Application Insights. Activez la surveillance d’Application Insights pour votre hôte d’application et votre langage de programmation pour vérifier que toutes vos configurations ou votre code suivent les instructions et les exemples appropriés.

Si les tests effectués à l’aide de PowerShell ou curl ne parviennent pas à envoyer des données de télémétrie au point de terminaison d’ingestion, vérifiez quelques problèmes courants liés au client qui peuvent 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 utiliser TLS 1.0 ou TLS 1.1 par défaut.
  • Vous pouvez avoir plusieurs Private Link 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.