Analisi di serie temporali in Esplora dati di AzureTime series analysis in Azure Data Explorer

Esplora dati di Azure esegue la raccolta continua di dati di telemetria da servizi cloud o dispositivi IoT.Azure Data Explorer (ADX) performs on-going collection of telemetry data from cloud services or IoT devices. Questi dati possono essere analizzati per ottenere varie informazioni dettagliate, ad esempio per il monitoraggio dell'integrità dei servizi, dei processi di produzione e delle tendenze di utilizzo.This data can be analyzed for various insights such as monitoring service health, physical production processes, and usage trends. L'analisi viene eseguita su serie temporali di metriche selezionate per individuare eventuali deviazioni rispetto al tipico modello di base.Analysis is done on time series of selected metrics to find a deviation in the pattern compared to its typical baseline pattern. Esplora dati di Azure contiene supporto nativo per la creazione, la modifica e l'analisi di più serie temporali.ADX contains native support for creation, manipulation, and analysis of multiple time series. In questo argomento si apprenderà come usare Esplora dati di Azure per creare e analizzare migliaia di serie temporali in pochi secondi, eseguendo così il monitoraggio di soluzioni e flussi di lavoro quasi in tempo reale.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.

Creazione di serie temporaliTime series creation

In questa sezione si creerà un ampio set di serie temporali regolari in modo semplice e intuitivo usando l'operatore make-series e specificando eventuali valori mancanti in base alle esigenze.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. Il primo passaggio nell'analisi delle serie temporali consiste nel partizionare la tabella dei dati di telemetria originale e trasformarla in un set di serie temporali.The first step in time series analysis is to partition and transform the original telemetry table to a set of time series. La tabella contiene in genere una colonna di timestamp, dimensioni contestuali e metriche facoltative.The table usually contains a timestamp column, contextual dimensions, and optional metrics. Le dimensioni vengono usate per partizionare i dati.The dimensions are used to partition the data. L'obiettivo è quello di creare migliaia di serie temporali per ogni partizione a intervalli regolari.The goal is to create thousands of time series per partition at regular time intervals.

La tabella di input demo_make_series1 contiene 600.000 record del traffico di servizi Web arbitrario.The input table demo_make_series1 contains 600K records of arbitrary web service traffic. Usare il comando seguente per creare un campione di 10 record:Use the command below to sample 10 records:

[Fare clic per eseguire la query][Click to run query]

demo_make_series1 | take 10 

La tabella risultante contiene una colonna di timestamp e tre colonne di dimensioni contestuali, ma non sono incluse metriche:The resulting table contains a timestamp column, three contextual dimensions columns, and no metrics:

TimeStampTimeStamp BrowserVerBrowserVer OsVerOsVer Paese/Area geograficaCountry/Region
2016-08-25 09:12:35.40200002016-08-25 09:12:35.4020000 Chrome 51.0Chrome 51.0 Windows 7Windows 7 Regno UnitoUnited Kingdom
2016-08-25 09:12:41.11200002016-08-25 09:12:41.1120000 Chrome 52.0Chrome 52.0 Windows 10Windows 10
2016-08-25 09:12:46.23000002016-08-25 09:12:46.2300000 Chrome 52.0Chrome 52.0 Windows 7Windows 7 Regno UnitoUnited Kingdom
2016-08-25 09:12:46.51000002016-08-25 09:12:46.5100000 Chrome 52.0Chrome 52.0 Windows 10Windows 10 Regno UnitoUnited Kingdom
2016-08-25 09:12:46.55700002016-08-25 09:12:46.5570000 Chrome 52.0Chrome 52.0 Windows 10Windows 10 Repubblica di LituaniaRepublic of Lithuania
2016-08-25 09:12:47.04700002016-08-25 09:12:47.0470000 Chrome 52.0Chrome 52.0 Windows 8.1Windows 8.1 IndiaIndia
2016-08-25 09:12:51.36000002016-08-25 09:12:51.3600000 Chrome 52.0Chrome 52.0 Windows 10Windows 10 Regno UnitoUnited Kingdom
2016-08-25 09:12:51.69300002016-08-25 09:12:51.6930000 Chrome 52.0Chrome 52.0 Windows 7Windows 7 Paesi BassiNetherlands
2016-08-25 09:12:56.42400002016-08-25 09:12:56.4240000 Chrome 52.0Chrome 52.0 Windows 10Windows 10 Regno UnitoUnited Kingdom
2016-08-25 09:13:08.72300002016-08-25 09:13:08.7230000 Chrome 52.0Chrome 52.0 Windows 10Windows 10 IndiaIndia

Poiché non sono presenti metriche, è possibile creare solo un set di serie temporali che rappresenta il traffico totale, partizionato in base al sistema operativo, usando la query seguente: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:

