AIOps探索 | 如何实现相似事件识别

2024-01-26 09:52

本文主要是介绍AIOps探索 | 如何实现相似事件识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、什么是事件

关联引擎将一组相关的告警聚集到一起生成的事件(incident)。其目的是在逻辑上将告警工作台上杂乱无章的告警按不同的使用场景分为多个分组,以便将描述同一个问题的相关告警或有关联关系的告警分组到一起进行集中处置,而不需要将无关的噪音放到同一工作台上对事件管理员造成过多的干扰。

有了事件之后,可以按不同的目标将告警关联到一起生成事件,如:

1.应用管理员:希望将同一应用系统所产生的业务层、应用层、数据库层的告警分组到一起,以便更好地感知事件的详细上下文信息,加速排障过程。

2.数据库管理员:希望将不同业务系统的数据库集群所产生的告警,按应用系统分组成不同的告警,以集中处理集群的问题,而非一个个独立主机的不同告警。

3.devops工程师:希望将endpoints的不同告警分组到一起,如cusLogin1.0、cusLogin1.1,都属于用户登录服务,分属于不同的版本,但都是由同一队人共同开发和运维的,希望能够分组到一起共同进行分析处理。

二、事件同告警的主要区别

从运营数据中心提高效率和降低噪音干扰的角度来看,事件与告警存在以下主要区别:

1.Event 管理阶段:早期阶段处理来自监控系统(如apm、zabbix、prometheus)产生的各种异常信号。这些异常信号数量庞大,其中包含大量重复的内容。在处理这些信息时,面临着大量噪音和难以高效处理的问题。

2.Alert 管理阶段:集中处理各个监控系统产生的事件,进行有效去重和压缩处理。告警数量迅速减少,但仍需要处理大量告警。随着数字化转型,监控的内容越来越多,相互之间的影响和关联越来越难以管理。这导致事件管理员通常需要在告警工作台上面对大量杂乱无章的告警,花费大量精力才能手动整理这些信息。

3.Incident 管理阶段:使用告警关联的方法将涉及时间和空间关联关系的告警分组,为事件管理员提供更丰富的故障上下文。这样可以避免被太多无关的告警干扰,专注于解决具体问题。

三、为什么要识别相似事件

通过识别相似事件,可以查看过去事件管理员或运维领域专家在处理类似事件时采取的方法和步骤。参考过去相似事件的解决方案可以节省解决当前事件所需的时间。

同时,相似事件还可以揭示一些模式,这些模式表明设备、服务、应用或其他组件导致事件发生的长期问题。提供的信息可以帮助有效追踪这些事件的根源并防止将来再次发生。

四、Jaccard算法简介

Jaccard系数是一种用于衡量两个集合相似性的统计方法。计算Jaccard系数的方法是通过计算两个集合的交集元素数量除以并集元素数量来衡量它们的相似程度。Jaccard系数的取值范围是0到1,越接近于1表示两个集合越相似,越接近于0表示两个集合越不相似。

1.计算公式

J(A, B) = |A ∩ B| / |A ∪ B|

其中,A和B分别表示两个集合,|A|表示集合A的元素数量,|B|表示集合B的元素数量,|A ∩ B|表示A和B的交集元素数量,|A ∪ B|表示A和B的并集元素数量。

2.计算示例说明

假设有两个集合A和B,分别包含以下元素:

A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8}

首先计算交集元素数量:A ∩ B = {4, 5} 交集元素数量为2。

然后计算并集元素数量:A ∪ B = {1, 2, 3, 4, 5, 6, 7, 8} 并集元素数量为8。

最后,计算Jaccard系数:J(A, B) = |A ∩ B| / |A ∪ B| = 2 / 8 = 0.25

因此,集合A和集合B的Jaccard系数为0.25,表示它们的相似程度较低。

3.Jaccard算法在通用领域主要应用场景

·文本挖掘:可以用来衡量两个文档之间的相似性,本例中即是将两个事件的相关特性文本化之后,评估不同事件的特征文档相似性。

·图像分析:用于稳定两幅图像之间的相似度。

·推荐系统:可以用于衡量两个购物栏之间的相似性,然后以此信息向用户提出建议。

4.Jaccard算法在智能运维领域应用场景

相似事件识别

事件根因定位

基于事件的已知故障识别:针对已知故障,可以直接定位故障根因,并推荐自动化处置策略,可以进行手工或自动化问题解决。

告警关联生成事件:通过相似性识别来完成对告警的关联生成事件。

五.如何实现相似事件的识别

1.如何表征事件

在进行相似事件识别之前,我们先来看一下如何表征事件,只有了解事件的特征之后,才可以通过不同的方案完成事件的相似性判断。

一个事件通知由一组告警组成,以某大型国有银行“资产证券化系统”的告警关联为例,其应用架构如下所示:

应用系统通常做了如下的监控内容:

①业务层监控,应用系统可能支持一个或多个业务,或包括多个子系统,监控业务成功率、系统成功率等:

②技术组件 -服务器监控,如cpu、内存、服务器网络性能、服务器磁盘忙等

