Mettre en corrélation les données Azure Data Explorer et Azure Resource Graph avec les données d’un espace de travail Log Analytics

Vous pouvez mettre en corrélation des données dans Azure Data Explorer et Azure Resource Graph avec des données dans votre espace de travail Log Analytics et vos ressources Application Insights pour améliorer votre analyse dans Journaux Azure Monitor. Microsoft Sentinel, qui stocke également des données dans des espaces de travail Log Analytics, prend en charge les requêtes entre services dans Azure Data Explorer, mais pas dans Azure Resource Graph. Cet article vous explique comment exécuter des requêtes entre services à partir d’un service qui stocke des données dans un espace de travail Log Analytics.

Exécutez des requêtes entre services en utilisant n’importe quel outil client qui prend en charge les requêtes Langage de requête Kusto (KQL), notamment l’interface utilisateur web Log Analytics, les classeurs, PowerShell et l’API REST.

Autorisations requises

Pour exécuter une requête interservices qui met en corrélation des données dans Azure Data Explorer ou Azure Resource Graph avec des données dans un espace de travail Log Analytics, vous avez besoin de ce qui suit :

  • Les autorisations Microsoft.OperationalInsights/workspaces/query/*/read dans les espaces de travail Log Analytics que vous interrogez, comme fourni par le rôle intégré de Lecteur Log Analytics, par exemple.
  • Autorisations de lecteur pour les ressources que vous interrogez dans Azure Resource Graph.
  • Autorisations de la visionneuse pour les tables que vous interrogez dans Azure Data Explorer.

Interroger des données dans Azure Data Explorer en utilisant adx()

Entrez l’identificateur d’un cluster Azure Data Explorer dans une requête au sein du modèle adx suivi du nom et de la table de la base de données.

adx('https://help.kusto.windows.net/Samples').StormEvents

Combiner des tables de cluster Azure Data Explorer avec un espace de travail Log Analytics

Utilisez la commande union pour combiner des tables de cluster avec un espace de travail Log Analytics.

Par exemple :

union customEvents, adx('https://help.kusto.windows.net/Samples').StormEvents
| take 10
let CL1 = adx('https://help.kusto.windows.net/Samples').StormEvents;
union customEvents, CL1 | take 10

Conseil

Le format de raccourci est autorisé : ClusterName/InitialCatalog. Par exemple, adx('help/Samples') est translaté par adx('help.kusto.windows.net/Samples').

Lorsque vous utilisez l’opérateurjoin au lieu d’une union, vous devez utiliser un hint pour combiner les données du cluster Azure Data Explorer avec l’espace de travail Log Analytics. Utiliser Hint.remote={Direction of the Log Analytics Workspace}.

Par exemple :

AzureDiagnostics
| join hint.remote=left adx("cluster=ClusterURI").AzureDiagnostics on (ColumnName)

Joindre les données d’un cluster Azure Data Explorer dans un locataire avec une ressource Azure Monitor située dans un autre

Les requêtes interlocataires entre les services ne sont pas prises en charge. Vous êtes connecté à un seul abonné pour exécuter la requête qui couvre les deux ressources.

Si la ressource Azure Data Explorer figure dans l’abonné A et que l’espace de travail Log Analytics figure dans l’abonné B, utilisez l’une des deux méthodes suivantes :

  • Utilisez Azure Data Explorer pour ajouter des rôles pour les principaux dans différents locataires. Ajoutez votre ID d’utilisateur dans l’abonné B en tant qu’utilisateur autorisé sur le cluster Azure Data Explorer. Validez le fait que la propriété TrustedExternalTenant sur le cluster Azure Data Explorer contient l’abonné B. Exécutez la requête croisée entièrement dans l’abonné B.
  • Utilisez Lighthouse pour projeter la ressource Azure Monitor dans l’abonné A.

Se connecter à des clusters Azure Data Explorer à partir de différents locataires

Kusto Explorer vous connecte automatiquement à l’abonné auquel le compte d’utilisateur appartient à l’origine. Pour accéder aux ressources d’autres abonnés avec le même compte d’utilisateur, vous devez spécifier TenantId de façon explicite dans la chaîne de connexion :

Data Source=https://ade.applicationinsights.io/subscriptions/SubscriptionId/resourcegroups/ResourceGroupName;Initial Catalog=NetDefaultDB;AAD Federated Security=True;Authority ID=TenantId

Interroger des données dans Azure Resource Graph en utilisant arg() (Préversion)

Entrez le modèle arg(""), suivi du nom de la table Azure Resource Graph.

Par exemple :

arg("").<Azure-Resource-Graph-table-name>

Conseil

L’opérateur arg() est désormais disponible pour la chasse avancée dans la plateforme Microsoft Defender unifiée. Cette fonctionnalité vous permet d’interroger uniquement les données Microsoft Sentinel. Découvrez-en davantage sur Utiliser l’opérateur arg() pour les requêtes Azure Resource Graph.

Voici quelques exemples de requêtes Azure Log Analytics qui utilisent les nouvelles fonctionnalités de requête interservices Azure Resource Graph :

  • Filtrez une requête Log Analytics en fonction des résultats d’une requête Azure Resource Graph :

    arg("").Resources 
    | where type == "microsoft.compute/virtualmachines" and properties.hardwareProfile.vmSize startswith "Standard_D"
    | join (
        Heartbeat
        | where TimeGenerated > ago(1d)
        | distinct Computer
        )
        on $left.name == $right.Computer
    
  • Créez une règle d’alerte qui s’applique uniquement à certaines ressources extraites d’une requête ARG :

    • Excluez les ressources en fonction des balises, par exemple pour ne pas déclencher d’alertes pour les machines virtuelles avec une balise « Test ».

      arg("").Resources
      | where tags.environment=~'Test'
      | project name 
      
    • Récupérez les données de performances liées à l’utilisation du processeur et filtrez les ressources avec la balise « prod ».

      InsightsMetrics
      | where Name == "UtilizationPercentage"
      | lookup (
          arg("").Resources 
          | where type == 'microsoft.compute/virtualmachines' 
          | project _ResourceId=tolower(id), tags
          )
          on _ResourceId
      | where tostring(tags.Env) == "Prod"
      

Plus de cas d’usage :

  • Utilisez une balise pour déterminer si les machines virtuelles doivent s’exécuter 24 h/24 et 7 j/7 ou si elles doivent être arrêtées la nuit.
  • Affichez des alertes sur n’importe quel serveur qui contient un certain nombre de cœurs.

Créer une alerte basée sur une requête interservices à partir de votre espace de travail Log Analytics

Pour créer une règle d’alerte basée sur une requête interservices à partir de votre espace de travail Log Analytics, suivez les étapes décrites dans Créer ou modifier une règle d’alerte de recherche dans les journaux, en sélectionnant votre espace de travail Log Analytics sous l’onglet Étendue.

Remarque

Vous pouvez également exécuter des requêtes interservices à partir d’Azure Data Explorer et d’Azure Resource Graph vers un espace de travail Log Analytics, en sélectionnant la ressource appropriée comme étendue de votre alerte.

Limites

Limitations générales des requêtes interservices

  • Les requêtes entre services ne prennent pas en charge les fonctions paramétrisées et les fonctions dont la définition inclut d’autres expressions entre espaces de travail ou entre services, notamment adx(), arg(), resource(), workspace() et app().
  • Les requêtes entre services prennent en charge les fonctions « .show » uniquement. Cette capacité permet aux requêtes entre clusters de référencer directement une fonction tabulaire d’Azure Monitor, Azure Data Explorer ou Azure Resource Graph. Les commandes suivantes sont prises en charge avec la requête interservices :
    • .show functions
    • .show function {FunctionName}
    • .show database {DatabaseName} schema as json
  • Les noms de base de données respectent la casse.
  • L’identification de la colonne Timestamp dans le cluster n’est pas prise en charge. L’API de requête Log Analytics ne passe pas le filtre de temps.
  • Les requêtes interservices prennent en charge seulement la récupération des données.
  • Private Link (points de terminaison privés) et les restrictions d’IP ne prennent pas en charge les requêtes entre services.
  • mv-expand est limité à 2 000 enregistrements.
  • Journaux Azure Monitor ne prend pas en charge la fonction external_table(), qui vous permet d’interroger des tables externes dans Azure Data Explorer. Pour interroger une table externe, définissez external_table(<external-table-name>) comme fonction sans paramètre dans Azure Data Explorer. Vous pouvez ensuite appeler la fonction en utilisant l’expression adx("").<function-name>.

Limitations des requêtes interservices Azure Resource Graph

  • Microsoft Sentinel ne prend pas en charge les requêtes entre services dans Azure Resource Graph.
  • Lorsque vous interrogez des données Azure Resource Graph depuis Azure Monitor :
    • La requête retourne uniquement les 1 000 premiers enregistrements.
    • Azure Monitor ne retourne pas d’erreurs de requête Azure Resource Graph.
    • L’éditeur de requêtes Log Analytics marque les requêtes Azure Resource Graph valides en tant qu’erreurs de syntaxe.
    • Les jointures ne sont pas prises en charge lorsque Hint n’est pas utilisé.
    • Ces opérateurs ne sont pas pris en charge : smv-apply(), rand(), arg_max(), arg_min(), avg(), avg_if(), countif(), sumif(), percentile(), percentiles(), percentilew(), percentilesw(), stdev(), stdevif(), stdevp(), variance(), variancep(), varianceif().

Combiner des tables Azure Resource Graph avec un espace de travail Log Analytics

Utilisez la commande union pour combiner des tables de cluster avec un espace de travail Log Analytics.

Par exemple :

union AzureActivity, arg("").Resources
| take 10
let CL1 = arg("").Resources ;
union AzureActivity, CL1 | take 10

Quand vous utilisez l’opérateur join au lieu de union, vous devez utiliser un hint pour combiner les données d’Azure Resource Graph avec les données de l’espace de travail Log Analytics. Utiliser Hint.remote={Direction of the Log Analytics Workspace}. Par exemple :

Perf | where ObjectName == "Memory" and (CounterName == "Available MBytes Memory")
| extend _ResourceId = replace_string(replace_string(replace_string(_ResourceId, 'microsoft.compute', 'Microsoft.Compute'), 'virtualmachines','virtualMachines'),"resourcegroups","resourceGroups")
| join hint.remote=left (arg("").Resources | where type =~ 'Microsoft.Compute/virtualMachines' | project _ResourceId=id, tags) on _ResourceId | project-away _ResourceId1 | where tostring(tags.env) == "prod"

Étapes suivantes