Deteção de anomalias e previsão

Os serviços cloud e os dispositivos IoT geram dados telemétricos que podem ser utilizados para obter informações como monitorizar o estado de funcionamento do serviço, processos de produção física e tendências de utilização. A realização da análise de série temporal é uma forma de identificar desvios no padrão destas métricas em comparação com o padrão de linha de base típico.

Linguagem de Pesquisa Kusto (KQL) contém suporte nativo para criação, manipulação e análise de várias séries temporais. Com o KQL, pode criar e analisar milhares de séries temporais em segundos, ativando soluções e fluxos de trabalho de monitorização quase em tempo real.

Este artigo detalha as capacidades de deteção e previsão de anomalias da série temporal do KQL. As funções de série temporal aplicáveis baseiam-se num modelo de decomposição robusto e conhecido, em que cada série temporal original é decomposta em componentes sazonais, de tendência e residuais. As anomalias são detetadas por valores atípicos no componente residual, enquanto a previsão é feita ao extrapolar os componentes sazonais e de tendência. A implementação do KQL melhora significativamente o modelo de decomposição básico através da deteção automática de sazonalidade, análise atípica robusta e implementação vetorizada para processar milhares de séries temporais em segundos.

Pré-requisitos

  • Uma conta Microsoft ou uma identidade de utilizador Microsoft Entra. Não é necessária uma subscrição do Azure.
  • Leia Análise de série temporal para obter uma descrição geral das capacidades de série temporal.

Modelo de decomposição de série temporal

A implementação nativa do KQL para predição de série temporal e deteção de anomalias utiliza um modelo de decomposição bem conhecido. Este modelo é aplicado a uma série temporal de métricas esperadas para manifestar comportamento periódico e de tendência, como tráfego de serviço, heartbeats de componentes e medições periódicas de IoT para prever valores de métricas futuros e detetar valores anómalos. A suposição deste processo de regressão é que, para além do comportamento sazonal e de tendência anteriormente conhecido, a série temporal é distribuída aleatoriamente. Em seguida, pode prever valores de métricas futuros dos componentes sazonais e de tendência, coletivamente denominados linha de base, e ignorar a parte residual. Também pode detetar valores anómalos com base em análises atípicas utilizando apenas a parte residual. Para criar um modelo de decomposição, utilize a função series_decompose(). A series_decompose() função utiliza um conjunto de séries temporais e decompõe automaticamente cada série temporal para os seus componentes sazonais, de tendência, residuais e de linha de base.

Por exemplo, pode decompor o tráfego de um serviço Web interno com a seguinte consulta:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend (baseline, seasonal, trend, residual) = series_decompose(num, -1, 'linefit')  //  decomposition of a set of time series to seasonal, trend, residual, and baseline (seasonal+trend)
| render timechart with(title='Web app. traffic of a month, decomposition', ysplit=panels)

Decomposição de série temporal.

  • A série temporal original é identificada como núm (a vermelho).
  • O processo começa pela deteção automática da sazonalidade com a função series_periods_detect() e extrai o padrão sazonal (em roxo).
  • O padrão sazonal é subtraído da série temporal original e é executada uma regressão linear com a função series_fit_line() para localizar o componente de tendência (em azul claro).
  • A função subtrai a tendência e o restante é o componente residual (a verde).
  • Por fim, a função adiciona os componentes sazonais e de tendência para gerar a linha de base (a azul).

Deteção de anomalias de série temporal

A função series_decompose_anomalies() encontra pontos anómalos num conjunto de série temporal. Esta função chama series_decompose() para criar o modelo de decomposição e, em seguida, é executada series_outliers() no componente residual. series_outliers() calcula as pontuações de anomalias para cada ponto do componente residual com o teste de vedação do Tukey. As pontuações de anomalias acima de 1,5 ou abaixo de -1,5 indicam um ligeiro aumento ou declínio de anomalias, respetivamente. As pontuações de anomalias acima de 3.0 ou abaixo de -3.0 indicam uma anomalia forte.

A seguinte consulta permite-lhe detetar anomalias no tráfego interno do serviço Web:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend (anomalies, score, baseline) = series_decompose_anomalies(num, 1.5, -1, 'linefit')
| render anomalychart with(anomalycolumns=anomalies, title='Web app. traffic of a month, anomalies') //use "| render anomalychart with anomalycolumns=anomalies" to render the anomalies as bold points on the series charts.

Deteção de anomalias de série temporal.

  • A série temporal original (a vermelho).
  • O componente de linha de base (sazonal + tendência) (a azul).
  • Os pontos anómalos (em roxo) sobre a série temporal original. Os pontos anómalos desviam-se significativamente dos valores de linha de base esperados.

Previsão de série temporal

A função series_decompose_forecast() prevê valores futuros de um conjunto de séries temporizadores. Esta função chama series_decompose() para criar o modelo de decomposição e, em seguida, para cada série temporal, extrapola o componente de linha de base para o futuro.

A seguinte consulta permite-lhe prever o tráfego do serviço Web da próxima semana:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let horizon=7d;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t+horizon step dt by sid 
| where sid == 'TS1'   //  select a single time series for a cleaner visualization
| extend forecast = series_decompose_forecast(num, toint(horizon/dt))
| render timechart with(title='Web app. traffic of a month, forecasting the next week by Time Series Decomposition')

Previsão de série temporal.

  • Métrica original (a vermelho). Os valores futuros estão em falta e estão definidos como 0, por predefinição.
  • Extrapolar o componente de linha de base (a azul) para prever os valores da próxima semana.

Escalabilidade

Linguagem de Pesquisa Kusto sintaxe permite que uma única chamada processe várias séries de tempo. A implementação otimizada exclusiva permite um desempenho rápido, que é fundamental para a deteção e previsão eficazes de anomalias ao monitorizar milhares de contadores em cenários quase em tempo real.

A seguinte consulta mostra o processamento de três séries temporizadores em simultâneo:

let min_t = datetime(2017-01-05);
let max_t = datetime(2017-02-03 22:00);
let dt = 2h;
let horizon=7d;
demo_make_series2
| make-series num=avg(num) on TimeStamp from min_t to max_t+horizon step dt by sid
| extend offset=case(sid=='TS3', 4000000, sid=='TS2', 2000000, 0)   //  add artificial offset for easy visualization of multiple time series
| extend num=series_add(num, offset)
| extend forecast = series_decompose_forecast(num, toint(horizon/dt))
| render timechart with(title='Web app. traffic of a month, forecasting the next week for 3 time series')

Escalabilidade de série temporal.

Resumo

Este documento detalha as funções KQL nativas para deteção e previsão de anomalias de série temporal. Cada série temporal original é decomposta em componentes sazonais, de tendência e residuais para detetar anomalias e/ou previsão. Estas funcionalidades podem ser utilizadas para cenários de monitorização quase em tempo real, tais como deteção de falhas, manutenção preditiva e previsão de procura e carga.