你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Kusto 查询语言(KQL)具有内置的 异常情况检测和预测 函数,用于检查异常行为。 检测到此类模式后,可以运行根本原因分析(RCA),以缓解或解决异常情况。
诊断过程复杂而冗长,由领域专家完成。 此过程包括:
- 在同一时间范围内从不同源提取和联接更多数据
- 在多个维度上查找值的分布变化
- 绘制更多变量图表
- 基于域知识和直觉的其他技术
由于这些诊断方案很常见,因此可以使用机器学习插件来简化诊断阶段,并缩短 RCA 的持续时间。
以下三个机器学习插件都实现聚类分析算法:autocluster
和basket
diffpatterns
。
autocluster
和basket
插件聚合单个记录集,diffpatterns
插件聚合两个记录集之间的差异。
对单个记录集进行聚类分析
常见场景包括根据特定标准选择的数据集,例如:
- 显示异常行为的时间范围
- 高温设备读数
- 长持续时间命令
- 热门支出用户
你需要一种快速而简单的方法来查找数据中的常见模式(段)。 模式是数据集的子集,其记录在多个维度(分类列)上共享相同的值。
以下查询生成并显示一周内服务异常的时序数据,按 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")
服务异常计数与整体服务流量相关联。 你可以清楚地看到工作日的每日模式,星期一到星期五。 服务异常数量在中午上升,夜间数量下降。 周末期间可见到数量偏低。 可以使用 时序异常情况检测来检测异常峰值。
数据的第二次峰值发生在周二下午。 以下查询用于进一步诊断和验证它是否是峰值变化。 查询将在 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 的窄两分钟峰值。 在接下来的查询中,统计这个两分钟窗口内的异常情况。
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
计数 |
---|
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(部署ID) | 跟踪点 | 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()
插件立即提取常见段的简短列表,并在峰值的两分钟内查找有趣的群集,如以下查询所示:
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()
SegmentId | 计数 | 百分比 | 区域 | ScaleUnit | DeploymentId(部署ID) | ServiceHost |
---|---|---|---|---|---|---|
0 | 639 | 65.7407407407407 | 水 | 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% 的总异常记录,并涉及四个维度。 下一部分更加少见。 它只包含记录中的 9.67%,并共享三个维度。 其他段甚至不太常见。
Autocluster 使用专有算法来挖掘多个维度并提取有趣的段。 “有趣”表示每个部分对记录集和特征集都具有重要的覆盖范围。 段也存在分歧,这意味着每个段都不同于其他段。 其中一个或多个段可能与 RCA 过程相关。 为了最大程度地减少细分评审和评估,autocluster 仅提取一个小段列表。
还可以使用以下查询中所示的 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()
SegmentId | 计数 | 百分比 | 区域 | ScaleUnit | DeploymentId(部署ID) | 跟踪点 | ServiceHost |
---|---|---|---|---|---|---|---|
0 | 639 | 65.7407407407407 | 水 | su7 | b5d1d4df547d4a04ac15885617edba57 | e7f60c5d-4944-42b3-922a-92e98a8e7dec | |
1 | 642 | 66.0493827160494 | 水 | su7 | b5d1d4df547d4a04ac15885617edba57 | ||
2 | 324 | 33.3333333333333 | 水 | su7 | b5d1d4df547d4a04ac15885617edba57 | 0 | e7f60c5d-4944-42b3-922a-92e98a8e7dec |
3 | 315 | 32.4074074074074 | 水 | 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 |
购物篮实现项集挖掘的 “Apriori” 算法。 它提取记录集覆盖率高于阈值的所有段(默认值 5%)。 可以看到,已使用类似段(如段 0、1 或 2、3)提取了更多段。
这两个插件都强大且易于使用。 其限制是,它们以无标签的无监督方式聚集单个记录集。 目前还不清楚提取的模式是确定所选记录集、异常记录还是全局记录集的特征。
聚类分析两个记录集之间的差异
插件 diffpatterns()
克服了 autocluster
和 basket
的局限性。
Diffpatterns
获取两个记录集并提取不同的主要段。 通常,一个集合包含正在研究的异常记录集。 其中一个由 autocluster
和 basket
进行分析。 另一个集包含引用记录集,即基线。
在以下查询中, diffpatterns
在峰值的两分钟内查找有趣的群集,这与基线中的群集不同。 当峰值启动时,基线窗口定义为 15:00 之前的 8 分钟。 通过二进制列(AB)进行扩展,并指定特定记录是属于基线还是异常集。
Diffpatterns
实现了一种监督学习算法,其中两个类标签是由异常标志和基线标志(AB)生成的。
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')
SegmentId | CountA | 计数B | PercentA | 百分比B | 百分差AB | 区域 | ScaleUnit | DeploymentId(部署ID) | 跟踪点 |
---|---|---|---|---|---|---|---|---|---|
0 | 639 | 21 | 65.74 | 1.7 | 64.04 | 水 | 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
提取的同一段。 它对两分钟异常窗口的覆盖率也是65.74%。 但是,它在八分钟基线窗口的覆盖范围仅为 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
插件发现的此特定段中的异常。
概要
机器学习插件适用于许多方案。
autocluster
并basket
实现无监督式学习算法,易于使用。
Diffpatterns
实现监督式学习算法,尽管更复杂,但它对于提取 RCA 的区分段更为强大。
这些插件在即席方案中和自动准实时监视服务中以交互方式使用。 时间序列异常检测后进行诊断过程。 该过程经过高度优化,以满足必要的性能标准。