Extraire des données à partir de données de chaîne structurées

Effectué

Les champs de chaînes peuvent également contenir des données structurées telles que des paires clé-valeur ou JSON. Le KQL fournit un accès facile à ces valeurs pour une analyse plus poussée.

Champs dynamiques

Dans une table Log Analytics, certains types de champs sont définis comme dynamiques. Les champs dynamiques contiennent une paire clé-valeur telle que :

{"eventCategory":"Autoscale","eventName":"GetOperationStatusResult","operationId":"xxxxxxxx-6a53-4aed-bab4-575642a10226","eventProperties":"{\"OldInstancesCount\":6,\"NewInstancesCount\":5}","eventDataId":" xxxxxxxx -efe3-43c2-8c86-cd84f70039d3","eventSubmissionTimestamp":"2020-11-30T04:06:17.0503722Z","resource":"ch-appfevmss-pri","resourceGroup":"CH-RETAILRG-PRI","resourceProviderValue":"MICROSOFT.COMPUTE","subscriptionId":" xxxxxxxx -7fde-4caf-8629-41dc15e3b352","activityStatusValue":"Succeeded"}

Pour accéder aux chaînes dans un champ dynamique, utilisez la notation par points. Le champ DeviceDetail de la table SigninLogs est de type dynamique. Dans cet exemple, vous pouvez accéder au système d’exploitation avec le nom de champ DeviceDetail.operatingSystem.

SigninLogs 
| extend OS = DeviceDetail.operatingSystem

L’exemple de requête ci-dessous illustre l’utilisation de champs dynamiques avec la table SigninLogs.

// Example query for SigninLogs showing how to break out packed fields.

SigninLogs 
| extend OS = DeviceDetail.operatingSystem, Browser = DeviceDetail.browser 
| extend StatusCode = tostring(Status.errorCode), StatusDetails = tostring(Status.additionalDetails) 
| extend Date = startofday(TimeGenerated) 
| summarize count() by Date, Identity, UserDisplayName, UserPrincipalName, IPAddress, ResultType, ResultDescription, StatusCode, StatusDetails 
| sort by Date

JSON

Le KQL fournit des fonctions permettant de manipuler un JSON stocké dans des champs de chaîne. De nombreux journaux envoient des données au format JSON, ce qui vous oblige à savoir comment transformer des données JSON en champs interrogeables.

L’exemple ci-dessous est une liste de fonctions et d’opérateurs liés à JSON.

Fonction Description
parse_json() ou todynamic() Interprète une chaîne en tant que valeur JSON et retourne la valeur comme dynamique. Utilisez l’une ou l’autre de ces fonctions pour faire référence à un champ : JsonField.Key ou JsonField["Key"]
mv-expand L’opérateur est appliqué à un tableau ou à une colonne de jeu de propriétés de type dynamique afin que chaque valeur de la collection obtienne une ligne distincte. Toutes les autres colonnes d’une ligne développée sont dupliquées. mv_expand est le moyen le plus simple de traiter des tableaux JSON.
mv-apply Applique une sous-requête à chaque enregistrement, et retourne l’union des résultats de toutes les sous-requêtes. Appliquez une requête à chaque valeur dans un tableau.

Exécutez chaque requête séparément pour voir les résultats.

SigninLogs 
| extend AuthDetails =  parse_json(AuthenticationDetails) 
| extend AuthMethod =  AuthDetails[0].authenticationMethod 
| extend AuthResult = AuthDetails[0].["authenticationStepResultDetail"] 
| project AuthMethod, AuthResult, AuthDetails 


SigninLogs 
| mv-expand AuthDetails = parse_json(AuthenticationDetails) 
| project AuthDetails

SigninLogs 
| mv-apply AuthDetails = parse_json(AuthenticationDetails) on
(where AuthDetails.authenticationMethod == "Password")