云服务和 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操作系统 | 印度 |
由于没有指标,因此生成时序表示流量计数,按 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
:从表中最旧的时间戳到最新的时间戳,以一小时为间隔创建时序数据。 -
default=0
:指定填充缺失区间的方法,用于创建常规的时间序列。 或者,使用series_fill_const()
、series_fill_forward()
、series_fill_backward()
和series_fill_linear()
来实现不同的填充行为。 -
by OsVer
:按 OS 划分的分区。
-
- 时序数据结构是每个时间箱的聚合值的数值数组。 使用
render timechart
进行可视化。
上表有三个分区(Windows 10、Windows 7 和 Windows 8.1)。 该图表显示每个 OS 版本的单独时序:
时序分析函数
在本部分,我们将执行典型的时序处理函数。 创建一组时序后,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 | 操作 | 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)
此行为具有误导性,因为单个正常时序是从数千个可能具有异常模式的实例聚合的。 根据 Loc(位置)、Op(作)和 DB(特定计算机)定义的每个实例创建时序。
可以创建多少个时间序列?
demo_many_series1
| summarize by Loc, Op, DB
| count
计数 |
---|
18339 |
为读取计数指标生成 18,339 个时间序列。 将 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 | 操作 | DB | 斜率 |
---|---|---|---|
Loc 15 | 37 | 1151 | -104,498.46510358342 |
Loc 13 | 37 | 1249 | -86,614.02919932814 |
在不到两分钟内,查询将分析近 20,000 个时间序列,并检测到两个读取次数突然下降。
这些功能和平台性能为时序分析提供了强大的解决方案。
相关内容
- 使用 KQL 进行异常情况检测和预测。
- KQL 的机器学习功能。