Diagnóstico de anomalias para análise da causa raiz
Linguagem de Pesquisa Kusto (KQL) tem funções de deteção e previsão de anomalias incorporadas para verificar se existe um comportamento anómalo. Uma vez detetado um padrão deste tipo, pode ser executada uma Análise da Causa (RCA) para mitigar ou resolver a anomalia.
O processo de diagnóstico é complexo e moroso e é feito por especialistas em domínios. O processo inclui:
- Obter e associar mais dados de diferentes origens para o mesmo período de tempo
- À procura de alterações na distribuição de valores em múltiplas dimensões
- Gráficos com mais variáveis
- Outras técnicas baseadas em conhecimentos de domínio e intuição
Uma vez que estes cenários de diagnóstico são comuns, os plug-ins de machine learning estão disponíveis para facilitar a fase de diagnóstico e reduzir a duração da RCA.
Os três dos seguintes plug-ins do Machine Learning implementam algoritmos de clustering: autocluster
, basket
e diffpatterns
. O autocluster
cluster e basket
plug-ins é um único conjunto de registos e o diffpatterns
plug-in agrupará as diferenças entre dois conjuntos de registos.
Agrupar um único conjunto de registos
Um cenário comum inclui um conjunto de dados selecionado por critérios específicos, tais como:
- Janela de tempo que mostra um comportamento anómalo
- Leituras de dispositivos de alta temperatura
- Comandos de longa duração
- Principais utilizadores de gastos Pretende uma forma rápida e fácil de encontrar padrões comuns (segmentos) nos dados. Os padrões são um subconjunto do conjunto de dados cujos registos partilham os mesmos valores em várias dimensões (colunas categóricas).
A seguinte consulta compila e mostra uma série de exceções de serviço ao longo do período de uma semana, em caixas de dez minutos:
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")
A contagem de exceções de serviço está correlacionada com o tráfego geral do serviço. Pode ver claramente o padrão diário dos dias úteis, de segunda a sexta-feira. Há um aumento nas contagens de exceções de serviço a meio do dia e diminui nas contagens durante a noite. As contagens baixas planas são visíveis durante o fim de semana. Podem ser detetados picos de exceção com a deteção de anomalias de série temporal.
O segundo pico nos dados ocorre na tarde de terça-feira. A seguinte consulta é utilizada para diagnosticar e verificar se é um pico acentuado. A consulta redraws o gráfico em torno do pico numa resolução mais alta de oito horas em caixas de um minuto. Em seguida, pode estudar as suas fronteiras.
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")
Verá um pico estreito de dois minutos das 15:00 às 15:02. Na seguinte consulta, conte as exceções nesta janela de dois minutos:
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
de palavras |
---|
972 |
Na consulta seguinte, 20 exceções de exemplo de 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 | Region | ScaleUnit | DeploymentId | Ponto de Rastreio | 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 |
Utilizar o agrupamento automático() para o clustering de conjuntos de registos único
Apesar de existirem menos de mil exceções, ainda é difícil encontrar segmentos comuns, uma vez que existem múltiplos valores em cada coluna. Pode utilizar o autocluster()
plug-in para extrair instantaneamente uma pequena lista de segmentos comuns e encontrar os clusters interessantes nos dois minutos do pico, conforme visto na seguinte consulta:
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()
SegmentId | de palavras | Percentagem | Region | 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 |
Nos resultados acima, pode ver que o segmento mais dominante contém 65,74% do total de registos de exceção e partilha quatro dimensões. O segmento seguinte é muito menos comum. Contém apenas 9,67% dos registos e partilha três dimensões. Os outros segmentos são ainda menos comuns.
O autocluster utiliza um algoritmo proprietário para extrair múltiplas dimensões e extrair segmentos interessantes. "Interessante" significa que cada segmento tem uma cobertura significativa do conjunto de registos e das funcionalidades definidas. Os segmentos também divergem, o que significa que cada um é diferente dos outros. Um ou mais destes segmentos podem ser relevantes para o processo de RCA. Para minimizar a revisão e avaliação de segmentos, o clusterster automático extrai apenas uma pequena lista de segmentos.
Utilizar basket() para clustering de conjuntos de registos únicos
Também pode utilizar o basket()
plug-in conforme visto na seguinte consulta:
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()
SegmentId | de palavras | Percentagem | Region | ScaleUnit | DeploymentId | Ponto de rastreio | 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 |
O Basket implementa o algoritmo "Apriori" para a extração de conjuntos de itens. Extrai todos os segmentos cuja cobertura do conjunto de registos está acima de um limiar (5%). Pode ver que foram extraídos mais segmentos com segmentos semelhantes, como os segmentos 0, 1 ou 2, 3.
Ambos os plug-ins são poderosos e fáceis de utilizar. A limitação é que agrupam um único conjunto de registos de forma não supervisionada sem etiquetas. Não é claro se os padrões extraídos caracterizam o conjunto de registos selecionado, registos anómalos ou o conjunto de registos global.
Agrupar a diferença entre dois conjuntos de registos
O diffpatterns()
plug-in supera a limitação de autocluster
e basket
. Diffpatterns
utiliza dois conjuntos de registos e extrai os segmentos principais que são diferentes. Normalmente, um conjunto contém o conjunto de registos anómalo que está a ser investigado. Um é analisado por autocluster
e basket
. O outro conjunto contém o conjunto de registos de referência, a linha de base.
Na consulta seguinte, diffpatterns
encontra clusters interessantes nos dois minutos do pico, que são diferentes dos clusters na linha de base. A janela de linha de base é definida como os oito minutos antes das 15:00, quando o pico começou. Expande por uma coluna binária (AB) e especifique se um registo específico pertence à linha de base ou ao conjunto anómalo. Diffpatterns
implementa um algoritmo de aprendizagem supervisionado, onde as duas etiquetas de classe foram geradas pelo sinalizador anómalo versus o sinalizador de linha de base (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')
SegmentId | CountA | ContagemB | PercentA | PercentagemB | PercentDiffAB | Region | ScaleUnit | DeploymentId | Ponto de rastreio |
---|---|---|---|---|---|---|---|---|---|
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 |
O segmento mais dominante é o mesmo segmento que foi extraído por autocluster
. A sua cobertura na janela anómalo de dois minutos também é de 65,74%. No entanto, a sua cobertura na janela de linha de base de oito minutos é de apenas 1,7%. A diferença é de 64,04%. Esta diferença parece estar relacionada com o pico anómalo. Para verificar esta suposição, a seguinte consulta divide o gráfico original nos registos que pertencem a este segmento problemático e regista os de outros segmentos.
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
Este gráfico permite-nos ver que o pico na tarde de terça-feira se deveu a exceções deste segmento específico, detetado através do diffpatterns
plug-in.
Resumo
Os plug-ins do Machine Learning são úteis para vários cenários. O autocluster
e basket
implementam um algoritmo de aprendizagem não supervisionado e são fáceis de utilizar. Diffpatterns
implementa um algoritmo de aprendizagem supervisionado e, embora mais complexo, é mais poderoso para extrair segmentos de diferenciação para RCA.
Estes plug-ins são utilizados interativamente em cenários ad-hoc e em serviços de monitorização automáticos quase em tempo real. A deteção de anomalias de série temporal é seguida por um processo de diagnóstico. O processo é altamente otimizado para cumprir os padrões de desempenho necessários.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários