Análise de séries temporais no Azure Data ExplorerTime series analysis in Azure Data Explorer

O Azure Data Explorer (ADX) realiza a recolha em curso de dados de telemetria a partir de serviços na nuvem ou dispositivos IoT.Azure Data Explorer (ADX) performs on-going collection of telemetry data from cloud services or IoT devices. Estes dados podem ser analisados para várias informações, tais como monitorização da saúde do serviço, processos de produção física e tendências de utilização.This data can be analyzed for various insights such as monitoring service health, physical production processes, and usage trends. A análise é feita em séries de tempo de métricas selecionadas para encontrar um desvio no padrão em comparação com o seu padrão de base típico.Analysis is done on time series of selected metrics to find a deviation in the pattern compared to its typical baseline pattern. ADX contém suporte nativo para criação, manipulação e análise de várias séries de tempo.ADX contains native support for creation, manipulation, and analysis of multiple time series. Neste tópico, saiba como o ADX é usado para criar e analisar milhares de séries de tempo em segundos, permitindo soluções de monitorização e fluxos de trabalho em tempo real.In this topic, learn how ADX is used to create and analyze thousands of time series in seconds, enabling near real-time monitoring solutions and workflows.

Criação de séries temporaisTime series creation

Nesta secção, criaremos um grande conjunto de séries de horárioregulars de forma simples e intuitiva usando o make-series operador, e preenchendo os valores em falta conforme necessário.In this section, we'll create a large set of regular time series simply and intuitively using the make-series operator, and fill-in missing values as needed. O primeiro passo na análise da série temporal é dividir e transformar a tabela original de telemetria num conjunto de séries temporais.The first step in time series analysis is to partition and transform the original telemetry table to a set of time series. A tabela geralmente contém uma coluna de carimbo de tempo, dimensões contextuais e métricas opcionais.The table usually contains a timestamp column, contextual dimensions, and optional metrics. As dimensões são usadas para dividir os dados.The dimensions are used to partition the data. O objetivo é criar milhares de séries de tempo por partição em intervalos de tempo regulares.The goal is to create thousands of time series per partition at regular time intervals.

A tabela de entrada demo_make_series1 contém registos de 600K de tráfego arbitrário do serviço web.The input table demo_make_series1 contains 600K records of arbitrary web service traffic. Utilize o comando abaixo para recolher 10 registos:Use the command below to sample 10 records:

[Clique para executar consulta][Click to run query]

demo_make_series1 | take 10 

A tabela resultante contém uma coluna de carimbo de tempo, três colunas de dimensões contextuais e nenhuma métrica:The resulting table contains a timestamp column, three contextual dimensions columns, and no metrics:

Carimbo de tempoTimeStamp BrowserVerBrowserVer Rio OsverOsVer País/RegiãoCountry/Region
2016-08-25 09:12:35.40200002016-08-25 09:12:35.4020000 Chrome 51.0Chrome 51.0 Windows 7Windows 7 Reino UnidoUnited Kingdom
2016-08-25 09:12:41.11200002016-08-25 09:12:41.1120000 Cromado 52.0Chrome 52.0 Windows 10Windows 10
2016-08-25 09:12:46.23000002016-08-25 09:12:46.2300000 Cromado 52.0Chrome 52.0 Windows 7Windows 7 Reino UnidoUnited Kingdom
2016-08-25 09:12:46.51000002016-08-25 09:12:46.5100000 Cromado 52.0Chrome 52.0 Windows 10Windows 10 Reino UnidoUnited Kingdom
2016-08-25 09:12:46.55700002016-08-25 09:12:46.5570000 Cromado 52.0Chrome 52.0 Windows 10Windows 10 República da LituâniaRepublic of Lithuania
2016-08-25 09:12:47.04700002016-08-25 09:12:47.0470000 Cromado 52.0Chrome 52.0 Windows 8.1Windows 8.1 ÍndiaIndia
2016-08-25 09:12:51.36000002016-08-25 09:12:51.3600000 Cromado 52.0Chrome 52.0 Windows 10Windows 10 Reino UnidoUnited Kingdom
2016-08-25 09:12:51.69300002016-08-25 09:12:51.6930000 Cromado 52.0Chrome 52.0 Windows 7Windows 7 Países BaixosNetherlands
2016-08-25 09:12:56.42400002016-08-25 09:12:56.4240000 Cromado 52.0Chrome 52.0 Windows 10Windows 10 Reino UnidoUnited Kingdom
2016-08-25 09:13:08.72300002016-08-25 09:13:08.7230000 Cromado 52.0Chrome 52.0 Windows 10Windows 10 ÍndiaIndia

Como não existem métricas, só podemos construir um conjunto de séries temporais que representam a própria contagem de tráfego, dividida seletiva por OS utilizando a seguinte consulta:Since there are no metrics, we can only build a set of time series representing the traffic count itself, partitioned by OS using the following query:

[Clique para executar consulta][Click to run query]

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 in range(min_t, max_t, 1h) by OsVer
| render timechart 
  • Utilize o make-series operador para criar um conjunto de três séries temporais, onde:Use the make-series operator to create a set of three time series, where:
    • num=count(): série de tempo de tráfegonum=count(): time series of traffic
    • range(min_t, max_t, 1h): séries temporais são criadas em caixotes de 1 hora no intervalo de tempo (selos temporais mais antigos e recentes dos registos de tabelas)range(min_t, max_t, 1h): time series is created in 1-hour bins in the time range (oldest and newest timestamps of table records)
    • default=0: especificar o método de enchimento para os caixotes em falta para criar séries de horário regulares.default=0: specify fill method for missing bins to create regular time series. Alternativamente, series_fill_const() utilização , series_fill_forward() e para series_fill_backward() series_fill_linear() alteraçõesAlternatively use series_fill_const(), series_fill_forward(), series_fill_backward() and series_fill_linear() for changes
    • byOsVer: partição por OSbyOsVer: partition by OS
  • A estrutura de dados da série de tempo real é uma matriz numérica do valor agregado por cada recipiente de cada vez.The actual time series data structure is a numeric array of the aggregated value per each time bin. Usamos render timechart para visualização.We use render timechart for visualization.

Na mesa acima, temos três divisórias.In the table above, we have three partitions. Podemos criar uma série de tempo separada: Windows 10 (vermelho), 7 (azul) e 8.1 (verde) para cada versão DO, como visto no gráfico:We can create a separate time series: Windows 10 (red), 7 (blue) and 8.1 (green) for each OS version as seen in the graph:

Partição da série de tempo

Funções de análise de séries de tempoTime series analysis functions

Nesta secção, vamos executar funções típicas de processamento de séries.In this section, we'll perform typical series processing functions. Uma vez criada uma série de tempo, a ADX suporta uma lista crescente de funções para processá-las e analisá-las que podem ser encontradas na documentaçãoda série de tempo .Once a set of time series is created, ADX supports a growing list of functions to process and analyze them which can be found in the time series documentation. Descreveremos algumas funções representativas para o processamento e análise de séries temporais.We will describe a few representative functions for processing and analyzing time series.

FiltragemFiltering

A filtragem é uma prática comum no processamento de sinais e útil para tarefas de processamento de séries temporais (por exemplo, alisar um sinal ruidoso, alterar a deteção).Filtering is a common practice in signal processing and useful for time series processing tasks (for example, smooth a noisy signal, change detection).

  • Existem duas funções genéricas de filtragem:There are two generic filtering functions:
    • series_fir(): Aplicação do filtro FIR.series_fir(): Applying FIR filter. Usado para um simples cálculo da média móvel e diferenciação da série de tempo para deteção de alterações.Used for simple calculation of moving average and differentiation of the time series for change detection.
    • series_iir(): Aplicação do filtro IIR.series_iir(): Applying IIR filter. Usado para suavizar exponencial e soma acumulada.Used for exponential smoothing and cumulative sum.
  • Extenda série de tempo definida adicionando uma nova série média móvel de caixas de tamanho 5 (nomeada ma_num) à consulta:Extend the time series set by adding a new moving average series of size 5 bins (named ma_num) to the query:

[Clique para executar consulta][Click to run query]

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 in range(min_t, max_t, 1h) by OsVer
| extend ma_num=series_fir(num, repeat(1, 5), true, true)
| render timechart

Filtragem da série de tempo

Análise de regressãoRegression analysis

A ADX suporta análises de regressão linear segmentadas para estimar a tendência da série de tempo.ADX supports segmented linear regression analysis to estimate the trend of the time series.

  • Utilize series_fit_line() para encaixar a melhor linha numa série temporal para deteção geral de tendências.Use series_fit_line() to fit the best line to a time series for general trend detection.
  • Utilize series_fit_2lines() para detetar alterações de tendência, em relação à linha de base, que sejam úteis na monitorização de cenários.Use series_fit_2lines() to detect trend changes, relative to the baseline, that are useful in monitoring scenarios.

Exemplo de e funções numa consulta de series_fit_line() series_fit_2lines() série seletiva:Example of series_fit_line() and series_fit_2lines() functions in a time series query:

[Clique para executar consulta][Click to run query]

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

Regressão da série temporal

  • Azul: série suporBlue: original time series
  • Verde: linha equipadaGreen: fitted line
  • Vermelho: duas linhas ajustadasRed: two fitted lines

Nota

A função detetou com precisão o ponto de salto (mudança de nível).The function accurately detected the jump (level change) point.

Deteção de sazonalidadeSeasonality detection

Muitas métricas seguem padrões sazonais (periódicos).Many metrics follow seasonal (periodic) patterns. O tráfego de serviços na nuvem geralmente contém padrões diários e semanais que são mais altos em torno do meio do dia útil e mais baixo à noite e durante o fim de semana.User traffic of cloud services usually contains daily and weekly patterns that are highest around the middle of the business day and lowest at night and over the weekend. Os sensores ioT medem em intervalos periódicos.IoT sensors measure in periodic intervals. Medições físicas como temperatura, pressão ou humidade também podem mostrar comportamento sazonal.Physical measurements such as temperature, pressure, or humidity may also show seasonal behavior.

O exemplo seguinte aplica a deteção de sazonalidade num tráfego de um mês de um serviço web (caixotes de 2 horas):The following example applies seasonality detection on one month traffic of a web service (2-hour bins):

[Clique para executar consulta][Click to run query]

demo_series3
| render timechart 

Sazonalidade da série de tempo

Nota

É uma anomalia se períodos distintos específicos não existiremIt's an anomaly if specific distinct periods don't exist

[Clique para executar consulta][Click to run query]

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íodosperiods pontuaçõesscores diasdays
8484 0.8206227860555950.820622786055595 77
1212 0.7646014058035020.764601405803502 11

A função deteta sazonalidade diária e semanal.The function detects daily and weekly seasonality. As pontuações diárias são menos do que o semanal porque os dias de fim de semana são diferentes dos dias úteis.The daily scores less than the weekly because weekend days are different from weekdays.

Funções elementaisElement-wise functions

Operações aritméticas e lógicas podem ser feitas numa série temporal.Arithmetic and logical operations can be done on a time series. Usando series_subtract() podemos calcular uma série de tempo residual, isto é, a diferença entre a métrica bruta original e uma suavidaa, e procurar anomalias no sinal residual:Using series_subtract() we can calculate a residual time series, that is, the difference between original raw metric and a smoothed one, and look for anomalies in the residual signal:

[Clique para executar consulta][Click to run query]

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 in range(min_t, max_t, 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éries temporais

  • Azul: série suporBlue: original time series
  • Vermelho: série de tempo suavizadaRed: smoothed time series
  • Verde: série suporGreen: residual time series

Fluxo de trabalho da série de tempo em escalaTime series workflow at scale

O exemplo abaixo mostra como estas funções podem funcionar à escala em milhares de séries de tempo em segundos para deteção de anomalias.The example below shows how these functions can run at scale on thousands of time series in seconds for anomaly detection. Para ver alguns registos de telemetria de uma métrica de leitura de um serviço DB ao longo de quatro dias executar a seguinte consulta:To see a few sample telemetry records of a DB service's read count metric over four days run the following query:

[Clique para executar consulta][Click to run query]

demo_many_series1
| take 4 
CARIMBO TEMPORALTIMESTAMP Rio LocLoc anonOpanonOp DBDB Leitura de DadosDataRead
2016-09-11 21:00:00.00000002016-09-11 21:00:00.0000000 Loc 9Loc 9 51178539340496300895117853934049630089 262262 00
2016-09-11 21:00:00.00000002016-09-11 21:00:00.0000000 Loc 9Loc 9 51178539340496300895117853934049630089 241241 00
2016-09-11 21:00:00.00000002016-09-11 21:00:00.0000000 Loc 9Loc 9 -865998331941149874-865998331941149874 262262 279862279862
2016-09-11 21:00:00.00000002016-09-11 21:00:00.0000000 Loc 9Loc 9 371921734563783410371921734563783410 255255 00

E estatísticas simples:And simple statistics:

[Clique para executar consulta][Click to run query]

demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP) 
numnum min _ tmin_t max _ tmax_t
21774722177472 2016-09-08 00:00:00.00000002016-09-08 00:00:00.0000000 2016-09-11 23:00:00.00000002016-09-11 23:00:00.0000000

A construção de uma série de tempo em caixotes de 1 hora da métrica de leitura (total de quatro dias * 24 horas = 96 pontos), resulta numa flutuação normal do padrão:Building a time series in 1-hour bins of the read metric (total four days * 24 hours = 96 points), results in normal pattern fluctuation:

[Clique para executar consulta][Click to run query]

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 in range(min_t, max_t, 1h)
| render timechart with(ymin=0) 

Série de tempo à escala

O comportamento acima é enganador, uma vez que a série de tempo normal única é agregada de milhares de casos diferentes que podem ter padrões anormais.The above behavior is misleading, since the single normal time series is aggregated from thousands of different instances that may have abnormal patterns. Por isso, criamos uma série de horários por exemplo.Therefore, we create a time series per instance. Uma instância é definida por Loc (localização), anonOp (operação) e DB (máquina específica).An instance is defined by Loc (location), anonOp (operation), and DB (specific machine).

Quantas séries de tempo podemos criar?How many time series can we create?

[Clique para executar consulta][Click to run query]

demo_many_series1
| summarize by Loc, Op, DB
| count
ContagemCount
1833918339

Vamos criar um conjunto de 18339 séries de tempo da métrica da contagem de leitura.Now, we're going to create a set of 18339 time series of the read count metric. Adicionamos a by cláusula à declaração de série seletiva, aplicamos regressão linear, e selecionamos as duas primeiras séries de tempo que tiveram a tendência de crescente mais significativa:We add the by clause to the make-series statement, apply linear regression, and select the top two time series that had the most significant decreasing trend:

[Clique para executar consulta][Click to run query]

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 in range(min_t, max_t, 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 de tempo top dois

Mostrar as instâncias:Display the instances:

[Clique para executar consulta][Click to run query]

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 in range(min_t, max_t, 1h) by Loc, Op, DB
| extend (rsquare, slope) = series_fit_line(reads)
| top 2 by slope asc
| project Loc, Op, DB, slope 
Rio LocLoc OpOp DBDB inclinaçãoslope
Loc 15Loc 15 3737 11511151 -102743.910227889-102743.910227889
Loc 13Loc 13 3737 12491249 -86303.2334644601-86303.2334644601

Em menos de dois minutos, a ADX analisou cerca de 20.000 séries temporais e detetou duas séries de tempo anormal em que a contagem de leitura supor subitamente caiu.In less than two minutes, ADX analyzed close to 20,000 time series and detected two abnormal time series in which the read count suddenly dropped.

Estas capacidades avançadas combinadas com o desempenho rápido aDX fornecem uma solução única e poderosa para a análise de séries de tempo.These advanced capabilities combined with ADX fast performance supply a unique and powerful solution for time series analysis.

Passos seguintesNext steps