③技术组件 - 数据库,如数据库cpu、表空间不足、磁盘使用率等

④技术组件 - 应用中间件,如weblogic 的fullgc异常、jvm使用的堆栈空间百分比等

⑤技术组件 - 存储,如响应时间超时等。

⑥应用日志,如特定的数据库服务器日志、应用日志等

当该系统发生告警时,将业务层及技术组件层相关的告警按20分钟的滑动时间窗口,都会关联成为一个事件,不同的时间窗口,我们可以看到如下事件:

事件1

针对事件1,我们在进行故障处理时,通常会这样来描述该事件:

业务系统资产证券化系统出现 交易总览视图 业务成功率异常,同时 数据库 出现了cpu和磁盘忙现象,应用服务器weblogic 出现 服务器日志文件匹配错误关键字。

我们通过非常简短的一段话把整个事件中所包含5条告警的特征描述清楚了。

事件2

针对事件2,我们在进行故障处理时,通常会这样来描述该事件:

业务系统资产证券化系统 未出现业务层的告警,数据库出现了cpu和磁盘忙现象,同时 存储 出现 响应时间超时 问题。

通过对事件的描述,我们可以知道在以应用系统的视角进行关联时,alertObjectType和alertKPI两个字段是非常容易描述事件特征的,针对这些理解,我们可以将上述两个事件的特征表征如下:

  • 事件1的特征描述:db_oracle:磁盘忙 db_oracle:cpu ap_weblogic:服务器日志文件匹配到错误关键字 交易总览视图:业务成功率

  • 事件2的特征描述:db_oracle:磁盘忙 db_oracle:cpu 存储:响应时间

通过上面章节jaccard的介绍,我们可以计算:

两个事件的交集共2项,为:db_oracle:磁盘忙 db_oracle:cpu

两个事件的并集共5项,为:db_oracle:磁盘忙 db_oracle:cpu ap_weblogic:服务器日志文件匹配到错误关键字 交易总览视图:业务成功率 db_oracle:cpu 存储:响应时间

jaccard相似度计算结果为:0.4

注意:在进行生产时要注意,不要将alertObject作为特征内容。一般应用系统会以集群方式部署,我们只需要关注是否发生了数据库类的告警,而不需要知道具体是哪台服务器发生了告警。也许现在是192.168.1.1发生了告警,而下次可能是集群中的192.168.1.2发生了告警,但是对于特征来说,它们都是数据库发生的告警。

六、示例及代码实现

# jaccard相似度计算函数
def jaccard_similarity(str1, str2):
    list1 = str1.split()  # 按空格分割并转换为列表
    list2 = str2.split()  # 按空格分割并转换为列表
    # 取得两个list的交集
    intersection_list =set(list1) & set(list2)
    print(len(intersection_list))
    # 取得两个list的并集
    union_list =set(list1) | set(list2)
    print(len(union_list))

    # 计算相似度
    similarity = len(intersection_list) / len(union_list)

    return similarity

# 针对单一字符串计算相似度的方法,本例暂时用不到,后续的其它场景会用到
# 将字符串按不同的长度进行切分,字符串中出现空格时以下划线进行替换
# 示例:“Hello World”切分后为,“Hel ell llo lo_ o_W _Wo Wor orl rld"
def process_string(input_string,split_num = 3):
    result = ""
    for i in range(len(input_string)-split_num+1):
        chunk = input_string[i:i+split_num]
        chunk = chunk.replace(" ", "_")
        result += chunk
        if i + split_num < len(input_string):
            result += " "
    return result

# 示例 :
# 在这里我们仅将两个事件的特征串直接用于验证
incident_1 = 'db_oracle:磁盘忙 db_oracle:cpu ap_weblogic:服务器日志文件匹配到错误关键字 交易总览视图:业务成功率'
incident_2 = 'db_oracle:磁盘忙 db_oracle:cpu 存储:响应时间'
#str1 = process_string(str1)
#str2 = process_string(str2)

print("Jaccard相似度:", jaccard_similarity(incident_1,incident_2))

输出结果为

2 5 Jaccard相似度: 0.4

在实际的生产上进行应用时,需要实时将进入事件的告警确认其alertObjectType和alertKPI两个字段组合生成的串是否已经存在,如果不存在则加入,如果存在表明同样的问题已经发生了,不需要再重复记录。

本次分享到这里就告一段落了,如果大家对jaccard算法原理感兴趣,可以直接点击以下网址,阅读文章。

jaccard - wiki :https://en.wikipedia.org/wiki/Jaccard_index

感谢大家支持,我们下次见~

擎创科技,Gartner连续推荐的AIOps领域标杆供应商。公司专注于通过提升企业客户对运维数据的洞见能力,为运维降本增效,充分体现科技运维对业务运营的影响力。

行业龙头客户的共同选择

了解更多运维干货与行业前沿动态

可以右上角一键关注

我们是深耕智能运维领域近十年的

连续多年获Gartner推荐的AIOps标杆供应商

下期我们不见不散~

这篇关于AIOps探索 | 如何实现相似事件识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/646433

相关文章

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti