0.文章系列链接
SLS机器学习介绍(01):时序统计建模SLS机器学习介绍(02):时序聚类建模SLS机器学习介绍(03):时序异常检测建模SLS机器学习介绍(04):规则模式挖掘SLS机器学习介绍(05):时间序列预测 一眼看尽上亿日志-SLS智能聚类(LogReduce)发布SLS机器学习最佳实战:时序异常检测和报警SLS机器学习最佳实战:时序预测SLS机器学习最佳实战:日志聚类 异常告警1. 高频检测场景
1.1 场景一
当面对一个包含 N 台机器、每台机器挂载 M 个时序指标(例如 CPU、内存、IO、网络流量等)的超大规模集群时,如果依然使用传统的逐条时序曲线建模方式,不仅会产生大量重复 SQL 语句,还会显著增加平台计算资源消耗,给系统带来较大压力。那么,在这种海量时序数据异常检测场景下,如何通过更高效的 SQL 方案实现批量建模与分析,满足复杂业务需求,就成为关键问题。
1.2 场景二
在对系统中的 N 条时序曲线完成异常检测之后,如何快速识别并定位:究竟哪些时序曲线出现了异常?这也是批量时序异常检测中非常常见且重要的需求。
2. 平台实验
2.1 解决一
针对场景一中的问题,我们先给出对应的数据约束。相关数据在日志服务的 LogStore 中按照如下结构进行存储:
timestamp : unix_time_stampmachine: name1metricName: cpu0metricValue: 50---timestamp : unix_time_stampmachine: name1metricName: cpu1metricValue: 50---timestamp : unix_time_stampmachine: name1metricName: memmetricValue: 50---timestamp : unix_time_stampmachine: name2metricName: memmetricValue: 60 在上述 LogStore 中,我们首先提取 N 个指标对应的时序信息:
* | select timestamp - timestamp % 60 as time, machine, metricName, a vg(metricValue) from log group by time, machine, metricName 接着,基于以上结果执行批量时序异常检测算法,并得到 N 个指标各自的检测结果:
* | select machine, metricName, ts_predicate_arma(time, value, 5, 1, 1) as res from( selecttimestamp - timestamp % 60 as time, machine, metricName, a vg(metricValue) as valuefrom log group by time, machine, metricName )group by machine, metricName 通过上述 SQL,我们得到的结果结构如下:
| machine | metricName | [[time, src, pred, upper, lower, prob]] || ------- | ---------- | --------------------------------------- | 针对该结果,可以进一步借助矩阵转置操作,将输出转换为如下格式,具体 SQL 如下:
* | select machine, metricName, res[1] as ts, res[2] as ds, res[3] as preds, res[4] as uppers, res[5] as lowers, res[6] as probsfrom ( select machine, metricName, array_transpose(ts_predicate_arma(time, value, 5, 1, 1)) as res from( selecttimestamp - timestamp % 60 as time, machine, metricName, a vg(metricValue) as valuefrom log group by time, machine, metricName )group by machine, metricName ) 完成二维数组转换后,我们再将每一行内容进行拆分,最终得到符合预期的字段结构,具体格式如下:
| machine | metricName | ts | ds | preds | uppers | lowers | probs || ------- | ---------- | -- | -- | ----- | ------ | ------ | ----- | 2.2 解决二
完成批量检测后,如果希望快速、精准地筛选出包含特定异常类型的时序结果,该如何处理?此时就可以使用日志服务平台提供的异常检测结果过滤能力。
select ts_anomaly_filter(lineName, ts, ds, preds, probs, nWatch, anomalyType) 其中,针对 anomalyType 的说明如下:
0:表示关注全部异常1:表示关注上升沿异常-1:表示下降沿异常其中,针对 nWatch 的说明如下:
表示从实际时序数据最后一个有效观测点开始,向最近的 nWatch 个观测点范围内进行关注和判断。具体使用方式如下所示:
* | select ts_anomaly_filter(lineName, ts, ds, preds, probs, cast(5 as bigint), cast(1 as bigint))from( select concat(machine, '-', metricName) as lineName, res[1] as ts, res[2] as ds, res[3] as preds, res[4] as uppers, res[5] as lowers, res[6] as probsfrom ( select machine, metricName, array_transpose(ts_predicate_arma(time, value, 5, 1, 1)) as res from( selecttimestamp - timestamp % 60 as time, machine, metricName, a vg(metricValue) as valuefrom log group by time, machine, metricName )group by machine, metricName ) ) 通过上述结果,我们拿到的是一个 Row 类型的数据。此时可以使用如下方式,将其具体结构进一步提取出来:
* | select res.name, res.ts, res.ds, res.preds, res.probs from( select ts_anomaly_filter(lineName, ts, ds, preds, probs, cast(5 as bigint), cast(1 as bigint)) as resfrom( select concat(machine, '-', metricName) as lineName, res[1] as ts, res[2] as ds, res[3] as preds, res[4] as uppers, res[5] as lowers, res[6] as probsfrom ( select machine, metricName, array_transpose(ts_predicate_arma(time, value, 5, 1, 1)) as res from( selecttimestamp - timestamp % 60 as time, machine, metricName, a vg(metricValue) as valuefrom log group by time, machine, metricName )group by machine, metricName ) ) ) 通过以上操作,就可以对批量时序异常检测结果进行高效过滤,帮助用户更便捷地完成异常识别与批量告警配置。
3.硬广时间
3.1 日志进阶
这里汇集了日志服务各类功能演示,包括日志服务整体介绍以及多种 Demo 示例。
想了解更多日志服务进阶内容,可以参考:日志服务学习路径。
3.2 联系我们
如果需要纠错、完善帮助文档,或参与最佳实践内容贡献,请联系:悟冥
问题咨询请加入钉钉群:

