Compartilhar via


Análise de série temporal

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Os serviços de nuvem e dispositivos IoT geram dados de telemetria que podem ser usados para obter insights como monitoramento da integridade do serviço, processos de produção física e tendências de uso. Executar a análise de série temporal é uma maneira de identificar desvios no padrão dessas métricas em comparação com seu padrão de linha de base típico.

A KQL (Linguagem de Consulta Kusto) contém suporte nativo para criação, manipulação e análise de várias séries temporais. Neste artigo, saiba como o KQL é usado para criar e analisar milhares de séries temporais em segundos, permitindo soluções de monitoramento quase em tempo real e fluxos de trabalho.

Criação de série temporal

Nesta seção, criaremos um grande conjunto de séries temporais regulares de forma simples e intuitiva usando o make-series operador e preencheremos valores ausentes conforme necessário. A primeira etapa na análise de série temporal é particionar e transformar a tabela de telemetria original em um conjunto de séries temporais. A tabela geralmente contém uma coluna de marca temporal, dimensões contextuais e métricas opcionais. As dimensões são usadas para particionar os dados. A meta é criar milhares de séries temporais por partição em intervalos de tempo regulares.

A tabela de entrada demo_make_series1 contém 600 mil registros de tráfego arbitrário do serviço Web. Use o seguinte comando para amostrar 10 registros:

demo_make_series1 | take 10 

A tabela resultante contém uma coluna de timestamp, três colunas de dimensões contextuais e nenhuma métrica.

Timestamp BrowserVer OsVer País/região
2016-08-25 09:12:35.4020000 Chrome 51.0 Windows 7 Reino Unido
2016-08-25 09:12:41.1120000 Chrome 52.0 Windows 10
2016-08-25 09:12:46.2300000 Chrome 52.0 Windows 7 Reino Unido
2016-08-25 09:12:46.5100000 Chrome 52.0 Windows 10 Reino Unido
2016-08-25 09:12:46.5570000 Chrome 52.0 Windows 10 República da Lituânia
2016-08-25 09:12:47.0470000 Chrome 52.0 Windows 8.1 Índia
2016-08-25 09:12:51.3600000 Chrome 52.0 Windows 10 Reino Unido
2016-08-25 09:12:51.6930000 Chrome 52.0 Windows 7 Países Baixos
2016-08-25 09:12:56.4240000 Chrome 52.0 Windows 10 Reino Unido
2016-08-25 09:13:08.7230000 Chrome 52.0 Windows 10 Índia

Como não há métricas, só podemos criar um conjunto de séries temporais que representam a própria contagem de tráfego, particionada pelo sistema operacional usando a seguinte consulta:

let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| render timechart 
  • Use o make-series operador para criar um conjunto de três séries temporais, em que:
    • num=count(): série temporal de tráfego
    • from min_t to max_t step 1h: a série temporal é criada em intervalos de 1 hora dentro do intervalo de tempo (carimbos de data/hora mais antigos e mais recentes dos registros de tabela)
    • default=0: especifique o método de preenchimento para compartimentos ausentes para criar séries temporais regulares. Como alternativa, use series_fill_const()e series_fill_forward()series_fill_backward()series_fill_linear() para alterações
    • by OsVer: partição por sistema operacional
  • A estrutura de dados de série temporal real é uma matriz numérica do valor agregado por cada compartimento de tempo. Usamos render timechart para visualização.

Na tabela acima, temos três partições. Podemos criar uma série temporal separada: Windows 10 (vermelho), 7 (azul) e 8.1 (verde) para cada versão do sistema operacional, como visto no grafo:

Partição de série temporal.

Funções de análise de série temporal

Nesta seção, executaremos funções típicas de processamento de série. Depois que um conjunto de séries temporais é criado, o KQL dá suporte a uma lista crescente de funções para processá-las e analisá-las. Descreveremos algumas funções representativas para processar e analisar séries temporais.

Filtragem

A filtragem é uma prática comum no processamento de sinais e útil para tarefas de processamento de série temporal (por exemplo, suavizar um sinal barulhento, detecção de alterações).

  • Há duas funções de filtragem genéricas:
    • series_fir(): aplicando o filtro FIR. Usado para cálculo simples de média móvel e diferenciação da série temporal para detecção de alterações.
    • series_iir(): aplicando o filtro IIR. Usado para a suavização exponencial e a soma cumulativa.
  • Extend a série temporal definida adicionando uma nova série média móvel de tamanho 5 bins (denominada ma_num) à consulta:
let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart

Filtragem de série temporal.

Análise de regressão

Uma análise de regressão linear segmentada pode ser usada para estimar a tendência da série temporal.

  • Use series_fit_line() para ajustar a melhor linha a uma série temporal para detecção geral de tendências.
  • Use series_fit_2lines() para detectar alterações de tendência, em relação à linha de base, que são úteis em cenários de monitoramento.

Exemplo das funções series_fit_line() e series_fit_2lines() em uma consulta de série temporal:

demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)

Regressão de série temporal.

  • Azul: série temporal original
  • Verde: linha ajustada
  • Vermelho: duas linhas encaixadas

Observação

A função detectou com precisão o ponto de salto (alteração de nível).

Detecção de sazonalidade

Muitas métricas seguem padrões sazonais (periódicos). O tráfego de usuários de serviços de nuvem geralmente contém padrões diários e semanais que são mais altos no meio do dia comercial e mais baixos à noite e no fim de semana. Os sensores de IoT medem em intervalos periódicos. Medidas físicas, como temperatura, pressão ou umidade, também podem mostrar comportamento sazonal.

O exemplo a seguir aplica a detecção de sazonalidade ao tráfego de um serviço Web durante um mês (intervalos de 2 horas):

demo_series3
| render timechart 

Sazonalidade de série temporal.

  • Use series_periods_detect() para detectar automaticamente os períodos na série temporal, em que:
    • num: a série temporal a ser analisada
    • 0.: o comprimento mínimo do período em dias (0 significa que não há mínimo)
    • 14d/2h: o comprimento máximo do período em dias, que é de 14 dias dividido em intervalos de 2 horas
    • 2: o número de períodos a serem detectados
  • Use series_periods_validate() se soubermos que uma métrica deve ter períodos distintos específicos e queremos verificar se elas existem.

Observação

É uma anomalia se não existirem períodos específicos distintos

demo_series3
| project (periods, scores) = series_periods_detect(num, 0., 14d/2h, 2) //to detect the periods in the time series
| mv-expand periods, scores
| extend days=2h*todouble(periods)/1d
períodos Pontuações Dias
84 0.820622786055595 7
12 0.764601405803502 1

A função detecta sazonalidade diária e semanal. As pontuações diárias são menores do que a semanal porque os dias de fim de semana são diferentes dos dias da semana.

Funções em termos de elemento

Operações aritméticas e lógicas podem ser feitas em uma série temporal. Usando series_subtract() podemos calcular uma série temporal residual, ou seja, a diferença entre a métrica bruta original e uma suavizada e procurar anomalias no sinal residual:

let min_t = toscalar(demo_make_series1 | summarize min(TimeStamp));
let max_t = toscalar(demo_make_series1 | summarize max(TimeStamp));
demo_make_series1
| make-series num=count() default=0 on TimeStamp from min_t to max_t step 1h by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| extend residual_num=series_subtract(num, ma_num) //to calculate residual time series
| where OsVer == "Windows 10"   // filter on Win 10 to visualize a cleaner chart 
| render timechart

Operações de série temporal.

  • Azul: série temporal original
  • Vermelho: série temporal suavizada
  • Verde: séries temporais residuais

Fluxo de trabalho de séries temporais em escala

O exemplo a seguir mostra como essas funções podem ser executadas em escala em milhares de séries temporais em segundos para detecção de anomalias. Para ver alguns registros de telemetria de exemplo da métrica de contagem de leitura de um serviço de banco de dados ao longo de quatro dias, execute a seguinte consulta:

demo_many_series1
| take 4 
TIMESTAMP Loc Op DB DataRead
2016-09-11 21:00:00.0000000 Loc 9 5117853934049630089 262 0
2016-09-11 21:00:00.0000000 Loc 9 5117853934049630089 241 0
2016-09-11 21:00:00.0000000 Loc 9 -865998331941149874 262 279862
2016-09-11 21:00:00.0000000 Loc 9 371921734563783410 255 0

E estatísticas simples:

demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP) 
núm min_t max_t
2177472 2016-09-08 00:00:00.0000000 2016-09-11 23:00:00.0000000

A construção de uma série temporal em intervalos de 1 hora da métrica de leitura (total de quatro dias * 24 horas = 96 pontos) resulta em flutuação normal do padrão:

let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));  
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));  
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h
| render timechart with(ymin=0) 

Séries temporais em escala.

O comportamento acima é enganoso, pois a única série temporal normal é agregada de milhares de instâncias diferentes que podem ter padrões anormais. Portanto, criamos uma série temporal para cada instância. Uma instância é definida por Loc (local), Op (operação) e BD (computador específico).

Quantas séries temporais podemos criar?

demo_many_series1
| summarize by Loc, Op, DB
| count
Contagem
18339

Agora, vamos criar um conjunto de 18339 séries temporais da métrica de contagem de leitura. Adicionamos a by cláusula à instrução make-series, aplicamos regressão linear e selecionamos as duas principais séries temporais que tiveram a tendência decrescente mais significativa:

let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));  
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));  
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc 
| render timechart with(title='Service Traffic Outage for 2 instances (out of 18339)')

Série temporal dos dois principais.

Exiba as instâncias:

let min_t = toscalar(demo_many_series1 | summarize min(TIMESTAMP));  
let max_t = toscalar(demo_many_series1 | summarize max(TIMESTAMP));  
demo_many_series1
| make-series reads=avg(DataRead) on TIMESTAMP from min_t to max_t step 1h by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| project Loc, Op, DB, slope 
Loc Op DB inclinação
Loc 15 37 1151 -102743.910227889
Loc 13 37 1249 -86303.2334644601

Em menos de dois minutos, cerca de 20.000 séries temporais foram analisadas e duas séries temporais anormais em que a contagem de leituras caiu repentinamente foram detectadas.

Esses recursos avançados combinados com o desempenho rápido fornecem uma solução exclusiva e poderosa para análise de série temporal.