SLS机器学习最佳实战:日志聚类+异常告警

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 围绕日志,挖掘其中更大价值,一直是我们团队所关注。在原有日志实时查询基础上,今年SLS在DevOps领域完善了如下功能: - 上下文查询 - 实时Tail和智能聚类,以提高问题调查效率 - 提供多种时序数据的异常检测和预测函数,来做更智能的检查和预测 - 数据分析的结果可视化 - 强大的告...

0.文章系列链接



1.手中的锤子都有啥?

围绕日志,挖掘其中更大价值,一直是我们团队所关注。在原有日志实时查询基础上,今年SLS在DevOps领域完善了如下功能:

  • 上下文查询
  • 实时Tail和智能聚类,以提高问题调查效率
  • 提供多种时序数据的异常检测和预测函数,来做更智能的检查和预测
  • 数据分析的结果可视化
  • 强大的告警设置和通知,通过调用webhook进行关联行动
    1

今天我们重点介绍下,日志只能聚类和异常告警如何配合,更好的进行异常发现和告警

2.平台实验

2.1 实验数据

一份Sys Log的原始数据,,并且开启了日志聚类服务,具体的状态截图如下:
2

通过调整下面截图中红色框1的大小,可以改变图中红色框2的结果,但是对于每个最细粒度的pattern并不会改变,也就是说:子Pattern的结果是稳定且唯一的,我们可以通过子Pattern的Signature找到对应的原始日志条目。
3

2.2 生成子模式的时序信息

假设,我们对这个子Pattern要进行监控:

msg:vm-111932.tc su: pam_unix(*:session): session closed for user root
对应的 signature_id : __log_signature__: 1814836459146662485

我们得到了上述pattern对应的原始日志,可以看下具体的数量在时间轴上的直返图:
4

上图中,我们可以发现,这个模式的日志分布不是很均衡,其中还有一些是没有的,如果直接按照时间窗口统计数量,得到的时序图如下:

__log_signature__: 1814836459146662485 |  
select 
    date_trunc('minute', __time__) as time, 
    COUNT(*) as num 
from log GROUP BY time order by time ASC limit 10000

5

上述图中我们发现时间上并不是连续的。因此,我们需要对这条时序进行补点操作。

__log_signature__: 1814836459146662485 | 
select 
    time_series(time, '1m', '%Y-%m-%d %H:%i:%s', '0') as time, 
    avg(num) as num 
from  ( 
    select 
        __time__ - __time__ % 60 as time, 
        COUNT(*) as num 
    from log GROUP BY time order by time desc ) 
GROUP by time order by time ASC limit 10000

6

2.3 对时序进行异常检测

使用时序异常检测函数: ts_predicate_arma

__log_signature__: 1814836459146662485 | 
select 
    ts_predicate_arma(to_unixtime(time), num, 5, 1, 1, 1, 'avg') 
from  ( 
    select 
        time_series(time, '1m', '%Y-%m-%d %H:%i:%s', '0') as time, 
        avg(num) as num 
    from  ( 
        select 
            __time__ - __time__ % 60 as time, 
            COUNT(*) as num 
        from log GROUP BY time order by time desc ) 
    GROUP by time order by time ASC ) limit 10000

7

2.4 告警该如何设置

  • 将机器学习函数的结果拆解开
__log_signature__: 1814836459146662485 | 
select 
    t1[1] as unixtime, t1[2] as src, t1[3] as pred, t1[4] as up, t1[5] as lower, t1[6] as prob 
from  ( 
    select 
        ts_predicate_arma(to_unixtime(time), num, 5, 1, 1, 1, 'avg') as res 
    from  ( 
        select 
            time_series(time, '1m', '%Y-%m-%d %H:%i:%s', '0') as time, 
            avg(num) as num 
        from  ( 
            select 
                __time__ - __time__ % 60 as time, 
                COUNT(*) as num 
            from log GROUP BY time order by time desc ) 
        GROUP by time order by time ASC )) , unnest(res) as t(t1)

8

  • 针对最近两分钟的结果进行告警
__log_signature__: 1814836459146662485 | 
select 
    unixtime, src, pred, up, lower, prob 
