[发明专利]一种基于故障特征比较的微服务系统故障根因定位方法有效
申请号: | 202110597965.3 | 申请日: | 2021-05-31 |
公开(公告)号: | CN113190373B | 公开(公告)日: | 2022-04-05 |
发明(设计)人: | 韩彪;蔡阳;苏金树;陈曙晖;赵娜;王宏;时向泉;虞万荣;原玉磊 | 申请(专利权)人: | 中国人民解放军国防科技大学 |
主分类号: | G06F11/07 | 分类号: | G06F11/07 |
代理公司: | 湖南企企卫知识产权代理有限公司 43257 | 代理人: | 任合明 |
地址: | 410073 湖*** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 故障 特征 比较 微服 系统故障 定位 方法 | ||
1.一种基于故障特征比较的微服务系统故障根因定位方法,其特征在于包括以下步骤:
第一步,构建故障根因定位系统,故障根因定位系统由微服务系统监控数据文件、数据读取模块、服务依赖图构建模块、异常判断模块、显式、隐式节点确认模块、编码模块、深度搜索模块、拓扑模块、编码比较与分析模块、编码读写模块、已知故障记录文件、标准编码文件组成;节点指微服务系统中的服务节点,每个服务节点是一个独立的进程;
微服务系统监控数据文件存储微服务系统监控数据,微服务系统监控数据文件包含不同类型的服务调用,且微服务系统监控数据文件中的每一条监控数据表示一次服务调用,监控数据包括已知故障数据和未知故障数据;监控数据使用数据特征九元组表示,数据特征九元组为(callType,serviceName,startTime,elapsedTime,success,id,traceId,pid,cmdb_id),callType表示服务调用的类型,serviceName表示服务调用的服务名称,startTime表示服务调用发起的时间,为时间戳格式,elapsedTime表示服务调用的延迟时间,即发起该服务调用到收到服务调用结果所花费的时间,success等于0或1,表示该次服务调用是否成功,id表示该次服务调用的编号,traceId表示该次服务调用的traceId字段的值,pid表示该次服务调用的父服务调用的编号,cmdb_id表示发起该次服务调用的微服务节点的编号;服务依赖图为:当用户发起一次用户请求时,微服务系统内的节点间会发起多次服务调用,以提供完整的服务,这些服务调用的traceId字段的数值相同,将这些服务调用组织为一个服务依赖图;服务依赖图由二元组(traceId,calls)表示,其中traceId与数据特征九元组中的traceId意义相同,calls为该服务依赖图中包含的服务调用的集合;
数据读取模块与微服务系统监控数据文件、服务依赖图构建模块相连,数据读取模块从微服务系统监控数据文件中读取异常发生相应时间段的监控数据,将监控数据发送给服务依赖图构建模块;
服务依赖图构建模块与数据读取模块、异常判断模块相连,服务依赖图构建模块从数据读取模块获得异常发生相应时间段内的监控数据,将监控数据组织成服务依赖图列表;若异常发生相应时间段内发生了M次用户请求,则会产生M个服务依赖图,服务依赖图构建模块将这M个服务依赖图储存在服务依赖图列表中,并将服务依赖图列表发送给异常判断模块,M为正整数;
异常判断模块与服务依赖图构建模块、显式、隐式节点确认模块相连;异常判断模块从服务依赖图构建模块获取服务依赖图列表,筛选服务依赖图列表中存在异常的服务依赖图,并构造为异常服务依赖图四元组(traceId,calls,abnormal_calls_abstract,abnormal_calls),其中traceId表示该次服务调用的traceId字段的值,该次服务调用指存在异常的服务依赖图中的服务调用,calls为该存在异常的服务依赖图中包含的服务调用的集合,abnormal_calls_abstract为该存在异常的服务依赖图中异常服务调用的抽象表示,abnormal_calls为该存在异常的服务依赖图中异常服务调用的集合,最终获得异常服务依赖图列表,将异常服务依赖图列表传送给显式、隐式节点确认模块;
显式、隐式节点确认模块与异常判断模块、编码模块、深度搜索模块相连;显示节点指异常服务调用的发起节点,隐式节点指异常服务调用的被服务调用节点;显式、隐式节点确认模块从异常判断模块获得异常服务依赖图列表,根据异常服务依赖图列表判断显式节点和隐式节点,然后将显式节点列表和隐式节点列表发送给编码模块和深度搜索模块;
已知故障记录文件与编码读写模块相连,已知故障记录文件存储已知故障的信息;
深度搜索模块与显式、隐式节点确认模块、编码模块相连,当进行未知故障分析时,深度搜索模块从显式、隐式节点确认模块出获得显式、隐式节点列表,找出其中处于底层的显式、隐式节点,形成潜在故障根节点列表,传送给编码模块;
编码模块与显式、隐式节点确认模块、深度搜索模块、拓扑模块、编码读写模块、编码比较与分析模块相连;当进行已知故障分析时,编码模块从显式、隐式节点确认模块获得显式节点列表和隐式节点列表,从拓扑模块获得系统拓扑信息,从已知故障记录文件获取已知故障信息;编码模块根据显式节点列表、隐式节点列表和已知故障信息对故障根节点进行编码得到标准编码,将标准编码发送给编码读写模块;当进行未知故障分析时,编码模块从深度搜索模块获取潜在故障根节点列表,从显式、隐式节点确认模块获得显式节点列表、隐式节点列表,从拓扑模块获得系统拓扑信息,对所有的潜在故障根节点进行编码,然后将潜在故障根节点编码发送给编码比较和分析模块;
标准编码文件与编码读写模块相连,标准编码文件存储标准编码;
编码读写模块与编码模块、标准编码文件、编码比较与分析模块相连,在进行已知故障分析时,编码读写模块从编码模块获得标准编码,储存在标准编码文件中;当进行未知故障分析时,编码读写模块从标准编码文件获取标准编码,发送给编码比较与分析模块;
拓扑模块与编码模块相连,拓扑模块存储微服务系统的拓扑信息,包含所有节点的子节点、父节点、双向节点信息;
编码比较与分析模块与编码读写模块、编码模块相连,当进行未知故障分析时,编码比较与分析模块从编码模块获得潜在故障根节点编码,从编码读写模块获得标准编码,然后将潜在故障根节点编码与标准编码进行比较分析,得到分析结果;
第二步,数据读取模块从微服务系统监控数据文件获取已知故障数据,数据读取模块从微服务系统监控数据文件读取数据,并将读取的数据转化为DataFrame数据类型,然后将DataFrame类型的数据合为一个DataFrame数据data,将data传送给服务依赖图构建模块;
第三步,服务依赖图构建模块从数据读取模块获得data,根据data构建故障分析目标时间窗口即start_time和end_time之间的服务依赖图,得到服务依赖图列表,将服务依赖图列表service_map发送给异常判断模块,start_time 为时间窗口开始时间,end_time为时间窗口结束时间,具体步骤如下:
3.1服务依赖图构建模块从键盘接收用户设定的start_time和end_time;
3.2服务依赖图构建模块采用服务依赖图构建方法使用data中start_time和end_time之间的数据构建服务依赖图,得到服务依赖图列表service_map,service_map中的元素为服务依赖图new_element,new_element存在两个域,第一个域存储服务依赖图的traceId字段的值,第二个域存储服务依赖图的服务调用;
3.3服务依赖图构建模块将服务依赖图列表service_map发送给异常判断模块,令service_map中的元素总数为N_service_map;
第四步,异常判断模块从服务依赖图构建模块获得service_map,根据service_map,采用异常服务依赖图列表构建方法构建异常服务依赖图列表service_map_anomal,将异常服务依赖图列表service_map_anomal发送给显式、隐式节点确认模块,方法是:
4.1初始化异常服务依赖图列表service_map_anomal为空,service_map_anomal用于储存异常服务依赖图;
4.2异常判断模块从service_map筛选出start_time,end_time之间头服务调用存在异常的服务依赖图,构造异常服务依赖图列表service_map_anomal,service_map_anomal中的元素为存在异常的服务依赖图map,map存在四个域,第一个域存储该服务依赖图的traceId字段的值,第二个域用于存储该服务依赖图的服务调用,后两个域先空着作为备用;
4.3令service_map_anomal的总元素个数为N_service_map_anomal;
4.4异常判断模块筛选出service_map_anomal内部的异常服务调用,得到内部的异常服务调用筛选完毕后的service_map_anomal,将内部的异常服务调用筛选完毕后的service_map_anomal发送给显式、隐式节点确认模块;令此时的service_map_anomal的总元素个数为N_service_map_anomal_2;此时的service_map_anomal中的元素map的第三个域map[2]为一个列表,该列表存储map包含的异常服务调用的抽象表示,列表中的元素的形式为[cmdb_id,cmdb_next],其中cmdb_id为发起异常服务调用的节点的编号,cmdb_next为响应该异常服务调用的节点的编号;map的第四个域map[3]为一个dataframe类型元素,该dataframe类型元素用于存储map的异常服务调用,列为callType,startTime,elapsedTime,success,traceId,id,pid,cmdb_id,serviceName;
第五步,显式、隐式节点确认模块从异常判断模块获得内部的异常服务调用筛选完毕后的service_map_anomal,根据service_map_anomal确定显式、隐式节点,得到显式节点列表A_node和隐式节点列表B_node,将A_node,B_node发送给编码模块,具体过程为:
5.1初始化显式节点列表A_node和隐式节点列表B_node为空,A_node和B_node中的元素结构相同,有两个域,第一个域储存该显式/隐式节点的编号即发起该次服务调用的微服务节点的编号cmdb_id,第二个域储存该显式/隐式节点的可信度;
5.2构造A_node和B_node,方法是:
5.2.1初始化异常服务依赖图列表遍历循环变量i_service_map_anomal_2=0;
5.2.2令map=service_map_anomal[i_service_map_anomal_2];
5.2.3遍历map的第3个域map[2]中存储的异常调用的抽象表示,确定A_node,方法是:
5.2.3.1初始化异常服务调用抽象列表遍历循环变量n_map2=0,令异常服务调用抽象列表遍历循环上界M_map2等于map[2]的元素个数;
5.2.3.2令第一异常服务调用节点对first_next=map[2][n_map2],first_in_A=0,first_in_A变量用于记录first_next中的异常服务调用发起节点是否在显式节点列表中;
5.2.3.3遍历A_node以判断first_next[0]是否已经存在于A_node中,方法是:
5.2.3.3.1初始化显式节点列表遍历循环变量k_A_node=0,令显式节点列表遍历循环上界T_A_node等于A_node的长度;
5.2.3.3.2令w=A_node[k_A_node],如果w[0]=first_next[0],说明异常服务调用节点对中的异常服务调用发起节点存在于显示节点列表中,令first_in_A=1,令w[1]=w[1]+1;
5.2.3.3.3令k_A_node=k_A_node+1,如果k_A_nodeT_A_node,跳转到5.2.3.3.2;否则转5.2.3.4;
5.2.3.4如果first_in_A=0,说明异常服务调用节点对中的异常服务调用发起节点不存在于显示节点列表中,需要将该节点添加到显式节点列表中,将[first,1]添加到A_node中;
5.2.3.5令n_map2=n_map2+1,如果n_map2M_map2,跳转到5.2.3.2,否则跳转到5.2.4;
5.2.4构造隐式节点列表B_node,方法是:
5.2.4.1初始化隐式节点列表遍历循环变量n_map2_2=0,令隐式节点列表遍历循环上界M_map2_2等于map[2]的长度;
5.2.4.2令第一异常服务调用节点对first_next=map[2][n_map2_2],初始化异常服务调用发起节点变量A_exist=0,A_exist用于记录first_next中的异常服务调用响应节点是否作为异常服务调用发起节点出现过,如果某节点作为异常服务调用发起节点出现过则该节点不能成为隐式节点;A_exist=0表示first_next中的异常服务调用响应节点未作为异常服务调用发起节点出现过;
5.2.4.3遍历异常服务调用列表,判断first_next中的异常服务调用响应节点是否作为异常服务调用发起节点出现过,方法是:
5.2.4.3.1初始化异常服务调用列表遍历循环变量k_map2_2=0,令异常服务调用列表遍历循环上界T_map2_2等于map[2]的长度;
5.2.4.3.2令第二异常服务调用节点对first_next2=map[2][k_map2_2],如果first_next2[0]=first_next[1],说明first_next[1]这个节点发起过异常调用,不能成为隐式节点,令A_exist=1,跳转到5.2.4.4,否则跳转到5.2.4.3.3;
5.2.4.3.3令k_map2_2=k_map2_2+1,如果k_map2_2T_map2_2,跳转到5.2.4.3.2,否则跳转到5.2.4.4;
5.2.4.4如果A_exist=1,跳转到5.2.5,否则跳转到5.2.4.5;
5.2.4.5令异常服务调用响应节点next=first_next[1],令判断变量next_in_B=0,next_in_B用于判断next是否存在于B_node中;
5.2.4.6将next添加到B_node中,方法是:
5.2.4.6.1初始化隐式节点列表遍历循环变量k_B_node=0,令隐式节点列表遍历循环上界T_B_node等于B_node的长度;
5.2.4.6.2令w=B_node[k_B_node],如果w[0]=next,令next_in_B=1,w[1]=w[1]+1;
5.2.4.6.3令k_B_node=k_B_node+1,如果k_B_nodeT_B_node,跳转到5.2.4.6.2,否则跳转到5.2.4.6.4;
5.2.4.6.4如果next_in_B=0,说明next不在B_node中,需要将其添加到B_node中,即将二元组[next,1]添加到B_node中;
5.2.5令i_service_map_anomal=i_service_map_anomal+1,如果i_service_map_anomalN_service_map_anomal,跳转到5.2.2,否则跳转到5.3;
5.3采用节点相抵消方法将A_node和B_node中重复的节点相抵消;
5.4使用低可信度节点消除方法消除显式节点列表A_node中的低可信度节点;
5.5使用5.4所述的低可信度节点消除方法消除隐式节点列表B_node中的低可信度节点;
5.6将A_node,B_node发送给编码模块;
第六步,编码模块从显式、隐式节点确认模块获得列表A_node,B_node,读取拓扑模块中的字典topology获取节点间拓扑信息,采用编码方法对用户指定的故障根节点进行编码,得到编码code,将code发送给编码读写模块,方法为:
6.1编码模块从键盘接收用户给定的故障根因微服务节点的编号cmdb_id;
6.2编码模块根据A_node,B_node、故障根因微服务节点的编号cmdb_id和字典topology进行编码,得到编码code,code用以记录故障的特征,前7位有意义,第一位用于记录故障根节点本身的类型,如果故障根节点是显式节点,第一位为1,如果故障根节点是隐式节点,第一位为0;第二位用于记录故障根节点的子结点中的显式节点分布情况,如果子节点全部是显式节点,第二位为1,如果子节点部分为显式节点,第二位为0,如果子节点都不是显式节点,第二位为-1;第三位用于记录故障根节点的子结点中的隐式节点分布情况,如果子节点全部是隐式节点,第三位为1,如果子节点部分为隐式节点,第三位为0,如果子节点都不是隐式节点,第三位为-1;第四位用于记录故障根节点的双向节点中的显式节点分布情况,如果父节点全部是显式节点,第四位为1,如果父节点部分为显式节点,第四位为0,如果父节点都不是显式节点,第四位为-1;第五位用于记录故障根节点的双向节点中的隐式节点分布情况,如果父节点全部是隐式节点,第五位为1,如果父节点部分为隐式节点,第五位为0,如果父节点都不是隐式节点,第五位为-1;第六位用于记录故障根节点的双向节点中的显式节点分布情况,如果双向节点全部是显式节点,第六位为1,如果双向节点部分为显式节点,第六位为0,如果双向节点都不是显式节点,第六位为-1;第七位用于记录故障根节点的双向节点中的隐式节点分布情况,如果双向节点全部是隐式节点,第七位为1,如果双向节点部分为隐式节点,第七位为0,如果双向节点都不是隐式节点,第七位为-1;第8位暂时保留不做分配;
6.3将code发送给编码读写模块;
第七步,编码读写模块从编码模块获取code,从已知故障文件中获取已知故障信息cmdb_id,content,将这些信息储存在标准编码文件code.npy;
第八步,数据读取模块,服务依赖图构建模块,异常判断模块,显式、隐式节点确认模块对未知故障数据进行预处理,方法是:
8.1数据读取模块从微服务系统监控数据文件中获取未知故障数据data_unknown,数据读取模块从微服务系统监控数据存储文件中读取数据,并将读取的数据转化为DataFrame数据类型,然后将来自六个文件的DataFrame类型的数据合为一个DataFrame数据data_unknown;数据读取模块将data_unknown传送给服务依赖图构建模块;
8.2服务依赖图构建模块从数据读取模块获得data_unknown,根据data_unknown构建故障分析目标时间窗口即start_time_unknown和end_time_unknown之间内的服务依赖图,得到第二服务依赖图列表,start_time_unknown为时间窗口开始时间,end_time_unknown为时间窗口结束时间,start_time_unknown和end_time_unknown均由用户设定;具体步骤如下:
8.2.1服务依赖图构建模块从键盘接收用户设定的start_time_unknown和end_time_unknown;
8.2.2服务依赖图构建模块采用3.2所述服务依赖图构建方法,使用data_unknown中start_time_unknown和end_time_unknown之间的数据构建服务依赖图,得到第二服务依赖图列表service_map_unknown;
8.2.3服务依赖图构建模块将第二服务依赖图列表service_map_unknown传送给异常判断模块,令service_map_unknown的总元素个数为N_service_map_unknown;
8.3异常判断模块从服务依赖图构建模块获得service_map_unknown,根据service_map_unknown,采用第四步所述异常服务依赖图列表构建方法构建异常服务依赖图列表service_map_anomal_unknown,将service_map_anomal_unknown发送给显式、隐式节点确认模块,令service_map_anomal_unknown的总元素个数为N_service_map_anomal_unknown_2;
8.4显式、隐式节点确认模块从异常判断模块获得异常服务依赖图列表service_map_anomal_unknown,根据service_map_anomal_unknown采用第五步所述显式、隐式节点确定方法确定显式、隐式节点,得到第二显式节点列表A_node_unknown和第二隐式节点列表B_node_unknown;
8.5显式、隐式节点确认模块将A_node_unknown和B_node_unknown发送给深度搜索模块和编码模块;
第九步,深度搜索模块从显式隐式节点确认模块获取A_node_unknown和B_node_unknown,搜索底层显式、隐式节点,构成潜在故障根节点列表candidate_root_nodes,发送给编码模块;所述底层显式、隐式节点指:在一个服务依赖图中,节点之间存在服务调用关系,按照节点间的服务调用关系将它们组织为一个类似于多叉树的结构,服务调用发起节点在上层,服务调用响应节点在下层,底层显式、隐式节点分别表示在多叉树中位于最底层的显式、隐式节点;具体步骤如下:
9.1找出A_node_unknown中深度最大的节点,储存在列表bottom_a中,找出B_node_unknown中深度最大的节点,储存在列表bottom_b中;
9.2如果bottom_b的长度大于1,将bottom_b置为空;
9.3将bottom_a和bottom_b合并,得到潜在故障根节点列表candidate_root_nodes,将candidate_root_nodes发送给编码模块,令candidate_root_nodes包含的元素个数为N_candidate_root_nodes;
第十步,编码模块从显式、隐式节点确认模块获得A_node_unknown和B_node_unknown,从深度搜索模块获得潜在故障根节点列表candidate_root_nodes,对candidate_root_nodes中的每一个潜在根节点按第六步所述编码方法进行编码,得到潜在根节点编码列表candidate_nodes_codes,令candidate_nodes_codes的包含的元素的个数为N_candidate_nodes_codes,将candidate_nodes_codes发送给编码比较和分析模块;
第十一步,编码读写模块读取标准编码信息,生成已知故障字典,编码比较和分析模块对已知和未知故障的编码进行比较分析,得到故障根节点,方法是:
11.1编码读写模块读取标准编码文件code.npy中存储的标准编码信息,储存在已知故障字典exit_codes中,exit_codes的每一项为二元组(key,value),其中key为键,是列表形式存储的八位编码,value为对应的值,形式为列表[cmdbid,content],令exit_codes的包含的元素的个数为M_exit_codes;编码读写模块将exit_codes传送给编码比较和分析模块;
11.2编码比较和分析模块从编码读写模块获得exit_codes,从编码模块获得潜在根节点编码列表candidate_nodes_codes,将candidate_nodes_codes中的编码与exit_codes中的编码进行比较和分析,得出全局最优分数grade_most;方法是:
11.2.1初始化全局最优分数grade_most=0;
11.2.2计算全局最优分数grade_most,具体步骤如下:
11.2.2.1初始化潜在根节点编码列表遍历循环变量i_candidate_nodes_codes=0;
11.2.2.2令潜在根节点candidate_node_code=candidate_nodes_codes[i_candidate_nodes_codes];
11.2.2.3编码读写和比较模块对candidate_node_code进行分析,得到candidate_node_code的最佳分数grade_best,分析方法如下:
11.2.2.3.1初始化最佳分数grade_best=0,最佳键key_best=None,最佳节点cmdb_id_best=None,最佳故障类型content_best=None;
11.2.2.3.2初始化标准编码遍历循环变量n_exit_codes=0;
11.2.2.3.3令exit_code等于exit_codes的第n_exit_codes+1项
11.2.2.3.4candidate_node和exit_code.key均为八位编码,每一位的取值为{-1,0,1}中的一个,编码读写和比较模块对candidate_node和exit_code.key对应位数的取值进行比较,计算candidate_node和exit_code.key相同的位数,相同的位数储存在当前分数grade中;
11.2.2.3.5如果gradegrade_best,令grade_best=grade,key_best=exit_code.key,cmdb_id_best=exit_code.value[0],content_best=exit_code.value[1];
11.2.2.3.6令n_exit_codes=n_exit_codes+1,如果n_exit_codesM_exit_codes,跳转到11.2.2.3.3,否则说明exit_codes遍历完毕,跳转到11.2.2.4;
11.2.2.4如果grade_best≥grade_most,令grade_most=grade_best;
11.2.2.5令i_candidate_nodes_codes=i_candidate_nodes_codes+1,如果i_candidate_nodes_codesN_candidate_nodes_codes,跳转到11.2.2.2,否则说明所有的潜在故障根节点都已经进行了编码,跳转到11.3;
11.3寻找最佳分数等于grade_most的潜在故障根节点编码,具体步骤如下:
11.3.1初始化潜在根节点编码列表循环变量i_candidate_nodes_codes_2=0,潜在根节点编码列表循环上界N_candidate_nodes_codes_2等于candidate_nodes_codes的包含的元素的个数;
11.3.2令candidate_node_code=candidate_nodes_codes[i_candidate_nodes_codes_2];
11.3.4编码读写和比较模块采用11.2.2.3所述分析方法对candidate_node_code进行分析得到其最佳分数grade_best;
11.3.5如果grade_best=grade_most,说明找到了故障根节点,跳转到11.3.6,否则跳转到11.3.7;
11.3.6如果candidate_node为和用户交互的主机的编号,分析结果为[candidate_node,主机网络故障],跳转到11.3.8,否则分析结果为[candidate_node,content_best],跳转到11.3.8;
11.3.7令i_candidate_nodes_codes_2=i_candidate_nodes_codes_2+1,如果i_candidate_nodes_codes_2N_candidate_nodes_codes_2,跳转到11.3.2,否则跳转到11.3.8;
11.3.8故障根因定位结束,将分析结果输出或显示。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科技大学,未经中国人民解放军国防科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110597965.3/1.html,转载请声明来源钻瓜专利网。