一种微服务系统的故障根因定位方法转让专利

申请号 : CN202210007248.5

文献号 : CN114024837B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 谢林涛向成钢

申请人 : 杭州乘云数字技术有限公司

摘要 :

本发明公开了一种微服务系统的故障根因定位方法,实时获取微服务系统中的调用链数据,将调用链数据转换为四个业务指标并实时监测,当发现异常时,利用异常时间段内的调用链构建服务拓扑图、进程拓扑图和主机拓扑图,并计算拓扑图上每个节点的异常分,最终按照深度从大到小、先进程后主机的顺序定位到根因节点,即进程节点或主机节点。本发明获取到的调用链数据,不仅能动态构建主机层面的拓扑关系,还能动态构建进程层面的拓扑关系以及服务层面的拓扑关系,为更准确的根因定位提供了数据保障。本发明利用无监督算法,实时分析异常时间段的调用链数据,无需训练数据和标签。

权利要求 :

1.一种微服务系统的故障根因定位方法,其特征在于,包括以下步骤:

1)实时采集微服务系统中产生的全量调用链数据;

全量调用链数据的每一条调用链包括span_id,parent_id,duration,service_id,process_id,host_id,error;

其中,span_id表示该次调用的编号;parent_id表示该次调用的父调用的编号,如果该次调用为根节点,则parent_id为None;duration为该次调用的耗时;service_id表示该节点对应的服务编号;process_id表示该节点对应的进程编号;host_id表示该节点对应的主机编号;error等于0或1,表示该次调用是否失败;

2)基于全量调用链数据,实时统计业务指标,利用异常检测算法判断业务指标是否异常,并确定对应的异常时间段;

3)获取异常时间段内对应的所有调用链数据,对于每条调用链数据,实时构建span流程图并计算除了根节点外的每个节点的异常分,汇聚异常时间段所有span流程图构建服务拓扑图、进程拓扑图和主机拓扑图,基于进程拓扑图和主机拓扑图根据计算确定故障根因节点;

汇聚异常时间段所有span流程图构建服务拓扑图、进程拓扑图和主机拓扑图,具体包括:

3.3.1)对于一条调用链的span流程图,根节点所在的深度数值设为0,其子节点所在的深度数值为1,即子节点的深度是在父节点的深度数值上加1,其中如果有多个并列的子节点,则这些子节点享有相同的深度数值;

3.3.2)汇聚异常时间段内的所有span流程图,对于深度数值相同且service_id相同的节点合并为一个节点,并用该service_id表示此节点,由此构建了异常时间段内的服务拓扑图;

3.3.3)构建异常时间段内的进程拓扑图和主机拓扑图,拓扑图中的每个节点分别用process_id和host_id表示;

基于进程拓扑图和主机拓扑图根据计算确定故障根因节点,具体包括:

3.4.1)将异常分根据深度数值和process_id汇聚到进程拓扑图中,将异常分根据深度数值和host_id汇聚到主机拓扑图中,由此得到进程拓扑图和主机拓扑图中各个节点的异常分;

3.4.2)按照深度数值从大到小的顺序排序,在同一深度数值下,按照先进程拓扑图再主机拓扑图的顺序,定位到故障根因节点。

2.根据权利要求1所述的微服务系统的故障根因定位方法,其特征在于,步骤2)中,所述的统计业务指标包括:

调用次数 、错误率 、90%分位点的耗时 ,50%分位点的耗时 四个业务指标。

3.根据权利要求1所述的微服务系统的故障根因定位方法,其特征在于,步骤3)中,对于每条调用链数据,实时构建span流程图,具体包括:

3.1.1)根据该条调用链中每个span里的parent_id和span_id之间的对应关系,构建span_id之间的调用关系拓扑,其中开始节点是parent_id为None所对应的span_id;

3.1.2)一条调用链的span_id之间的调用关系拓扑即为该调用链的span流程图。

4.根据权利要求1所述的微服务系统的故障根因定位方法,其特征在于,步骤3)中,对于每条调用链数据,计算除了根节点外的每个节点的异常分,具体包括:

3.2.1)计算得到 :当前节点的error值为1时,则 记为1,否则记为0;

3.2.2)计算得到 :当前节点的duration在父节点的duration中占比超过预设阈值 ,则 记为1,否则记为0;

3.2.3)计算得到 :当前节点的父节点的duration与其所有子节点的duration之差在该父节点的duration中占比超过预设阈值 ,则 记为1,否则记为0;

3.2.4)合并上述三个异常分 、 、 得到该节点的异常分,即该节点异常分,其中 为0 3,为0 3,为0 3,则该节点对应的service_id,~ ~ ~

