根本原因分析の異常診断
Kusto 照会言語 (KQL) には、異常な動作をチェックするための異常検出と予測関数が組み込まれています。 このようなパターンが検出されたら、根本原因分析 (RCA) を実行して、異常を軽減または解決できます。
診断プロセスは、複雑で時間がかかり、ドメインの専門家によって行われます。 このプロセスには次のものが含まれます。
- 同じ時間枠で異なるソースからより多くのデータをフェッチして結合する
- 複数のディメンション上での値の分布における変化を検索する
- その他の変数のグラフ化
- ドメインに関する知識と直感に基づくその他の手法
これらの診断シナリオは一般的であるため、機械学習プラグインを使用して診断フェーズを容易にし、RCA の期間を短縮できます。
次の 3 つの Machine Learning プラグインはすべて、クラスタリング アルゴリズム 、、および diffpatterns
を実装します。 autocluster
basket
autocluster
と basket
プラグインでは、単一のレコード セットがクラスター化され、diffpatterns
プラグインでは 2 つのレコード セット間の差異がクラスター化されます。
単一レコード セットのクラスター化
一般的なシナリオには、次のような特定の条件によって選択されたデータセットが含まれます。
- 異常な動作を示す時間枠
- 高温状態のデバイスの測定値
- 長時間におよんでいるコマンド
- 消費量の多いユーザー。データ内の共通するパターン (セグメント) を簡単かつ迅速に検索する方法が必要です。 パターンは、複数のディメンション (カテゴリ列) に対して同じ値をレコードが共有するデータセットのサブセットです。
次のクエリでは、サービスの例外の時系列が 1 週間にわたり 10 分間のビンで作成され表示されます。
let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m
| render timechart with(title="Service exceptions over a week, 10 minutes resolution")
サービスの例外の数は、サービスの全体のトラフィックと関連しています。 月曜日から金曜日までの営業日の毎日のパターンがはっきりとわかります。 正午にサービスの例外の数が増加し、夜間にはその数が減少しています。 週末には数は少なく横ばい状態になっています。 例外の急増は、 時系列異常検出を使用して検出できます。
データの急激な増加が 2 番目に発生しているのは火曜日の午後です。 さらに詳しく診断してそれが急激な増加であるかどうかを確認するには、次のクエリを使用します。 このクエリでは、急激な増加を示している付近のグラフが、1 分間のビンで 8 時間というより高い解像度で再描画されます。その後、その境界を調べることができます。
let min_t=datetime(2016-08-23 11:00);
demo_clustering1
| make-series num=count() on PreciseTimeStamp from min_t to min_t+8h step 1m
| render timechart with(title="Zoom on the 2nd spike, 1 minute resolution")
15:00 から 15:02 までの狭い 2 分間のスパイクが表示されます。 次のクエリでは、この 2 分間の時間枠での例外の数がカウントされます。
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| count
Count |
---|
972 |
次のクエリでは、972 個の例外の中から 20 個をサンプリングします。
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| take 20
PreciseTimeStamp | リージョン | ScaleUnit | DeploymentId | Tracepoint | ServiceHost |
---|---|---|---|---|---|
2016-08-23 15:00:08.7302460 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 100005 | 00000000-0000-0000-0000-000000000000 |
2016-08-23 15:00:09.9496584 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 8d257da1-7a1c-44f5-9acd-f9e02ff507fd |
2016-08-23 15:00:10.5911748 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 100005 | 00000000-0000-0000-0000-000000000000 |
2016-08-23 15:00:12.2957912 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007007 | f855fcef-ebfe-405d-aaf8-9c5e2e43d862 |
2016-08-23 15:00:18.5955357 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 9d390e07-417d-42eb-bebd-793965189a28 |
2016-08-23 15:00:20.7444854 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 6e54c1c8-42d3-4e4e-8b79-9bb076ca71f1 |
2016-08-23 15:00:23.8694999 | eus2 | su2 | 89e2f62a73bb4efd8f545aeae40d7e51 | 36109 | 19422243-19b9-4d85-9ca6-bc961861d287 |
2016-08-23 15:00:26.4271786 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | 36109 | 3271bae4-1c5b-4f73-98ef-cc117e9be914 |
2016-08-23 15:00:27.8958124 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 904498 | 8cf38575-fca9-48ca-bd7c-21196f6d6765 |
2016-08-23 15:00:32.9884969 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 10007007 | d5c7c825-9d46-4ab7-a0c1-8e2ac1d83ddb |
2016-08-23 15:00:34.5061623 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 1002110 | 55a71811-5ec4-497a-a058-140fb0d611ad |
2016-08-23 15:00:37.4490273 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 10007006 | f2ee8254-173c-477d-a1de-4902150ea50d |
2016-08-23 15:00:41.2431223 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 103200 | 8cf38575-fca9-48ca-bd7c-21196f6d6765 |
2016-08-23 15:00:47.2983975 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | 423690590 | 00000000-0000-0000-0000-000000000000 |
2016-08-23 15:00:50.5932834 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007006 | 2a41b552-aa19-4987-8cdd-410a3af016ac |
2016-08-23 15:00:50.8259021 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 1002110 | 0d56b8e3-470d-4213-91da-97405f8d005e |
2016-08-23 15:00:53.2490731 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 36109 | 55a71811-5ec4-497a-a058-140fb0d611ad |
2016-08-23 15:00:57.0000946 | eus2 | su2 | 89e2f62a73bb4efd8f545aeae40d7e51 | 64038 | cb55739e-4afe-46a3-970f-1b49d8ee7564 |
2016-08-23 15:00:58.2222707 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | 10007007 | 8215dcf6-2de0-42bd-9c90-181c70486c9c |
2016-08-23 15:00:59.9382620 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | 10007006 | 451e3c4c-0808-4566-a64d-84d85cf30978 |
autocluster() を使用して単一レコード セットをクラスタ化する
例外の数が 1,000 未満であっても、各列には複数の値が含まれているため、共通するセグメントを見つけにくいことには変わりありません。 autocluster()
プラグインを使用すれば、次のクエリに示されているように、共通するセグメントの短いリストを瞬時に抽出し、急激に増加した 2 分間において興味深いクラスターを検索することができます。
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate autocluster()
セグメント ID | Count | Percent | リージョン | ScaleUnit | DeploymentId | ServiceHost |
---|---|---|---|---|---|---|
0 | 639 | 65.7407407407407 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
1 | 94 | 9.67078189300411 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | |
2 | 82 | 8.43621399176955 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | |
3 | 68 | 6.99588477366255 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | |
4 | 55 | 5.65843621399177 | weu | su4 | be1d6d7ac9574cbc9a22cb8ee20f16fc |
上記の結果からは、最も際立っているセグメントには例外レコードの合計の 65.74% が含まれていて、そのセグメントでは 4 つのディメンションが共有されていることがわかります。 次のセグメントでは、共通するものはずっと少なくなります。 それには全レコードの 9.67% だけが含まれ、3 つのディメンションが共有されています。 その他のセグメントもすべて、共通するものは少なくなっています。
Autocluster では、複数のディメンションをマイニングして、興味深いセグメントを抽出するために独自のアルゴリズムが使用されています。 "興味深い" とは、各セグメントのレコード セットと機能セットの両方のカバレッジが重大であることを意味します。 セグメントも分岐しています。これは、それぞれが他のものとは異なることを意味しています。 これらのセグメントの 1 つ以上が RCA プロセスに関連している可能性があります。 セグメントのレビューと評価を最小限に抑えるために、autocluster では小規模なセグメント リストのみが抽出されます。
basket() を使用して単一レコード セットをクラスタ化する
次のクエリに示すように、basket()
プラグインを使用することもできます。
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
demo_clustering1
| where PreciseTimeStamp between(min_peak_t..max_peak_t)
| evaluate basket()
セグメント ID | Count | Percent | リージョン | ScaleUnit | DeploymentId | Tracepoint | ServiceHost |
---|---|---|---|---|---|---|---|
0 | 639 | 65.7407407407407 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | e7f60c5d-4944-42b3-922a-92e98a8e7dec | |
1 | 642 | 66.0493827160494 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | ||
2 | 324 | 33.3333333333333 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | 0 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
3 | 315 | 32.4074074074074 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | 16108 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
4 | 328 | 33.7448559670782 | 0 | ||||
5 | 94 | 9.67078189300411 | scus | su5 | 9dbd1b161d5b4779a73cf19a7836ebd6 | ||
6 | 82 | 8.43621399176955 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | ||
7 | 68 | 6.99588477366255 | scus | su3 | 90d3d2fc7ecc430c9621ece335651a01 | ||
8 | 167 | 17.1810699588477 | scus | ||||
9 | 55 | 5.65843621399177 | weu | su4 | be1d6d7ac9574cbc9a22cb8ee20f16fc | ||
10 | 92 | 9.46502057613169 | 10007007 | ||||
11 | 90 | 9.25925925925926 | 10007006 | ||||
12 | 57 | 5.8641975308642 | 00000000-0000-0000-0000-000000000000 |
basket では、項目セットのマイニングのために "Apriori" アルゴリズムが実装されます。 これにより、レコード セットのカバレッジがしきい値 (既定値は 5%) を超えているすべてのセグメントが抽出されます。 より多くのセグメントが抽出され、類似のもの (たとえば、セグメント 0、1 または 2、3) が含まれていることがわかります。
どちらのプラグインも強力で容易に使用できます。 それらに伴う制限は、ラベルを使用しない教師なしの方法で単一のレコード セットがクラスター化されることです。 抽出されたパターンが、選択したレコード セット、異常なレコード、またはグローバルなレコード セットのいずれの特徴を示しているのかが明確ではありません。
2 つのレコード セットの差異をクラスター化する
diffpatterns()
プラグインでは、autocluster
と basket
における制限が克服されています。 Diffpatterns
は、2 つのレコード セットを受け取り、異なっている主要なセグメントを抽出します。 一方のセットには、通常、調査中の異常なレコード セットが含まれます。 1 つは autocluster
と basket
によって分析されています。 もう一方のセットには、参照レコード セットであるベースラインが含まれています。
次のクエリでは、 diffpatterns
スパイクの 2 分以内に興味深いクラスターを検索します。これは、ベースライン内のクラスターとは異なります。 急激な増加が始まった時刻である 15 時 00 分より前の 8 分をベースライン ウィンドウとして定義します。 バイナリ列 (AB) によって拡張し、特定のレコードがベースラインまたは異常セットのどちらに属するかを指定します。 Diffpatterns
では監視下学習アルゴリズムが実装されます。ここで、異常対ベースライン フラグ (AB) によって 2 つのクラス ラベルは生成済みです。
let min_peak_t=datetime(2016-08-23 15:00);
let max_peak_t=datetime(2016-08-23 15:02);
let min_baseline_t=datetime(2016-08-23 14:50);
let max_baseline_t=datetime(2016-08-23 14:58); // Leave a gap between the baseline and the spike to avoid the transition zone.
let splitime=(max_baseline_t+min_peak_t)/2.0;
demo_clustering1
| where (PreciseTimeStamp between(min_baseline_t..max_baseline_t)) or
(PreciseTimeStamp between(min_peak_t..max_peak_t))
| extend AB=iff(PreciseTimeStamp > splitime, 'Anomaly', 'Baseline')
| evaluate diffpatterns(AB, 'Anomaly', 'Baseline')
セグメント ID | CountA | CountB | PercentA | PercentB | PercentDiffAB | リージョン | ScaleUnit | DeploymentId | Tracepoint |
---|---|---|---|---|---|---|---|---|---|
0 | 639 | 21 | 65.74 | 1.7 | 64.04 | eau | su7 | b5d1d4df547d4a04ac15885617edba57 | |
1 | 167 | 544 | 17.18 | 44.16 | 26.97 | scus | |||
2 | 92 | 356 | 9.47 | 28.9 | 19.43 | 10007007 | |||
3 | 90 | 336 | 9.26 | 27.27 | 18.01 | 10007006 | |||
4 | 82 | 318 | 8.44 | 25.81 | 17.38 | ncus | su1 | e24ef436e02b4823ac5d5b1465a9401e | |
5 | 55 | 252 | 5.66 | 20.45 | 14.8 | weu | su4 | be1d6d7ac9574cbc9a22cb8ee20f16fc | |
6 | 57 | 204 | 5.86 | 16.56 | 10.69 |
最も際立っているセグメントは、autocluster
によって抽出されたセグメントと同じです。 2 分間の異常なウィンドウでのそのカバレッジも 65.74% です。 しかし、8 分間のベースライン ウィンドウでのそのカバレッジは 1.7% に過ぎません。 差異は 64.04% です。 この差異は、異常な急増に関連しているようです。 この前提を確認するために、次のクエリは、元のグラフを、この問題のあるセグメントに属するレコードと、他のセグメントのレコードに分割します。
let min_t = toscalar(demo_clustering1 | summarize min(PreciseTimeStamp));
let max_t = toscalar(demo_clustering1 | summarize max(PreciseTimeStamp));
demo_clustering1
| extend seg = iff(Region == "eau" and ScaleUnit == "su7" and DeploymentId == "b5d1d4df547d4a04ac15885617edba57"
and ServiceHost == "e7f60c5d-4944-42b3-922a-92e98a8e7dec", "Problem", "Normal")
| make-series num=count() on PreciseTimeStamp from min_t to max_t step 10m by seg
| render timechart
このグラフでは、火曜日の午後に発生した急激な増加は、diffpatterns
を使用して検出されたこの特定のセグメントからの例外が原因であることを確認できます。
まとめ
Machine Learning プラグインは、多くのシナリオで役立ちます。 autocluster
および basket
では、教師なし学習アルゴリズムが実装され、使いやすくなっています。 Diffpatterns
では教師あり学習アルゴリズムが実装されます。より複雑になりますが、RCA のためにセグメントの差異を抽出する際はより力を発揮します。
これらのプラグインは、アドホックのシナリオおよびリアルタイムに近い自動監視サービスにおいて、対話形式で使用されます。 時系列の異常検出の後に診断プロセスが続きます。 このプロセスは必要なパフォーマンス基準を満たすように高度に最適化されます。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示