数据结构论坛

首页 » 分类 » 分类 » 参加AIOPS比赛学会了画图
TUhjnbcbe - 2024/3/6 17:00:00

年CCF国际AIOPS挑战赛由清华大学联合中国计算机学会(CCF)共同发起,自年迄今已经举办四届,今年是第五届。今年首次引入故障分类赛题,以「微服务架构电商系统下故障识别和分类」为赛题,挖掘故障模式、构建分类模型以作用于故障止损场景。参赛选手需自行设计「异常检测算法」和「故障分类算法」,实现准确高效的故障检测和故障分类。

通过赛题与赛制解读熟悉了比赛的题目和目的,了解了数据结构。

历程

组队参加比赛之后,从熟悉数据结构、熟悉比赛数据获取和提交方式、熟悉比赛规则花了好长时间,毕竟是利用工作之余的时间来参赛,而这个比赛数据、内容对于初次参加的人来说,还是有些广度和难度的。

真正开始提交数据,是在比赛正式开始之后,从5月1日到5月9日,我们组完成了5个比赛日的数据提交,一共获得了大概多分。

对于比赛的分析是从故障类型failure_type着手的,一共15种故障类型。从总体上看node级别的故障类似于操作系统故障,而且所有指标数据都集中在kpi_cloudbed1_metric_03xx.csv这个文件中,便于分析,便选择了以此作为突破口。

对于Node类型的故障,主办方也给了大概几十个指标,通过作图或者根据经验,能够找到几个比较关键的指标。

system.cpu.pct_usage系统CPU使用率system.io.rkb_s设备每秒读的kibibytes的数量system.io.await服务向设备发送IO请求平均数,包括花在队列中的时间(millisecond)system.disk.pct_usage系统磁盘使用率

因为对于异常检测的算法不是很熟悉,我基于经验判断设定了一些阈值,并且增加了不要重复报障,限制提交次数等方法,终于实现了提交得分。但这种方案还是太简单粗暴了,实际上对于无监督的模型,应该能够支持自动识别出异常点。通过学习主办方提供的历届获奖队的方案,我对于如何使用算法来构建自己的检测体系、自动检测异常点有了更深入的认识。

折线图是我们平时数据分析过程中最常用的,通过本次参加国际AIOPS比赛,积累了不少画图的经验,在此整理出来与大家分享。看看下面这两张典型的图,是不是很容易发现故障的特征。

首先介绍下我使用的数据结构,这是一份时序数据,时间戳是一个乱序的一天内的时间戳,配置项ID类似于主机名,有多个重复的配置项。指标名也有多个重复的指标,最后一列是具体的值。

单折线图多折线图折线图标注数据点折线图叠加矩形单折线图

只画出一个配置项、一个指标的时间序列的折线图。

#画单折线图defsingle_line():df=pd.read_csv(data.csv)#只取一个cmdb_id值df=df[df[cmdb_id].str.contains(node-1)]#只取一个kpi_name值df=df[df[kpi_name].str.contains(system.load.5)]df.sort_values(timestamp)#df[value].plot(x=df[timestamp])#plt.show()fig=plt.figure(figsize=(14,8))plt.rcParams["figure.autolayout"]=Trueplt.rcParams[font.sans-serif]=[SongtiSC]plt.rcParams[axes.unicode_minus]=Falseplt.plot(df[timestamp],df[value],c=‘lime’,label=node-1)plt.xlabel(Timestamp)plt.ylabel(df[kpi_name].iloc[1])plt.legend(loc=best)plt.show()多折线图

数据文件cmdb_id中有两个不重复的配置项,画出这两个配置项system.load.5这个指标的折线图。

#画多折线图defmulti_line():df=pd.read_csv(data.csv)#df[value].plot(x=df[timestamp])#plt.show()fig=plt.figure(figsize=(14,8))plt.rcParams["figure.autolayout"]=Trueplt.rcParams[font.sans-serif]=[SongtiSC]plt.rcParams[axes.unicode_minus]=False#只取一个cmdb_id值adf=df[df[cmdb_id].str.contains(node-1)]#只取一个kpi_name值adf=adf[df[kpi_name].str.contains(system.load.5)]adf.sort_values(timestamp)plt.plot(adf[timestamp],adf[value],c=teal,label=node-1)#只取一个cmdb_id值bdf=df[df[cmdb_id].str.contains(node-2)]#只取一个kpi_name值bdf=bdf[df[kpi_name].str.contains(system.load.5)]bdf.sort_values(timestamp)plt.plot(bdf[timestamp],bdf[value],c=red,label=node-2)plt.xlabel(Timestamp)plt.ylabel(df[kpi_name].iloc[1])plt.legend(loc=best)plt.show()折线图标注数据点

将故障点标注在曲线的对应位置。

#折线图标注数据点defline_with_dot():df=pd.read_csv(data.csv)#只取一个cmdb_id值df=df[df[cmdb_id].str.contains(node-1)]#只取一个kpi_name值df=df[df[kpi_name].str.contains(system.load.5)]df.sort_values(timestamp)#df[value].plot(x=df[timestamp])#plt.show()fig=plt.figure(figsize=(14,8))plt.rcParams["figure.autolayout"]=Trueplt.rcParams[font.sans-serif]=[SongtiSC]plt.rcParams[axes.unicode_minus]=Falseplt.plot(df[timestamp],df[value],c=red,label=node-1)#故障点plt.plot(,df[value].max(),o)plt.text(,df[value].max()+0.4,node-1,node节点CPU故障,ha=left,va=top,fontsize=8)plt.xlabel(Timestamp)plt.ylabel(df[kpi_name].iloc[1])plt.legend(loc=best)plt.show()折线图叠加矩形区域

在做异常检测的时候,会标注某个时间段的数据属于异常数据,这时会叠加一个矩形区域来表示。

#折线图叠加矩形区域defline_with_rect():df=pd.read_csv(data.csv)#只取一个cmdb_id值df=df[df[cmdb_id].str.contains(node-1)]#只取一个kpi_name值df=df[df[kpi_name].str.contains(system.load.5)]df.sort_values(timestamp)#df[value].plot(x=df[timestamp])#plt.show()fig,ax=plt.subplots()plt.rcParams["figure.autolayout"]=Trueplt.rcParams[font.sans-serif]=[SongtiSC]plt.rcParams[axes.unicode_minus]=Falseax.plot(df[timestamp],df[value],c=blue,label=node-1)#故障点ax.plot(,df[value].max(),o)ax.text(,df[value].max()+0.4,node-1,node节点CPU故障,ha=left,va=top,fontsize=8)#矩形区域ax.add_patch(patches.Rectangle((,0),,df[value].max(),facecolor="red",alpha=0.5))ax.annotate(故障区域,xy=(,df[value].max()),xytext=(+,df[value].max()-2))plt.xlabel(Timestamp)plt.ylabel(df[kpi_name].iloc[1])plt.legend(loc=best)plt.show()

这几个都是在本次参加AIOPS比赛过程中,为了方便查看指标情况积累的作图技巧,后续如果有折线图更多的内容,会继续在这里更新。

1
查看完整版本: 参加AIOPS比赛学会了画图