[Fare clic per eseguire la query][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 
  • Usare l' make-series operatore per creare un set di tre serie temporali, in cui:Use the make-series operator to create a set of three time series, where:
    • num=count(): la serie temporale del trafficonum=count(): time series of traffic
    • range(min_t, max_t, 1h): la serie temporale viene creata in base a intervalli di un'ora nell'intero periodo di tempo (il timestamp meno recente e quello più recente dei record della tabella)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: specificare il metodo di riempimento per gli intervalli mancanti per creare serie temporali regolaridefault=0: specify fill method for missing bins to create regular time series. In alternativa series_fill_const() , usare series_fill_forward() , series_fill_backward() e series_fill_linear() per le modificheAlternatively use series_fill_const(), series_fill_forward(), series_fill_backward() and series_fill_linear() for changes
    • byOsVer: partizionare in base al sistema operativobyOsVer: partition by OS
  • L'effettiva struttura di dati di una serie temporale è una matrice numerica del valore aggregato per ogni intervallo temporale.The actual time series data structure is a numeric array of the aggregated value per each time bin. Per la visualizzazione viene usato render timechart.We use render timechart for visualization.

Nella tabella precedente sono presenti tre partizioni.In the table above, we have three partitions. È possibile creare una serie temporale distinta per ogni versione del sistema operativo, ovvero Windows 10 (rosso), 7 (blu) e 8.1 (verde), come illustrato nel grafico: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:

Partizioni di serie temporali

Funzioni di analisi delle serie temporaliTime series analysis functions

In questa sezione si eseguiranno tipiche funzioni di elaborazione delle serie temporali.In this section, we'll perform typical series processing functions. Dopo la creazione di un set di serie temporali, in Esplora dati di Azure è disponibile un numero crescente di funzioni di elaborazione e analisi di tali serie, che è possibile trovare nella documentazione relativa alle serie temporali.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. Di seguito sono descritte alcune funzioni rappresentative per l'elaborazione e l'analisi di serie temporali.We will describe a few representative functions for processing and analyzing time series.

FiltroFiltering

L'applicazione di filtri è una pratica comune nell'elaborazione dei segnali ed è utile per le attività di elaborazione delle serie temporali, ad esempio lo smorzamento di un segnale di disturbo o il rilevamento di modifiche.Filtering is a common practice in signal processing and useful for time series processing tasks (for example, smooth a noisy signal, change detection).

  • Sono presenti due funzioni di filtro generiche:There are two generic filtering functions:
    • series_fir(): Applicazione del filtro FIR.series_fir(): Applying FIR filter. Usato per il calcolo semplice della media mobile e della differenziazione della serie temporale per il rilevamento di modifiche.Used for simple calculation of moving average and differentiation of the time series for change detection.
    • series_iir(): Applicazione del filtro IIR.series_iir(): Applying IIR filter. Usato per lo smorzamento esponenziale e la somma cumulativa.Used for exponential smoothing and cumulative sum.
  • Extend viene usato per estendere il set di serie temporali aggiungendo alla query una nuova serie a media mobile costituita da cinque intervalli (denominata ma_num):Extend the time series set by adding a new moving average series of size 5 bins (named ma_num) to the query:

[Fare clic per eseguire la query][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

Applicazione di filtri alle serie temporali

Analisi di regressioneRegression analysis

Esplora dati di Azure supporta l'analisi di regressione lineare segmentata per stimare la tendenza delle serie temporali.ADX supports segmented linear regression analysis to estimate the trend of the time series.

  • Usare series_fit_line() per individuare la linea che meglio si adatta a una serie temporale per il rilevamento della tendenza generale.Use series_fit_line() to fit the best line to a time series for general trend detection.
  • Usare series_fit_2lines per rilevare le variazioni della tendenza, rispetto alla linea di base, che sono utili negli scenari di monitoraggio.Use series_fit_2lines() to detect trend changes, relative to the baseline, that are useful in monitoring scenarios.

Esempio delle funzioni series_fit_line() e series_fit_2lines() in una query di serie temporale:Example of series_fit_line() and series_fit_2lines() functions in a time series query:

[Fare clic per eseguire la query][Click to run query]

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

Regressione della serie temporale

  • Blu: serie temporale originaleBlue: original time series
  • Verde: linea adattataGreen: fitted line
  • Rosso: due linee adattateRed: two fitted lines

Nota

La funzione ha rilevato correttamente il punto di variazione del livello.The function accurately detected the jump (level change) point.

Rilevamento della stagionalitàSeasonality detection

Molte metriche seguono modelli stagionali (periodici).Many metrics follow seasonal (periodic) patterns. Il traffico degli utenti dei servizi cloud contiene in genere modelli giornalieri e settimanali che sono più alti nella parte centrale della giornata lavorativa e più bassi di notte o durante il fine settimana.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. I sensori IoT eseguono misurazioni in base a intervalli periodici.IoT sensors measure in periodic intervals. Le misure fisiche, ad esempio temperatura, pressione o umidità, possono mostrare anche un comportamento stagionale.Physical measurements such as temperature, pressure, or humidity may also show seasonal behavior.

L'esempio seguente applica il rilevamento della stagionalità al traffico di un servizio Web nel corso di un mese (intervalli di 2 ore):The following example applies seasonality detection on one month traffic of a web service (2-hour bins):

[Fare clic per eseguire la query][Click to run query]

demo_series3
| render timechart 

Stagionalità della serie temporale

  • Usare series_periods_detect() per rilevare automaticamente i periodi nella serie temporale.Use series_periods_detect() to automatically detect the periods in the time series.
  • Usare series_periods_validate() se si è conoscenza del fatto che una metrica dovrebbe avere specifici periodi distinti e si vuole verificare che esistano effettivamente.Use series_periods_validate() if we know that a metric should have specific distinct period(s) and we want to verify that they exist.

Nota

Se non esistono specifici periodi distinti è presente un'anomalia.It's an anomaly if specific distinct periods don't exist

[Fare clic per eseguire la query][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
periodiperiods scoresscores daysdays
8484 0.8206227860555950.820622786055595 77
1212 0.7646014058035020.764601405803502 11

La funzione rileva la stagionalità giornaliera e settimanale.The function detects daily and weekly seasonality. La prima ha un punteggio minore rispetto alla seconda perché i giorni del fine settimana sono diversi dai normali giorni della settimana.The daily scores less than the weekly because weekend days are different from weekdays.

Funzioni relative a elementiElement-wise functions

È possibile eseguire operazioni aritmetiche e logiche su una serie temporale.Arithmetic and logical operations can be done on a time series. Usando series_subtract() si può calcolare una serie temporale residua, ovvero la differenza tra una metrica originale non elaborata e una metrica smorzata e cercare eventuali anomalie nel segnale residuo: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:

[Fare clic per eseguire la query][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

Operazioni su una serie temporale

  • Blu: serie temporale originaleBlue: original time series
  • Rosso: serie temporale smorzataRed: smoothed time series
  • Verde: serie temporale residuaGreen: residual time series

Flusso di lavoro di serie temporali su larga scalaTime series workflow at scale

L'esempio seguente illustra come queste funzioni possono essere eseguite su larga scala su migliaia di serie temporali in secondi per il rilevamento di anomalie.The example below shows how these functions can run at scale on thousands of time series in seconds for anomaly detection. Per visualizzare alcuni record di telemetria di esempio di una metrica di conteggio delle letture di un servizio di database in un periodo di quattro giorni, eseguire la query seguente:To see a few sample telemetry records of a DB service's read count metric over four days run the following query:

[Fare clic per eseguire la query][Click to run query]

demo_many_series1
| take 4 
timestampTIMESTAMP LocLoc anonOpanonOp DBDB DataReadDataRead
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 statistiche semplici:And simple statistics:

[Fare clic per eseguire la query][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

La creazione di una serie temporale con intervalli di un'ora della metrica di lettura (quattro giorni totali * 24 ore = 96 punti) ha come risultato una fluttuazione del modello normale:Building a time series in 1-hour bins of the read metric (total four days * 24 hours = 96 points), results in normal pattern fluctuation:

[Fare clic per eseguire la query][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) 

Serie temporale su larga scala

Il comportamento sopra illustrato è fuorviante perché la singola serie temporale normale risulta dall'aggregazione di migliaia di istanze diverse che possono avere modelli anomali.The above behavior is misleading, since the single normal time series is aggregated from thousands of different instances that may have abnormal patterns. È pertanto opportuno creare una serie temporale per ogni istanza.Therefore, we create a time series per instance. Un'istanza è definita da Loc (località), anonOp (operazione) e DB (computer specifico).An instance is defined by Loc (location), anonOp (operation), and DB (specific machine).

Quante serie temporali è possibile creare?How many time series can we create?

[Fare clic per eseguire la query][Click to run query]

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

A questo punto, si crea un set di 18339 serie temporali della metrica di conteggio delle letture.Now, we're going to create a set of 18339 time series of the read count metric. Si aggiunge la clausola by all'istruzione make-series, si applica la regressione lineare e si selezionano le prime due serie temporali che risultano avere la tendenza decrescente più 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:

[Fare clic per eseguire la query][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)')

Prime due serie temporali

Visualizzare le istanze:Display the instances:

[Fare clic per eseguire la query][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 
LocLoc OpOp DBDB slopeslope
Loc 15Loc 15 3737 11511151 -102743.910227889-102743.910227889
Loc 13Loc 13 3737 12491249 -86303.2334644601-86303.2334644601

In meno di due minuti, Esplora dati di Azure ha analizzato quasi 20.000 serie temporali e ha rilevato due serie temporali anomale in cui il conteggio delle letture è calato improvvisamente.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.

Queste funzionalità avanzate, unite alle prestazioni elevate di Esplora dati di Azure, offrono una soluzione potente ed esclusiva per l'analisi di serie temporali.These advanced capabilities combined with ADX fast performance supply a unique and powerful solution for time series analysis.

Passaggi successiviNext steps