雲端服務和IoT裝置會產生遙測數據,可用來取得深入解析,例如監視服務健康情況、實體生產程式和使用趨勢。 相較於一般基準模式,執行時間序列分析是識別這些計量模式模式中偏差的其中一種方式。
Kusto 查詢語言(KQL)包含建立、操作和分析多個時間序列的原生功能。 在本文中,瞭解如何使用 KQL 在數秒內建立及分析數千個時間序列,從而實現近乎即時的監控解決方案和工作流程。
建立時間序列
在本節中,我們將直接且直覺地使用 make-series 運算子建立一組大量的一般時間序列,並視需要填入遺漏值。
時間序列分析的第一個步驟是將數據分割,並將原始遙測數據表轉換成一組時間序列。 數據表通常包含時間戳數據行、關係型維度和選擇性計量。 維度可用來分割數據。 目標是在一般時間間隔為每個分割區建立數千個時間序列。
輸入數據表 demo_make_series1 包含 600K 筆任意 Web 服務流量的記錄。 使用下列命令來取樣 10 筆記錄:
demo_make_series1 | take 10
產生的數據表包含時間戳數據行、三個關係型維度數據行,而且沒有計量:
| 時間戳 | BrowserVer | OsVer | 國家/地區 |
|---|---|---|---|
| 2016-08-25 09:12:35.4020000 | Chrome 51.0 | Windows 7 | 英國 |
| 2016-08-25 09:12:41.1120000 | Chrome 52.0 | Windows 10 | |
| 2016-08-25 09:12:46.2300000 | Chrome 52.0 | Windows 7 | 英國 |
| 2016-08-25 09:12:46.5100000 | Chrome 52.0 | Windows 10 | 英國 |
| 2016-08-25 09:12:46.5570000 | Chrome 52.0 | Windows 10 | 立陶宛共和國 |
| 2016-08-25 09:12:47.0470000 | Chrome 52.0 | Windows 8.1 | 印度 |
| 2016-08-25 09:12:51.3600000 | Chrome 52.0 | Windows 10 | 英國 |
| 2016-08-25 09:12:51.6930000 | Chrome 52.0 | Windows 7 | 荷蘭 |
| 2016-08-25 09:12:56.4240000 | Chrome 52.0 | Windows 10 | 英國 |
| 2016-08-25 09:13:08.7230000 | Chrome 52.0 | Windows 10 | 印度 |
由於沒有計量,因此我們只能建置一組時間序列,代表流量計數本身,由OS使用下列查詢進行分割:
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
- 使用
make-series運算子來建立一組三個時間序列,其中:-
num=count():流量的時間序列 -
from min_t to max_t step 1h:時間序列是在時間範圍內的 1 小時間隔中建立的(數據表記錄的最舊時間戳和最新時間戳) -
default=0:指定遺漏間隔的填滿方法,以建立一般時間序列。 或者,使用series_fill_const()、series_fill_forward()series_fill_backward()和series_fill_linear()進行變更 -
by OsVer:依OS分割
-
- 實際的時間序列數據結構是每個時間區段匯整值的數值陣列。 我們使用
render timechart來進行視覺化。
在上表中,我們有三個分割區。 我們可以為每個OS版本建立個別的時間序列:Windows 10(紅色)、7(藍色)和 8.1(綠色),如下圖所示:
時間序列分析函式
在本節中,我們將執行一般數列處理函式。 建立一組時間序列之後,KQL 支援不斷成長的函式清單來處理和分析它們。 我們將描述一些代表性的函式,以便處理和分析時間序列。
篩選
濾波是訊號處理和時間序列處理工作的常見做法(例如,平滑化嘈雜的訊號、變化偵測)。
- 有兩個泛型篩選函式:
-
series_fir():套用 FIR 篩選。 用於簡單計算移動平均和時間序列的差異,以進行變更偵測。 -
series_iir():套用 IIR 篩選條件。 用於指數平滑和累計總和。
-
-
Extend將大小為 5 個間隔的移動平均系列(名為 ma_num)添加到查詢的時間序列:
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
回歸分析
分段線性回歸分析可用來估計時間序列的趨勢。
- 使用 series_fit_line() 將最佳線條調整為一般趨勢偵測的時間序列。
- 使用 series_fit_2lines() 來偵測相對於基準的趨勢變更,這在監視案例中很有用。
時間序列查詢中 series_fit_line() 和 series_fit_2lines() 函式的範例:
demo_series2
| extend series_fit_2lines(y), series_fit_line(y)
| render linechart with(xcolumn=x)
- 藍色:原始時間序列
- 綠色:擬合線
- 紅色:兩條擬合線條
備註
函式正確偵測到跳躍(層級變更)點。
季節性偵測
許多計量都遵循季節性(定期)模式。 雲端服務的使用者流量通常包含每天和每周模式,這些模式在上班時間中途最高,晚上和週末最低。 IoT 感測器會以定期間隔測量。 溫度、壓力或濕度等實體測量也可能顯示季節性行為。
下列範例會在一個月的網路服務訪客流量中套用季節性偵測(以每兩小時為一個區隔):
demo_series3
| render timechart
- 使用 series_periods_detect() 自動偵測時間序列中的期間,其中:
-
num:要分析的時間序列 -
0.:天數的最小期間長度(0 表示沒有最小值) -
14d/2h:最大時間段長度為14天,劃分成每2小時的間隔 -
2:要偵測的期間數
-
- 如果我們知道計量應該有特定的相異期間,且我們想要確認其存在,請使用 series_periods_validate() 。
備註
如果特定相異期間不存在,則為異常
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
| 時期 | 分數 | 日 |
|---|---|---|
| 84 | 0.820622786055595 | 7 |
| 12 | 0.764601405803502 | 1 |
函式會偵測每日和每周的季節性。 每日分數小於每周,因為週末日與工作日不同。
逐元素函數
算術和邏輯運算可以在時間序列上完成。 使用 series_subtract() 我們可以計算剩餘時間序列,也就是原始原始計量與平滑時間序列之間的差異,並在剩餘訊號中尋找異常:
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
- 藍色:原始時間序列
- 紅色:平滑時間序列
- 綠色:剩餘時間序列
大規模時間序列工作流程
下列範例示範這些函式如何大規模地在數千個時間序列上執行,以秒為單位進行異常偵測。 若要查看 DB 服務的讀取計數指標在四天內的一些範例遙測數據,請執行下列查詢:
demo_many_series1
| take 4
| 時間戳記 | Loc | Op | 分貝 | 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 |
簡單統計資料:
demo_many_series1
| summarize num=count(), min_t=min(TIMESTAMP), max_t=max(TIMESTAMP)
| 數字 | min_t | max_t |
|---|---|---|
| 2177472 | 2016-09-08 00:00:00.0000000 | 2016-09-11 23:00:00.0000000 |
在讀取度量的 1 小時區間中建置時間序列(總計四天 * 24 小時 = 96 點數),會導致正常模式的波動:
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)
上述行為具有誤導性,因為單一一般時間序列是從可能有異常模式的數千個不同實例匯總而來。 因此,我們會為每個實例建立時間序列。 實例是由 Loc (location)、Op (operation) 和 DB (特定電腦) 所定義。
我們可以建立多少個時間序列?
demo_many_series1
| summarize by Loc, Op, DB
| count
| 計數 |
|---|
| 18339 |
我們現在將建立一組包含18339條記錄的讀取計數指標時間序列。 我們會將 by 子句新增至 make-series 語句、套用線性回歸,然後選取前兩個具有最大遞減趨勢的時間序列:
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)')
顯示實體:
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 | 分貝 | 坡 |
|---|---|---|---|
| Loc 15 | 37 | 1151 | -102743.910227889 |
| Loc 13 | 37 | 1249 | -86303.2334644601 |
在不到兩分鐘內,分析了接近 20,000 個時間序列,並偵測到讀取計數突然下降的兩個異常時間序列。
這些進階功能結合了快速效能,可提供獨特的且功能強大的時間序列分析解決方案。