Diagnostic d’anomalie pour l’analyse de la cause racine
Langage de requête Kusto (KQL) dispose de fonctions intégrées de détection et de prévision des anomalies pour case activée en cas de comportement anormal. Une fois qu’un tel modèle est détecté, une analyse de la cause racine (RCA) peut être exécutée pour atténuer ou résoudre l’anomalie.
Le processus de diagnostic est long et complexe, et effectué par des experts du domaine. Ce processus inclut les éléments suivants :
- Extraction et jointure de données à partir de différentes sources pour la même période
- Recherche de changements dans la distribution des valeurs sur plusieurs dimensions
- Graphique d’autres variables
- Autres techniques basées sur les connaissances du domaine et l’intuition
Étant donné que ces scénarios de diagnostic sont courants, des plug-ins Machine Learning sont disponibles pour faciliter la phase de diagnostic et raccourcir la durée du RCA.
Les trois plug-ins Machine Learning suivants implémentent clustering algorithmes : autocluster
, basket
et diffpatterns
. Les plug-ins autocluster
et basket
regroupent en cluster un jeu d’enregistrements unique, et le plug-in diffpatterns
regroupe en cluster les différences entre deux jeux d’enregistrements.
Clustering d’un jeu d’enregistrements unique
Un scénario courant inclut un jeu de données sélectionné selon des critères spécifiques tels que :
- Période montrant un comportement anormal
- Mesures de températures élevées sur un appareil
- Commandes longue durée
- Utilisateurs dépensant le plus. Vous souhaitez disposer d’un moyen simple et rapide de rechercher des modèles (segments) courants dans les données. Les modèles sont un sous-ensemble du jeu de données dont les enregistrements partagent les mêmes valeurs sur plusieurs dimensions (colonnes catégorielles).
La requête suivante génère et affiche une série chronologique d’exceptions de service au cours d’une période d’une semaine, dans des emplacements de dix minutes :
let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m
| render timechart with(title="Service exceptions over a week, 10 minutes resolution")
Le nombre d’exceptions de service se met en corrélation avec l’ensemble du trafic de service. Vous pouvez voir clairement le modèle quotidien pour les jours ouvrables (du lundi au vendredi). Il y a une augmentation du nombre d’exceptions de service à la mi-journée et une baisse pendant la nuit. Ces nombres restent faibles et stables pendant le week-end. Des pics d’exception peuvent être détectés à l’aide de la détection d’anomalie de série chronologique.
Le deuxième pic de données se produit le mardi après-midi. La requête suivante permet d’affiner le diagnostic et de vérifier s’il s’agit d’un pic pointu. La requête redessine le graphique autour du pic dans une résolution plus élevée de huit heures dans des emplacements d’une minute. Vous pouvez ensuite étudier ses bordures.
let min_t=datetime(2016-08-23 11:00);
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to min_t+8h step 1m
| render timechart with(title="Zoom on the 2nd spike, 1 minute resolution")
Vous voyez un petit pic de deux minutes de 15 :00 à 15 :02. Dans la requête suivante, comptez les exceptions dans cette fenêtre de deux minutes :
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| count
Count |
---|
972 |
Dans la requête suivante, exemple de 20 exceptions sur 972 :
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| take 20
PreciseTimeStamp | Région | ScaleUnit | DeploymentId | Tracepoint | ServiceHost |
---|---|---|---|---|---|
2016-08-23 15:00:08.7302460 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 100005 | 00000000-0000-0000-0000-000000000000 |
2016-08-23 15:00:09.9496584 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 8d257da1-7a1c-44f5-9acd-f9e02ff507fd |
2016-08-23 15:00:10.5911748 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 100005 | 00000000-0000-0000-0000-000000000000 |
2016-08-23 15:00:12.2957912 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007007 | f855fcef-ebfe-405d-aaf8-9c5e2e43d862 |
2016-08-23 15:00:18.5955357 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 9d390e07-417d-42eb-bebd-793965189a28 |
2016-08-23 15:00:20.7444854 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 6e54c1c8-42d3-4e4e-8b79-9bb076ca71f1 |
2016-08-23 15:00:23.8694999 | eus2 | su2 | 89e2f62a73bb4efd8f545aeae40d7e51 | 36109 | 19422243-19b9-4d85-9ca6-bc961861d287 |
2016-08-23 15:00:26.4271786 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | 36109 | 3271bae4-1c5b-4f73-98ef-cc117e9be914 |
2016-08-23 15:00:27.8958124 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 904498 | 8cf38575-fca9-48ca-bd7c-21196f6d6765 |
2016-08-23 15:00:32.9884969 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 10007007 | d5c7c825-9d46-4ab7-a0c1-8e2ac1d83ddb |
2016-08-23 15:00:34.5061623 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 1002110 | 55a71811-5ec4-497a-a058-140fb0d611ad |
2016-08-23 15:00:37.4490273 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 10007006 | f2ee8254-173c-477d-a1de-4902150ea50d |
2016-08-23 15:00:41.2431223 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 103200 | 8cf38575-fca9-48ca-bd7c-21196f6d6765 |
2016-08-23 15:00:47.2983975 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | 423690590 | 00000000-0000-0000-0000-000000000000 |
2016-08-23 15:00:50.5932834 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 2a41b552-aa19-4987-8cdd-410a3af016ac |
2016-08-23 15:00:50.8259021 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 1002110 | 0d56b8e3-470d-4213-91da-97405f8d005e |
2016-08-23 15:00:53.2490731 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 36109 | 55a71811-5ec4-497a-a058-140fb0d611ad |
2016-08-23 15:00:57.0000946 | eus2 | su2 | 89e2f62a73bb4efd8f545aeae40d7e51 | 64038 | cb55739e-4afe-46a3-970f-1b49d8ee7564 |
2016-08-23 15:00:58.2222707 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007007 | 8215dcf6-2de0-42bd-9c90-181c70486c9c |
2016-08-23 15:00:59.9382620 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 10007006 | 451e3c4c-0808-4566-a64d-84d85cf30978 |
Utiliser autocluster() pour le clustering d’un jeu d’enregistrements unique
Même s’il existe moins d’un millier d’exceptions, il est toujours difficile de repérer les segments communs, car chaque colonne comporte plusieurs valeurs. Vous pouvez utiliser le plug-in autocluster()
pour extraire instantanément une courte liste de segments communs et rechercher les clusters intéressants compris dans la période des deux minutes du pic, comme indiqué dans la requête suivante :
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate autocluster()
ID de segment | Count | Pourcentage | Région | ScaleUnit | DeploymentId | ServiceHost |
---|---|---|---|---|---|---|
0 | 639 | 65.7407407407407 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
1 | 94 | 9.67078189300411 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | |
2 | 82 | 8.43621399176955 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | |
3 | 68 | 6.99588477366255 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | |
4 | 55 | 5.65843621399177 | weu | su4 | be1d6d7ac9574cbc9a22cb8ee20f16fc |
Vous pouvez voir dans les résultats ci-dessus que le segment le plus dominant contient 65,74 % du total des enregistrements d’exceptions totale et qu’il partage quatre dimensions. Le segment suivant est beaucoup moins courant. Il contient seulement 9,67 % des enregistrements et partage trois dimensions. Les autres segments sont encore moins courants.
Autocluster utilise un algorithme propriétaire pour explorer plusieurs dimensions et extraire des segments intéressants. « Intéressant » signifie que chaque segment couvre de manière importante le jeu d’enregistrements et le jeu de fonctionnalités. Les segments sont également divergents, ce qui signifie que chacun d’eux est différent des autres. Un ou plusieurs de ces segments peuvent être pertinents pour le processus RCA. Pour réduire le temps passé à examiner et évaluer les segments, autocluster extrait uniquement une petite liste de segments.
Utiliser basket() pour le clustering d’un jeu d’enregistrements unique
Vous pouvez également utiliser le plug-in basket()
comme indiqué dans la requête suivante :
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate basket()
ID de segment | Count | Pourcentage | Région | ScaleUnit | DeploymentId | Tracepoint | ServiceHost |
---|---|---|---|---|---|---|---|
0 | 639 | 65.7407407407407 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | e7f60c5d-4944-42b3-922a-92e98a8e7dec | |
1 | 642 | 66.0493827160494 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | ||
2 | 324 | 33.3333333333333 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | 0 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
3 | 315 | 32.4074074074074 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | 16108 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
4 | 328 | 33.7448559670782 | 0 | ||||
5 | 94 | 9.67078189300411 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | ||
6 | 82 | 8.43621399176955 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | ||
7 | 68 | 6.99588477366255 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | ||
8 | 167 | 17.1810699588477 | scus | ||||
9 | 55 | 5.65843621399177 | weu | su4 | be1d6d7ac9574cbc9a22cb8ee20f16fc | ||
10 | 92 | 9.46502057613169 | 10007007 | ||||
11 | 90 | 9.25925925925926 | 10007006 | ||||
12 | 57 | 5.8641975308642 | 00000000-0000-0000-0000-000000000000 |
Le plug-in basket implémente l’algorithme « Apriori » pour l’exploration de données d’un ensemble d’éléments. Il extrait tous les segments dont la couverture du jeu d’enregistrements est supérieure à un seuil (valeur par défaut : 5 %). Vous pouvez voir qu’un nombre plus important de segments ont été extraits avec des segments similaires, comme les segments 0, 1 ou 2, 3.
Les deux plug-ins sont puissants et simples d’utilisation. Leur inconvénient est qu’ils mettent en cluster un jeu d’enregistrements unique de manière non supervisée et sans étiquette. Il est difficile de savoir si les modèles extraits caractérisent le jeu d’enregistrements sélectionné, des enregistrements anormaux ou le jeu d’enregistrements global.
Mettre en cluster la différence entre deux jeux d’enregistrements
Le plug-in diffpatterns()
permet de résoudre la limite de autocluster
et basket
. Diffpatterns
prend deux jeux d’enregistrements et extrait les principaux segments qui diffèrent. Un jeu contient généralement le jeu d’enregistrements anormaux actuellement examiné. L’un est analysé par autocluster
et basket
. L’autre jeu contient le jeu d’enregistrements de référence : la base de référence.
Dans la requête suivante, diffpatterns
recherche des clusters intéressants dans les deux minutes du pic, qui sont différents des clusters dans la ligne de base. La fenêtre de la base de référence est définie comme correspondant aux huit minutes précédant 15h00, moment du début du pic. Vous étendez par une colonne binaire (AB) et vous indiquez si un enregistrement spécifique appartient à la base de référence ou au jeu anormal. Diffpatterns
implémente un algorithme d’apprentissage supervisé, où les deux libellés de classe ont été générés selon le rapport entre l’indicateur anormal et l’indicateur de référence (AB).
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
let min_baseline_t=datetime(2016-08-23 14:50);
let max_baseline_t=datetime(2016-08-23 14:58); // Leave a gap between the baseline and the spike to avoid the transition zone.
let splitime=(max_baseline_t+min_peak_t)/2.0;
demo_clustering1
| where (PreciseTimeStamp between(min_baseline_t..max_baseline_t)) or
(PreciseTimeStamp between(min_peak_t..max_peak_t))
| extend AB=iff(PreciseTimeStamp > splitime, 'Anomaly', 'Baseline')
| evaluate diffpatterns(AB, 'Anomaly', 'Baseline')
ID de segment | CountA | CountB | PercentA | PercentB | PercentDiffAB | Région | ScaleUnit | DeploymentId | Tracepoint |
---|---|---|---|---|---|---|---|---|---|
0 | 639 | 21 | 65.74 | 1.7 | 64.04 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | |
1 | 167 | 544 | 17.18 | 44.16 | 26.97 | scus | |||
2 | 92 | 356 | 9.47 | 28,9 | 19.43 | 10007007 | |||
3 | 90 | 336 | 9.26 | 27.27 | 18.01 | 10007006 | |||
4 | 82 | 318 | 8.44 | 25.81 | 17.38 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | |
5 | 55 | 252 | 5.66 | 20.45 | 14.8 | weu | su4 | be1d6d7ac9574cbc9a22cb8ee20f16fc | |
6 | 57 | 204 | 5.86 | 16.56 | 10.69 |
Le segment le plus dominant est le même segment que celui extrait par autocluster
. Sa couverture sur la fenêtre anormale de deux minutes est également de 65,74 %. Toutefois, sa couverture sur la fenêtre de base de référence de huit minutes est seulement de 1,7 %. La différence est de 64,04 %. Cette différence semble être liée au pic d’activité anormale. Pour vérifier cette hypothèse, la requête suivante divise le graphique d’origine en enregistrements appartenant à ce segment problématique et enregistre les autres segments.
let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));
demo_clustering1
| extend seg = iff(Region == "eau" and ScaleUnit == "su7" and DeploymentId == "b5d1d4df547d4a04ac15885617edba57"
and ServiceHost == "e7f60c5d-4944-42b3-922a-92e98a8e7dec", "Problem", "Normal")
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m by seg
| render timechart
Ce graphique permet de constater que le pic du mardi après-midi est survenu en raison d’exceptions issues de ce segment spécifique, découvertes à l’aide du plug-in diffpatterns
.
Résumé
Les plug-ins Machine Learning sont utiles pour de nombreux scénarios. Les plug-ins autocluster
et basket
implémentent un algorithme d’apprentissage non supervisé et sont simples d’utilisation. Diffpatterns
implémente un algorithme d’apprentissage supervisé et, bien que plus complexe, il est plus efficace pour l’extraction des segments de différenciation en vue d’une analyse de la cause racine.
Ces plug-ins sont utilisés de manière interactive dans des scénarios ad-hoc et dans des services de surveillance en temps réel quasi automatiques. La détection d’anomalie de série chronologique est suivie d’un processus de diagnostic. Ce processus est hautement optimisé pour répondre aux normes de performances nécessaires.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour