你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于: ✅Microsoft Fabric✅Azure 数据资源管理器✅Azure Monitor✅Microsoft Sentinel
云服务和 IoT 设备生成遥测数据,这些数据可用于获取见解,例如监视服务运行状况、物理业务流程和使用情况趋势。 执行时序分析是识别这些指标模式中与典型基线模式相比的偏差的一种方法。
Kusto 查询语言 (KQL) 原生支持创建、操作和分析多个时序。 本文介绍如何使用 KQL 创建和分析数千个时序(以秒为单位),从而启用近乎实时的监视解决方案和工作流。
时间序列创建
在本部分中,我们将使用 make-series
运算符简单直观地创建一组大量的常规时序,并根据需要填充缺失值。
时序分析的第一步是将原始遥测表分区并转换为一组时序。 该表通常包含时间戳列、上下文维度和可选指标。 维度用于对数据进行分区。 目标是定期为每个分区创建数千个时序。
输入表 demo_make_series1 包含任意 Web 服务流量的 60 万条记录。 使用以下命令对 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 | 印度 |
由于没有指标,因此只能生成一组表示流量计数本身的时间序列,使用以下查询根据操作系统进行分区:
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 筛选器。 用于指数平滑与累计求和。
-
-
通过将大小为 5 个箱的新移动平均时序(名为
Extend
)添加到查询,来 (扩展)时序集:
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 传感器按固定的间隔测量指标。 温度、压力或湿度等物理测量也可能显示季节性行为。
以下示例针对 Web 服务的一个月流量(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 |
该函数检测每日和每周季节性。 每日分数小于每周,因为周末与工作日不同。
元素型函数
可以在时序上执行算术和逻辑运算。 使用 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 | 作 | 数据库 | 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)
上述行为具有误导性,因为单个正常时序是从数千个可能具有异常模式的不同实例聚合的。 因此,我们为每个实例创建一个时序。 实例由 Loc(位置)、Op(运算)和 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 | 运算 | (No changes necessary based on available context) | 斜率 |
---|---|---|---|
Loc 15 | 37 | 1151 | -102743.910227889 |
Loc 13 | 37 | 1249 | -86303.2334644601 |
在不到两分钟内,分析了接近 20,000 个时序,并检测了两个异常时序,其中读取计数突然下降。
这些高级功能与快速性能相结合,为时序分析提供了独特的强大解决方案。
相关内容
- 了解如何使用 KQL 进行异常检测和预测。
- 了解使用 KQL 的机器学习功能 。