from  ( 
    select 
        t1[1] as unixtime, t1[2] as src, t1[3] as pred, t1[4] as up, t1[5] as lower, t1[6] as prob 
    from  ( 
        select 
            ts_predicate_arma(to_unixtime(time), num, 5, 1, 1, 1, 'avg') as res 
        from  ( 
            select 
                time_series(time, '1m', '%Y-%m-%d %H:%i:%s', '0') as time, 
                avg(num) as num 
            from  ( 
                select 
                    __time__ - __time__ % 60 as time, COUNT(*) as num 
                from log GROUP BY time order by time desc ) 
            GROUP by time order by time ASC )) , unnest(res) as t(t1) ) 
    where is_nan(src) = false order by unixtime desc limit 2

9

  • 针对上升点进行告警,并设置兜底策略
__log_signature__: 1814836459146662485 | 
select 
    sum(prob) as sumProb, max(src) as srcMax, max(up) as upMax 
from ( 
    select 
        unixtime, src, pred, up, lower, prob 
    from  ( 
        select 
            t1[1] as unixtime, t1[2] as src, t1[3] as pred, t1[4] as up, t1[5] as lower, t1[6] as prob 
        from  ( 
            select 
                ts_predicate_arma(to_unixtime(time), num, 5, 1, 1, 1, 'avg') as res 
            from  ( 
                select 
                    time_series(time, '1m', '%Y-%m-%d %H:%i:%s', '0') as time, avg(num) as num 
                from  ( 
                    select 
                        __time__ - __time__ % 60 as time, COUNT(*) as num 
                    from log GROUP BY time order by time desc ) 
                GROUP by time order by time ASC )) , unnest(res) as t(t1) ) 
        where is_nan(src) = false order by unixtime desc limit 2 )

10

具体的告警设置如下:
11


3.硬广时间

3.1 日志进阶

这里是日志服务的各种功能的演示 日志服务整体介绍,各种Demo
12

更多日志进阶内容可以参考:日志服务学习路径


3.2 联系我们

纠错或者帮助文档以及最佳实践贡献,请联系:悟冥
问题咨询请加钉钉群:

477c776b40abf1fdd879c8b73334c5a0b7276069_jpeg

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
机器学习/深度学习 数据可视化 算法
机器学习第12天:聚类
机器学习第12天:聚类
23 0
|
2月前
|
数据采集 机器学习/深度学习 算法
【机器学习】数据清洗之处理异常点
【机器学习】数据清洗之处理异常点
68 1
|
17小时前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】在使用K-means聚类算法时,如何选择K的值?
【5月更文挑战第11天】【机器学习】在使用K-means聚类算法时,如何选择K的值?
|
17小时前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】K-means聚类的停止标准是什么?
【5月更文挑战第11天】【机器学习】K-means聚类的停止标准是什么?
|
17小时前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】解释什么是K-means聚类?
【5月更文挑战第11天】【机器学习】解释什么是K-means聚类?
|
17小时前
|
机器学习/深度学习 人工智能 算法
【机器学习】K-means聚类有哪些应用?
【5月更文挑战第11天】【机器学习】K-means聚类有哪些应用?
|
11天前
|
机器学习/深度学习 算法 数据挖掘
【Python 机器学习专栏】K-means 聚类算法在 Python 中的实现
【4月更文挑战第30天】K-means 是一种常见的聚类算法,用于将数据集划分为 K 个簇。其基本流程包括初始化簇中心、分配数据点、更新簇中心并重复此过程直到收敛。在 Python 中实现 K-means 包括数据准备、定义距离函数、初始化、迭代和输出结果。虽然算法简单高效,但它需要预先设定 K 值,且对初始点选择敏感,可能陷入局部最优。广泛应用在市场分析、图像分割等场景。理解原理与实现对应用聚类分析至关重要。
|
16天前
|
存储 消息中间件 Java
Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
Java多线程实战-异步操作日志记录解决方案(AOP+注解+多线程)
|
22天前
|
SQL 存储 监控
SLS 查询新范式:使用 SPL 对日志进行交互式探索
像 Unix 命令一样支持多级管道级联,像加工预览一样实时处理查询结果,更便捷的交互,更丰富的算子,更灵活的探索半结构化日志,快来试试使用 SPL 语言查询日志数据吧~
46300 4
|
2月前
|
机器学习/深度学习 Java 开发工具
机器学习PAI常见问题之export DEBUG=ON 后编译不过如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。

相关产品

  • 日志服务