如何实现相似事件识别:事件表征和Jaccard相似度计算

今天介绍的相似事件识别用到了jaccard算法,是一个非常简单的算法,没有介绍大模型、没有用到深度学习、没有复杂的看不明白的统计学知识,我将通过如下四个章节详细对jaccard算法如何解决相似事件识别问题:

  1. 理解业务需求
    1. 什么是事件?同告警的主要区别?
    2. 我们为什么要识别相似事件?
  2. jaccard算法简介、应用场景
    1. jaccard算法简介
    2. 计算示例说明
    3. 通用领域主要应用场景
    4. 智能运维领域的应用场景
  3. 如何实现相似事件识别
    1. 如何表征事件
    2. 示例及代码实现
  4. 参考资料

理解业务需求

什么是事件?同告警的主要区别?

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

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

  • 应用管理员:希望将同一应用系统所产生的业务层、应用层、数据库层的告警分组到一起,以便更好地感知事件的详细上下文信息,加速排障过程。
  • 数据库管理员:希望将不同业务系统的数据库集群所产生的告警,按应用系统分组成不同的告警,以集中处理集群的问题,而非一个个独立主机的不同告警。
  • devops工程师:希望将endpoints的不同告警分组到一起,如cusLogin1.0、cusLogin1.1,都属于用户登录服务,分属于不同的版本,但都是由同一队人共同开发和运维的,希望能够分组到一起共同进行分析处理。

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

  • Event 管理阶段:早期阶段处理来自监控系统(如apm、zabbix、prometheus)产生的各种异常信号。这些异常信号数量庞大,其中包含大量重复的内容。在处理这些信息时,面临着大量噪音和难以高效处理的问题。
  • Alert 管理阶段:集中处理各个监控系统产生的事件,进行有效去重和压缩处理。告警数量迅速减少,但仍需要处理大量告警。随着数字化转型,监控的内容越来越多,相互之间的影响和关联越来越难以管理。这导致事件管理员通常需要在告警工作台上面对大量杂乱无章的告警,花费大量精力才能手动整理这些信息。
  • Incident 管理阶段:使用告警关联的方法将涉及时间和空间关联关系的告警分组,为事件管理员提供更丰富的故障上下文。这样可以避免被太多无关的告警干扰,专注于解决具体问题。

我们为什么要识别相似事件?

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

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

jaccard算法简介、应用场景及实现

jaccard算法简介

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

计算公式如下:

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

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

计算示例说明

假设有两个集合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,表示它们的相似程度较低。

通用领域的主要应用场景

jaccard的主要使用有哪些场景?

  • 文本挖掘:可以用来衡量两个文档之间的相似性,本例中即是将两个事件的相关特性文本化之后,评估不同事件的特征文档相似性。
  • 图像分析:用于稳定两幅图像之间的相似度。
  • 推荐系统:可以用于衡量两个购物栏之间的相似性,然后以此信息向用户提出建议。

智能运维领域应用场景

通过jaccard算法,在智能运维领域可以实现以下场景:

  • 相似事件识别:今天所讲述的主要内容
  • 事件根因定位:在下一期的文档中介绍
  • 基于事件的已知故障识别:针对已知故障,可以直接定位故障根因,并推荐自动化处置策略,可以进行手工或自动化问题解决。在后续的发布内容中会进行介绍。
  • 告警关联生成事件:通过相似性识别来完成对告警的关联生成事件。将在后续的发布内容中进行介绍。

如何实现相似事件的识别

如何表征事件

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

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

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

  1. 业务层监控,应用系统可能支持一个或多个业务,或包括多个子系统,监控业务成功率、系统成功率等:
  2. 技术组件 -服务器监控,如cpu、内存、服务器网络性能、服务器磁盘忙等
  3. 技术组件 - 数据库,如数据库cpu、表空间不足、磁盘使用率等
  4. 技术组件 - 应用中间件,如weblogic 的fullgc异常、jvm使用的堆栈空间百分比等
  5. 技术组件 - 存储,如响应时间超时等。
  6. 应用日志,如特定的数据库服务器日志、应用日志等

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

  • 事件 1 :

  • 事件 2 :

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

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

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

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

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

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

  • 事件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

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

参考资料

如果对jaccard算法原理感兴趣,可以直接阅读下面的文章,介绍的比较浅显易懂。

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

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jaccard Similarity算法是一种用来计算样本集合之间相似度的算法。它通过计算两个集合的交集大小与并集大小的比值来衡量相似度Jaccard系数越大,说明集合之间的相似度越大。在Neo4j中,可以使用`algo.similarity.jaccard`函数来计算Jaccard Similarity。该函数接受两个样本集合作为参数,并返回它们之间的相似度值。示例代码如下: ``` CALL algo.similarity.jaccard([1,2,3], [1,2,4,5]) AS similarity ``` 这段代码计算了集合和集合之间的Jaccard相似度,并将结果存储在名为`similarity`的变量中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [neo4j相似性算法(Similarity algorithms)-1.The Jaccard Similarity algorithm](https://blog.csdn.net/name__student/article/details/97010623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NEO4J-相似度算法01-杰卡德相似度介绍及应用场景简介](https://blog.csdn.net/lijunliang2017/article/details/119544863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值