process_id,host_id的异常分均为 。

5.根据权利要求4所述的微服务系统的故障根因定位方法,其特征在于,步骤3.2.2)中, 为0.5 1;

~

步骤3.2.3)中, 为0.5 1。

~

6.根据权利要求1所述的微服务系统的故障根因定位方法,其特征在于,步骤3.4.2)中,具体包括:

3.4.2.1)先检测最大深度数值 下进程拓扑图中对应的所有节点,如果某个节点的异常分在该深度数值下所有节点的异常分之和中占比超过预设阈值 ,则根因节点为该进程节点所对应的process_id,即为故障根因节点,如果没有,则进入步骤3.4.2.2);

3.4.2.2)检测 下主机拓扑图中对应的所有节点,如果某个节点的异常分在该深度数值下所有节点的异常分之和中占比超过预设阈值 ,则根因节点为该主机节点所对应的host_id,即为故障根因节点,如果没有,则进入步骤3.4.2.3);

3.4.2.3)在 的深度下,重新进入步骤3.4.2.1),直至定位到故障根因节点。

7.根据权利要求6所述的微服务系统的故障根因定位方法,其特征在于,步骤3.4.2.1)中,阈值 为0.5 1。

~

说明书 :

一种微服务系统的故障根因定位方法

技术领域

[0001] 本发明涉及计算机应用技术领域,具体涉及一种微服务系统的故障根因定位方法。

背景技术

[0002] 随着微服务系统的普及和大量使用,基于告警数据的根因定位方法无法适应微服务系统的动态变化,其大多基于CMDB数据构建静态的服务依赖关系。而现有大多数据调用
链采集工具只能获取服务间的依赖关系,无法实时获取各个服务所在的进程信息、主机信
息,因此大多数基于调用链的根因定位方案,只能定位到根因故障服务,无法具体到根因服
务所在的进程或主机。
[0003] 现有的一些技术方案中,需要CMDB数据或者TCP/IP数据来构建主机层面的拓扑关系,无法适应微服务系统中主机之间动态变化的连接关系。而且该类数据没有进程信息、服
务信息,无法定位更准确,即不能准确定位到主机上具体哪个进程、哪个服务的故障。
[0004] 现有的一些技术方案中,利用告警信息进行根因定位,需要基于大量的历史告警数据进行学习训练,不仅在定位系统部署的初期阶段无法准确定位,而且也无法适应微服
务系统的动态变化问题。
[0005] 现有的一些技术方案中,基于业务指标发现异常时间段,只用到了平均耗时和错误率。实际上,调用数也是个很重要的反应整体调用是否异常的业务指标,需要实时检测。

发明内容

[0006] 本发明提供了一种微服务系统的故障根因定位方法,实时获取全量调用链数据,业务指标异常检测,异常时间段内的调用链拓扑图构建,拓扑图上每个节点的异常分计算,
故障根因节点定位。
[0007] 一种微服务系统的故障根因定位方法,包括以下步骤:
[0008] 1)实时采集微服务系统中产生的全量调用链数据;
[0009] 2)基于全量调用链数据,实时统计业务指标,利用异常检测算法判断业务指标是否异常,并确定对应的异常时间段;
[0010] 3)获取异常时间段内对应的所有调用链数据,对于每条调用链数据,实时构建span流程图并计算除了根节点外的每个节点的异常分,汇聚异常时间段所有span流程图构
建服务拓扑图、进程拓扑图和主机拓扑图,基于进程拓扑图和主机拓扑图根据计算确定故
障根因节点。
[0011] 本发明获取的调用链数据能获取到每条调用链中每个服务所在的具体进程信息、主机信息,从而为我们更准确的根因定位提供了数据保障,同时利用调用链数构建拓扑关
系,能够应对微服务系统动态变化的依赖关系。
[0012] 本发明实时获取微服务系统中的调用链数据,将调用链数据转换为四个业务指标并实时监测,当发现异常时,利用异常时间段内的调用链构建服务拓扑图、进程拓扑图和主
机拓扑图,并计算拓扑图上每个节点的异常分,最终按照深度从大到小、先进程后主机的顺
序定位到根因节点,即进程节点或主机节点。
[0013] 以下作为本发明的优选技术方案,进行进一步说明。
[0014] 步骤1)中,全量调用链数据的每一条调用链都包含若干节点,每个节点表示一次调用,其中包括span_id,parent_id,service_id,process_id,host_id;其中,span_id表示
该节点的编号,即该span的唯一键;parent_id表示该节点的父节点的编号,即调用该span
的父span的span_id,如果该节点为根节点,则parent_id为None;service_id表示该节点所
在的服务编号,process_id表示该节点所在的进程编号,host_id表示该节点所在的主机编
号。
[0015] 步骤2)中,所述的统计业务指标包括:调用次数 、错误率 、90%分位点的耗时 ,50%分位点的耗时 四个业务指标。
[0016] 本发明利用异常检测算法判断四个业务指标是否异常,并确定对应的异常时间段。
[0017] 本发明构建错误率、调用数、90%分位点耗时和50%分位点耗时等四个业务指标,并利用异常检测算法时候检测异常时间段。
[0018] 步骤3)中,本发明获取到异常时间段内的调用链数据,每条调用链都包含了各个服务所在的进程信息、主机信息,并实时构建服务拓扑图、进程拓扑图和主机拓扑图。基于
拓扑图,计算拓扑图上每个节点的异常分,并按照深度从大到小、先进程后主机的顺序定位
到根因节点。
[0019] 对于每条调用链数据,实时构建span流程图,具体包括:
[0020] 3.1.1)根据该条调用链中每个span里的parent_id和span_id之间的对应关系,构建span_id之间的调用关系拓扑,其中开始节点是parent_id为None所对应的span_id;
[0021] 3.1.2)上述一条调用链的span_id之间的调用关系拓扑即为该调用链的span流程图。
[0022] 对于每条调用链数据,计算除了根节点外的每个节点的异常分,具体包括:
[0023] 3.2.1)计算得到 :当前节点的error值为1时,则 记为1,否则记为0;
[0024] 3.2.2)计算得到 :当前节点的duration在父节点的duration中占比超过预设阈值 ,则 记为1,否则记为0,其中 通常为0.5 1(优选为0.5);
~
[0025] 3.2.3)计算得到 :当前节点的父节点的duration与其所有子节点的duration之差在该父节点的duration中占比超过预设阈值 ,则 记为1,否则记为0,其中 通常为
0.5 1(优选为0.5);
~
[0026] 3.2.4)合并上述三个异常分 、 、 得到该节点的异常分,即该节点异常分,其中 通常为0 3(优选为2),通常为0 3(优选为1),通常为0 3
~ ~ ~
(优选为0.5),则该节点对应的service_id,process_id,host_id的异常分均为 。
[0027] 汇聚异常时间段所有span流程图构建服务拓扑图、进程拓扑图和主机拓扑图,具体步骤如下:
[0028] 3.3.1)对于一条调用链的span流程图,根节点所在的深度数值设为0,其子节点所在的深度数值为1,即子节点的深度是在父节点的深度数值上加1,其中如果有多个并列的
子节点,则这些子节点享有相同的深度数值;
[0029] 3.3.2)汇聚异常时间段内的所有span流程图,对于深度数值相同且service_id相同的节点合并为一个节点,由此构建了异常时间段内的服务拓扑图,服务拓扑图上的每个
节点用该service_id表示;
[0030] 3.3.3)同理,构建异常时间段内深度数值相同的进程拓扑图和主机拓扑图,拓扑图中的每个节点分别用对应的process_id和host_id表示。
[0031] 基于进程拓扑图和主机拓扑图根据计算确定故障根因节点,具体包括:
[0032] 3.4.1)将异常分根据深度数值和process_id汇聚到进程拓扑图中,将异常分根据深度数值和host_id汇聚到主机拓扑图中,由此得到进程拓扑图和主机拓扑图中各个节点
的异常分;
[0033] 3.4.2)按照深度数值从大到小的顺序排序,在同一深度数值下,按照先进程拓扑图再主机拓扑图的顺序,定位到故障根因节点。
[0034] 步骤3.4.2)中,具体包括:
[0035] 3.4.2.1)先检测最大深度数值 下进程拓扑图中对应的所有节点,如果某个节点的异常分在该深度数值下所有节点的异常分之和中占比超过预设阈值 ,则根因节
点为该进程节点所对应的process_id,即为故障根因节点,如果没有,则进入步骤
3.4.2.2);
[0036] 阈值 为0.5 1,优选为0.7;~
[0037] 3.4.2.2)检测 下主机拓扑图中对应的所有节点,如果某个节点的异常分在该深度数值下所有节点的异常分之和中占比超过预设阈值 ,则根因节点为该主机节点
所对应的host_id,即为故障根因节点,如果没有,则进入步骤3.4.2.3);
[0038] 3.4.2.3)在 的深度下,重新进入步骤3.4.2.1),直至定位到故障根因节点。
[0039] 与现有技术相比,本发明具有如下优点:
[0040] 现有的技术方案中,需要CMDB数据或者TCP/IP数据来构建主机层面的拓扑关系,无法适应微服务系统中主机之间动态变化的连接关系,该类数据没有进程信息、服务信息,
无法定位更准确,即不能准确定位到主机上具体哪个进程、哪个服务的故障。本发明获取到
的调用链数据,不仅能动态构建主机层面的拓扑关系,还能动态构建进程层面的拓扑关系
以及服务层面的拓扑关系,为更准确的根因定位提供了数据保障;
[0041] 现有的技术方案中,利用告警信息进行根因定位,需要基于大量的历史告警数据进行学习训练,不仅在定位系统部署的初期阶段无法准确定位,而且也无法适应微服务系
统的动态变化问题。本发明利用无监督算法,实时分析异常时间段的调用链数据,无需训练
数据和标签;
[0042] 现有的技术方案中,基于业务指标发现异常时间段,只用到了平均耗时和错误率。实际上,调用数也是个很重要的反应整体调用是否异常的业务指标,需要实时检测。本发明
用90%分位点耗时和50%分位点耗时代替平均耗时,考虑到使用平均耗时指标可能会使得部
分耗时异常高的调用被平均掉。
[0043] 本发明的有益效果总结如下:
[0044] 1、实时性:拓扑图是实时自动构建的,无需人工处理;异常检测和根因定位的速度都是毫秒级满足了实时性的要求;
[0045] 2、适应性:由于实时构建的拓扑关系,使得该定位系统能适应任何不断变化的微服务系统,具有极强的适应性;
[0046] 3、低开销:仅对异常时间段内的调用链数据进行根因分析,资源开销极小;
[0047] 4、更准确:在实际生产环境中测试下来,80个故障时间段内定位到根因节点的准确率接近99%;
[0048] 5、无监督:全部流程中,无论是业务指标的异常检测还是节点根因定位都使用无监督算法,无需准备训练数据和标签。

附图说明

[0049] 图1是微服务系统的故障根因定位流程图。
[0050] 图2是业务指标构建和异常检测流程图。
[0051] 图3是节点定位的具体流程图。

具体实施方式

[0052] 本发明是为了解决微服务系统中出现故障时,能准确定位到根因节点,提出了一种微服务系统的故障根因定位方法。如图1所示,本发明实时获取微服务系统中的调用链数
据,将调用链数据转换为四个业务指标并实时监测,当发现异常时,利用异常时间段内的调
用链构建服务拓扑图、进程拓扑图和主机拓扑图,并计算拓扑图上每个节点的异常分,最终
按照深度从大到小、先进程后主机的顺序定位到根因节点,即进程节点或主机节点。
[0053] 一种微服务系统的故障根因定位方法,包括以下步骤,进行进一步说明。
[0054] 一、实时采集微服务系统中产生的全量调用链数据。
[0055] 1.每一条调用链数据表示一次完整的服务调用,包括失败的调用链,以嵌套JSON的格式存储在Elasticsearch数据库中。
[0056] 2.每一条嵌套JSON格式的调用链数据都包含traceID和spans。其中,traceID由一串数字组成,是用于区别其它条调用链的唯一键。spans是由多个span组成的列表类型的数
据,每个span表示其中的一次服务调用。
[0057] 3.每个span都存储为JSON格式,其中最主要的属性有span_id,parent_id,start,duration,service_id,process_id,host_id,error。其中,span_id表示该次调用的编号,
即该span的唯一键;parent_id表示该次调用的父调用的编号,即调用该span的父span的
span_id,如果该次调用为根节点,则parent_id为None;start表示该次调用的发起时间;
duration为该次调用的耗时;service_id、process_id、host_id分别表示该次调用所在的
服务编号、进程编号、主机编号;error等于0或1,表示该次调用是否失败。
[0058] 二、基于全量调用链数据,实时统计业务指标,利用异常检测算法判断业务指标是否异常,并确定对应的异常时间段,如图2所示,统计业务指标包括:调用次数 、错误率
、90%分位点的耗时 ,50%分位点的耗时 四个业务指标。
[0059] 1.对于全量调用链数据,根据根节点对应的服务编号进行聚合,即根据每一条完整调用链中parent_id为None的span所对应的service_id进行聚合,聚合后的每类调用链
数据用该service_id表示。
[0060] 2.我们对其中一类调用链数据进行实时统计,每隔 秒统计前 秒内的调用次数 、错误率 、90%分位点的耗时 ,50%分位点的耗时 四个业务指
标,其中 通常为60;
[0061] 1)统计 秒内的调用链数量即为 ;
[0062] 2)对于每条调用链,其中有span对应的error值为1的调用链,其数量总共有条,我们可以得到错误率指标 ;
[0063] 3)对于每条调用链,parent_id为None的span对应的duration为该条调用链的耗时,我们得到 秒内 个耗时数值,按照从小到大排序,我们得到90%分位点的耗时
指标 和50%分位点的耗时指标 。
[0064] 3.分别对上述四个业务指标应用异常检测算法,任何一个指标检测到异常时,均表示对应时间段内异常,异常时间段记为 ;
[0065] 1)对于错误率指标 ,90%分位点的耗时指标 和50%分位点的耗时指标,应用箱线图异常检测算法;
[0066] 2)对于调用次数指标 ,先进行一阶差分计算,然后对差分后的结果应用箱线图异常检测算法。
[0067] 三、如图3所示,获取异常时间段内对应的所有调用链数据。对于每条调用链数据,实时构建span流程图。汇聚所有span流程图即可构建服务拓扑图、进程拓扑图和主机拓扑
图。基于拓扑图应用根因定位算法确定进程或主机层面的最细粒度的故障根因节点。
[0068] 1.对每条调用链,实时构建span流程图。具体方法如下:
[0069] 1)根据该条调用链中每个span里的parent_id和span_id之间的对应关系,构建span_id之间的调用关系拓扑,其中开始节点是parent_id为None所对应的span_id;
[0070] 2)上述一条调用链的span_id之间的调用关系拓扑即为该调用链的span流程图。
[0071] 2.汇聚 时间段内的所有span流程图,即可构建服务拓扑图、进程拓扑图和主机拓扑图。具体步骤如下:
[0072] 1)对于一条span流程图,根节点所在的深度我们设为0,其子节点所在的深度为1,即子节点的深度是在父节点的深度数值上加1。其中如果有多个并列的子节点,则这些子节
点享有相同的深度数值;
[0073] 2)汇聚 时间段内的所有span流程图,我们用service_id代替span_id,深度相同且service_id相同的服务节点合并为一个节点,由此构建了 时间段内的服
务拓扑图,服务拓扑图上的每个节点用service_id表示;
[0074] 3)同理,我们还可以构建 时间段内深度相同的进程拓扑图和主机拓扑图,拓扑图中的每个节点分别用process_id和host_id表示。
[0075] 3.对于异常时间段内的单个调用链,我们可以计算得到除了根节点外的每个节点的异常分,具体步骤如下:
[0076] 1)计算得到 ,当前节点的error值为1时,则 记为1,否则记为0;
[0077] 2)计算得到 ,当前节点的duration在父节点的duration中占比超过预设阈值,则 记为1,否则记为0,其中 通常为0.5;
[0078] 3)计算得到 ,当前节点的父节点的duration与其所有子节点的duration之差在该父节点的duration中占比超过预设阈值 ,则 记为1,否则记为0,其中 通常为0.5;
[0079] 4)合并上述三个异常分得到该节点的异常分,即该节点异常分,其中 通常为2, 通常为1,通常为0.5,则该节点对应的
service_id,process_id,host_id的异常分均为 。
[0080] 4.计算得到 时间段内每条调用链的非根结点的异常分,并将这些异常分根据深度和process_id(host_id)汇聚到进程拓扑图(主机拓扑图)中,汇聚方法为简单求
和。由此得到进程拓扑图和主机拓扑图中各个节点的异常分。
[0081] 5.按照深度数值从大到小的顺序检测根因节点,在同一深度下,按照先进程拓扑图再主机拓扑图的顺序检测根因节点,具体步骤如下:
[0082] 1)先检测最大深度 下进程拓扑图中对应的所有节点,如果某个节点的异常分在该深度下所有节点的异常分之和中占比超过预设阈值 ,则根因节点为该进程节点
所对应的process_id;
[0083] 2)如果没有,则继续检测 下主机拓扑图中的所有节点,如果某个节点的异常分在该深度下所有节点的异常分之和中占比超过预设阈值 ,则根因节点为该进程节
点所对应的host_id;
[0084] 3)如果上述两步都没有检测到根因节点,则在 的深度下,重复上述两个步骤,直至定位到根因节点。
[0085] 本发明获取到的调用链数据,不仅能动态构建主机层面的拓扑关系,还能动态构建进程层面的拓扑关系以及服务层面的拓扑关系,为更准确的根因定位提供了数据保障。
本发明利用无监督算法,实时分析异常时间段的调用链数据,无需训练数据和标签。本发明
用90%分位点耗时和50%分位点耗时代替平均耗时,考虑到使用平均耗时指标可能会使得部
分耗时异常高的调用被平均掉。