次の方法で共有


時系列分析

[ バージョン ] ドロップダウン リストを使用してサービスを切り替えます。 ナビゲーションの詳細を確認します
適用対象: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

クラウド サービスと IoT デバイスは、サービスの正常性、運用プロセス、使用状況の傾向に関する分析情報を得るために使用できるテレメトリを生成します。 時系列分析は、一般的なベースライン パターンからの逸脱を特定するのに役立ちます。

Kusto クエリ言語 (KQL) では、複数の時系列を作成、操作、分析するためのネイティブ サポートがあります。 この記事では、KQL を使用して数千の時系列を秒単位で作成および分析し、ほぼリアルタイムの監視ソリューションとワークフローを有効にする方法について説明します。

時系列の作成

make-series演算子を使用して通常の時系列の大規模なセットを作成し、必要に応じて欠損値を入力します。 テレメトリ テーブルをパーティション分割し、時系列のセットに変換します。 通常、テーブルにはタイムスタンプ列、コンテキスト ディメンション、およびオプションのメトリックが含まれます。 ディメンションは、データのパーティション分割に使用されます。 目標は、一定の時間間隔でパーティションごとに数千の時系列を作成することです。

入力テーブル demo_make_series1 には、任意の Web サービス トラフィックの 600,000 レコードが含まれています。 次のコマンドを使用して、10 個のレコードをサンプリングします。

demo_make_series1 | take 10 

結果のテーブルには、タイムスタンプ列、3 つのコンテキスト ディメンション列が含まれ、メトリックは含まれていません。

タイムスタンプ BrowserVer OsVer 国/リージョン
2016-08-25 09:12:35.4020000 Chrome 51.0 Windows 7 イギリス
2016-08-25 09:12:41.1120000 Chrome 52.0 ウィンドウズ10
2016-08-25 09:12:46.2300000 Chrome 52.0 Windows 7 イギリス
2016-08-25 09:12:46.5100000 Chrome 52.0 ウィンドウズ10 イギリス
2016-08-25 09:12:46.5570000 Chrome 52.0 ウィンドウズ10 リトアニア共和国
2016-08-25 09:12:47.0470000 Chrome 52.0 Windows 8.1 インド
2016-08-25 09:12:51.3600000 Chrome 52.0 ウィンドウズ10 イギリス
2016-08-25 09:12:51.6930000 Chrome 52.0 Windows 7 オランダ
2016-08-25 09:12:56.4240000 Chrome 52.0 ウィンドウズ10 イギリス
2016-08-25 09:13:08.7230000 Chrome 52.0 ウィンドウズ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演算子を使用して、次の 3 つの時系列を作成します。
    • 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 を使用します。

上の表には、3 つのパーティション (Windows 10、Windows 7、Windows 8.1) があります。 このグラフには、OS バージョンごとに個別の時系列が表示されます。

Windows 10、Windows 7、および Windows 8.1 の個別の線を含む時系列グラフのスクリーンショット。

時系列分析関数

このセクションでは、一般的なシリーズ処理関数を実行します。 一連の時系列が作成されると、KQL はそれらを処理および分析するための関数の増加する一覧をサポートします。 時系列を処理および分析するための代表的な関数をいくつか説明します。

フィルタリング

フィルタリングは、信号処理の一般的な手法であり、時系列処理タスク (ノイズの多い信号のスムーズ化、変更検出など) に役立ちます。

  • 次の 2 つの汎用フィルター関数があります。
    • 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)

時系列回帰。

  • 青: 元の時系列
  • 緑: フィットされたライン
  • 赤: フィットした2本の線

この関数は、ジャンプ (レベル変更) ポイントを正確に検出しました。

季節性の検出

多くのメトリックは、季節的な (定期的な) パターンに従います。 クラウド サービスのユーザー トラフィックには、通常、営業日の途中で最も高く、夜間と週末に最も低い、毎日および毎週のパターンが含まれます。 IoT センサーは、定期的な間隔で測定します。 温度、圧力、湿度などの物理的な測定値も季節的な動作を示す場合があります。

次の例では、Web サービスの 1 か月のトラフィック (2 時間のビン) に季節性検出を適用します。

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

この関数は、毎日および毎週の季節性を検出します。 週末は平日と異なるため、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 サービスの読み取りカウント メトリックのサンプル テレメトリ レコードを 4 日間にわたって表示するには、次のクエリを実行します。

demo_many_series1
| take 4 
タイムスタンプ 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

単純な統計を表示する:

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 時間ビンの時系列 (4 日間× 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) 

4 日間の平均読み取り時間変動を示す時系列グラフのスクリーンショット。

通常の 1 つの時系列は、異常なパターンを持つ可能性のある数千のインスタンスから集計されるため、この動作は誤解を招きます。 Loc (location)、Op (operation)、DB (特定のマシン) で定義されたインスタンスごとに時系列を作成します。

作成できる時系列の数はいくつですか?

demo_many_series1
| summarize by Loc, Op, DB
| count
数える
18339

読み取りカウント メトリックの時系列を 18,339 個作成します。 make-series ステートメントに by 句を追加し、線形回帰を適用し、最も有意な減少傾向を持つ上位 2 つの時系列を選択します。

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)')

通常のトラフィックと比較して読み取り数が大幅に減少している 2 つの時系列のスクリーンショット。

インスタンスを表示します。

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
Loc 15 37 1151 -104,498.46510358342
Loc 13 37 1249 -86,614.02919932814

2 分以内に、クエリは約 20,000 の時系列を分析し、突然の読み取りカウントの低下で 2 つを検出します。

これらの機能とプラットフォームのパフォーマンスは、時系列分析のための強力なソリューションを提供します。