一种基于Transformer的微服务性能异常检测方法和系统
未命名
09-22
阅读:95
评论:0

一种基于transformer的微服务性能异常检测方法和系统
技术领域
1.本发明属于深度学习和微服务系统运维领域,更具体地,涉及一种面向分布式跟踪、基于transformer的微服务性能异常检测方法和系统。
背景技术:
2.随着云计算技术的不断发展,许多软件应用程序开始部署在云计算平台上,单体架构逐渐被面向服务的架构所取代。越来越多的公司选择从单体架构迁移到微服务架构,基于微服务架构来构建他们的核心业务系统,然而,基于微服务架构的软件服务的故障也影响了用户的正常使用,并给企业带来造成了不小的损失,及时发现和诊断故障,保障线上服务的高可靠性和高可用性十分重要。随着系统规模增大和复杂度,传统的人工运维变得力不从心。由于服务之间复杂的交互以及庞大的运维数据,使针对微服务系统的异常检测问题充满了挑战性。
3.针对微服务异常检测问题已经有一些机器学习的方法尝试解决这个问题,第一种方法将调用链编码为服务跟踪向量,将其作为输入训练了一个具有后验流的深度贝叶斯神经网络,用于学习调用链的正常模式。通过比较调用轨迹的模式与学习到的正常调用轨迹的模式,来判断是否存在异常情况;第二种方法基于变分自编码器对应用程序正常状态下的调用链进行建模,利用调用链中服务的响应时间将调用链构建为一维时序数据用于训练,在检测时使用重构误差来判断调用链是否异常;第三种方法提出了一种多模态长短期记忆神经网络(long short term memory networks,简称lstm)模型,它通过组合两个单模态网络来学习调用链数据中服务序列和响应时间序列的正常模式。其中一个网络用于学习服务之后可能调用的服务的概率分布,另一个网络则用于学习服务响应时间的概率分布。在线检测时,模型通过预测一个事件之后可能发生的事件以及事件可能的响应时间来判断系统是否出现了异常。
4.然而,上述方法都存在一些不可忽略的缺陷:第一种方法针对调用链所构建的特征向量的有效维度过于稀疏,在一定程度上会影响模型的收敛速度和检测效果;第二种方法没有考虑服务的响应时间和调用路径之间的关联关系,因此不能很好的建模服务的响应时间的正常分布,使得对于微服务性能异常检测的效率不高;第三种方法使用lstm难以捕捉调用链中服务之间的远距离依赖关系,使得模型很难学习服务之间的调用关系,因此导致不准确的检测结果;此外,上述方法均无法细粒度的检测调用链中的异常服务,对检测的异常调用链缺乏可解释性,使得无法快速的定位异常的根因,因此它们无法满足微服务性能异常有效发现与准确定位根因的业务场景。
技术实现要素:
5.针对现有技术的以上缺陷或改进需求,本发明提供了一种基于transformer的微服务性能异常检测方法和系统,其目的在于,解决背景技术中提到的第一种方法针对调用链所构建的特征向量的有效维度过于稀疏,在一定程度上会影响模型的收敛速度和检测效
果的技术问题,以及第二种方法没有考虑服务的响应时间和调用路径之间的关联关系,因此不能很好的建模服务的响应时间的正常分布,使得对于微服务性能异常检测的效率不高的技术问题,以及第三种方法使用lstm难以捕捉调用链中服务之间的远距离依赖关系,使得模型很难学习服务之间的调用关系,因此导致不准确的检测结果的技术问题,以及上述方法均无法细粒度的检测调用链中的异常服务,对检测的异常调用链缺乏可解释性,使得无法快速的定位异常的根因,因此它们均无法满足微服务性能异常有效发现与准确定位根因的业务场景的技术问题。
6.为实现上述目的,按照本发明的一个方面,提供了一种基于transformer的微服务性能异常检测方法,包括以下步骤:
7.(1)获取微服务系统的跨度日志,使用python将跨度日志中具有相同跟踪id的跨度组合在一起,以得到多条不同的调用链,针对每条调用链而言,使用深度优先搜索算法搜索该调用链从根节点到叶子节点的所有路径,以得到该调用链中的多个服务调用序列及其对应的多个响应时间序列,将得到的每个服务调用序列对应的每个响应时间序列中的每个响应时间输入到预先建立的cart回归树中,以得到每个响应时间对应的特征值,该调用链中每个服务调用序列对应的每个响应时间序列对应的所有特征值构成了该服务调用序列对应的特征值序列,即该服务调用序列对应的路径向量集合。
8.(2)将步骤(1)得到的每个服务调用序列输入到预先训练好的检测模型中,以得到该服务调用序列对应的路径向量集合中各个特征值的概率分布。
9.(3)根据步骤(2)中检测模型输出的服务特征值的概率分布,获取路径向量中服务实际特征值的概率作为服务的异常得分。
10.(4)根据步骤(3)得到的服务的异常得分判断服务是否是调用链中出现性能异常的服务。
11.优选地,cart回归树是通过以下步骤得到:
12.(1-1)获取一个服务的多个响应时间,按照大小升序对服务的响应时间排序,以得到有序变量集合d。
13.d={(x1,y1),(x2,y2),(x3,y3),
…
,(xn,yn)}
14.其中xi表示服务的第i个响应时间在有序变量集合中的位置,yi表示服务的第i个响应时间的数值,且有i∈[1,n],其中n表示服务的响应时间的总数。
[0015]
(1-2)遍历步骤(1-1)得到的有序变量集合d中服务的第i个响应时间在有序变量集合中的位置xi和服务的第i+1个响应时间在有序变量集合中的位置x
i+1
之间的切分点si,即计算每个切分点si划分的两部分的误差平方和m(si)。选择使误差平方和m(s)最小的s作为最优的切分点sj,以sj为切分点将有序变量集合d划分为左子集(y1,y2,...,yj)和右子集(y
j+1
,y
j+2
,...,yn)。
[0016]
(1-3)针对步骤(1-2)中以最优切分点sj切分集合得到的左子集和右子集而言,通过设置比例因子,并不断重复上述步骤(1-2),即不断以递归的方式对这两个子集进行划分,直到满足划分停止条件为止,进而获取得到的左子集(y1,y2,...,yj)和右子集(y
j+1
,y
j+2
,...,yn)的平均方差作为该比例因子对应的平均方差。
[0017]
(1-4)不断以递归的方式增加比例因子,并重复上述步骤(1-3),从而得到多个比
例因子对应的平均方差;
[0018]
(1-5)从步骤(1-3)和(1-4)得到的多个平均方差中选择最小平均方差对应的比例因子以及左子集和右子集,并得到具有m个子树的决策树,分别用y1,y2,...,ym表示,其中yi={yi|ys≤yi《y
s+1
},计算每个子树的均值ci作为每个子树的输出。
[0019]
优选地,步骤(1-2)中获取切分点si对应的误差平方和m(si)是采用以下公式:
[0020][0021]
其中r1={x1,x2,...,xi},r2={x
i+1
,x
i+2
,...xn},c1和c2分别为左子集(y1,y2,...,yj)和右子集(y
j+1
,y
j+2
,...,yn)的平均值;
[0022]
步骤(1-5)是采用以下公式:
[0023][0024]
其中nm表示子树ym的元素个数。
[0025]
优选地,检测模型是transfomer模型,其包括依次连接的词嵌入层、位置编码层、编码器-解码器层和输出层,具体结构如下:
[0026]
第一层是词嵌入层,输入是一个c维的整数向量(其中c代表输入序列的长度),每个整数代表输入序列中一个单词的索引,利用一个大小为v
×dmodel
(其中v为自然数,其大小和数据集中的服务和服务的特征值数量有关,服务数越多,则v的取值越大,d
model
为常数,通常取64)的嵌入矩阵将每个索引映射为一个d
model
维的词向量,输出由c个d
model
维词向量组成的c
×dmodel
的词向量。
[0027]
第二层为位置编码层,其输入为第一层得到的c
×dmodel
的词向量,使用正弦和余弦位置编码方式为每个d
model
维的词向量计算一个d
model
维的向量作为其位置编码向量,并将词向量和位置编码向量相加,输出一个c
×dmodel
维向量。
[0028]
第三层为编码器-解码器层,其输入为第二层得到的c
×dmodel
维向量,对其进行矩阵变换和计算,输出c
×
v维向量。
[0029]
第四层为输出层,其输入为第三层得到的c
×
v维向量,利用一个全连接层和softmax层对其进行线性变换和归一化处理,输出为一个c
×
v的向量。
[0030]
优选地,检测模型是通过以下步骤训练得到的:
[0031]
(2-1)获取微服务系统的跨度日志,对跨度日志进行预处理,以得到服务调用序列[op1,op2,...,opa]和路径向量集合[d1,d2,...,da]组成的训练集。
[0032]
(2-2)针对步骤(2-1)得到的训练集中的服务调用序列[op1,op2,...,opa](其中opi由服务名和服务操作名组成)和路径向量集合[d1,d2,...,da],使用一个大小为v
×dmodel
(其中v为自然数,其大小和数据集中的不同的服务数量有关,服务数越多,则v的取值越大,d
model
为常数,通常取64)的嵌入矩阵分别将服务调用序列和路径向量集合中的每个元素映射成词向量,分别用于表示服务的语义信息和特征信息,使用正弦和余弦位置编码为每个元素的词向量进行d
model
维的位置编码,并将每个元素对应的位置编码和词向量相加以得到该元素对应的求和结果,服务调用序列和路径向量集合中所有元素对应的求和结果分别构成transformer模型中编码器-解码器层的输入向量集合[s1,s2,...,sa]和[t1,t2,...,ta]。
[0033]
(2-3)将步骤(2-2)得到的输入向量集合[s1,s2,...,sa]输入transformer模型的编码器中,以利用自注意力机制获取输入向量集合的特征矩阵y。
[0034]
(2-4)将步骤(2-2)得到的向量[t1,t2,...,tn]输入到transformer模型解码器中,以利用带掩码的自注意力机制获取特征矩阵z。
[0035]
(2-5)将步骤(2-3)计算得到的特征矩阵y作为k和v矩阵,将步骤(2-4)计算得到特征矩阵z作为q矩阵,将q、k、v矩阵输入检测模型的解码器中的编码器-解码器注意力模块中,以获取新的特征矩阵f。将新的特征矩阵f输入激活函数为softmax的全连接层网络,以得到模型预测的服务特征值的概率分布。
[0036]
(2-6)根据步骤(2-5)得到的模型预测的服务特征值概率分布、并使用交叉熵损失函数对检测模型进行迭代训练,直到检测模型收敛为止,从而得到训练好的检测模型。
[0037]
优选地,步骤(2-2)中,对于服务调用序列和路径向量中给定位置pos和词向量中的维度i(其中i∈[1,a]),位置编码的计算如下:
[0038][0039][0040]
其中,pe
(pos,i)
表示位置pos的第i维的位置编码。d
model
表示嵌入向量的维度。
[0041]
优选地,步骤(2-3)具体为,
[0042]
首先,通过权重矩阵wq、wk和wv对输入向量集合中的每个输入向量si进行线性变换,分别得到查询向量q、键向量k和值向量,在训练过程中,权重矩阵wq、wk和wv会不断更新;
[0043]
然后,利用查询向量和键向量计算输入向量si的注意力分数
∝
i,j
。
[0044][0045]
其中q1,q2,...,qn表示查询向量q中的元素,k1,k2,...,kn表示键向量k中的元素;
[0046]
由
∝
i,j
组成的注意力得分矩阵(attention score)代表了服务调用序列中不同服务之间的依赖程度。
[0047]
接下来,使用softmax函数对
∝
i,j
进行归一化得到
∝′
i,j
。
[0048][0049]
其中t∈[1,n];
[0050]
随后,通过将value向量与归一化后的相关性分数进行加权和计算,以得到表征服务上下文的向量yi。
[0051]
[0052]
其中v1,v2,...,vn表示值向量v中的元素;
[0053]
最后,使用一个两层的全连接网络ffn对所有向量y1,,y2,...,yn进行非线性变换,最终得到服务调用序列经过编码器处理后的特征矩阵y。
[0054]
优选地,步骤(2-6)中的交叉熵损失函数l为:
[0055][0056]
其中,ty表示目标序列的长度,y
t,i
表示目标序列ty在时间步t时,第i个特征值的one-hot表示,表示检测模型在时间步t时,预测的第i个特征值的概率值。
[0057]
优选地,步骤(4)首先是获取步骤(3)得到的该服务调用序列对应服务的异常得分并记录下来,在初始检测系统的性能异常时,针对所有服务的异常得分设置固定的阈值th来判断服务是否异常,即当服务的异常得分小于0.6时,则判定该服务是调用链中出现性能异常的服务。在之后的检测过程中,首先根据记录的该服务历史异常得分获取该服务历史异常得分的累计分布函数cdf,然后根据该服务当前异常得分和累计分布函数计算累计分布值,如果累计分布值小于预设阈值,则判定该服务是调用链中出现性能异常的服务。
[0058]
按照本发明的另一方面,提供了一种基于transformer的微服务性能异常检测系统,包括以下步骤:
[0059]
第一模块,用于获取微服务系统的跨度日志,使用python将跨度日志中具有相同跟踪id的跨度组合在一起,以得到多条不同的调用链,针对每条调用链而言,使用深度优先搜索算法搜索该调用链从根节点到叶子节点的所有路径,以得到该调用链中的多个服务调用序列及其对应的多个响应时间序列,将得到的每个服务调用序列对应的每个响应时间序列中的每个响应时间输入到预先建立的cart回归树中,以得到每个响应时间对应的特征值,该调用链中每个服务调用序列对应的每个响应时间序列对应的所有特征值构成了该服务调用序列对应的特征值序列,即该服务调用序列对应的路径向量集合。
[0060]
第二模块,用于将第一模块得到的每个服务调用序列输入到预先训练好的检测模型中,以得到该服务调用序列对应的路径向量集合中各个特征值的概率分布。
[0061]
第三模块,用于根据第二模块中检测模型输出的服务特征值的概率分布,获取路径向量中服务实际特征值的概率作为服务的异常得分。
[0062]
第四模块,用于根据第三模块得到的服务的异常得分判断服务是否是调用链中出现性能异常的服务。
[0063]
总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有益效果:
[0064]
(1)本发明由于采用步骤(1),利用调用链的结构和服务性能指标(响应时间),将调用链构建为服务调用序列和路径向量,避免了所构建的调用链的向量过于稀疏的问题。因此解决了由于所构建的输入向量的有效维度过于稀疏而导致模型难以收敛和检测效果不佳的技术问题;
[0065]
(2)本发明由于采用步骤(2-2)到(2-3),其使用transformer自注意力机制捕捉服务之间的调用关系,因此解决了由于无法捕捉服务之间的远距离的依赖关系而导致检测效
果不准确的技术问题;
[0066]
(3)本发明由于采用步骤(2-5),其使用transfomer编码器-解码器注意力机制建立服务的响应时间和服务的调用路径之间的关联关系,并将这些关系融入到模型训练中,能够有效学习到服务在不同调用链中的正常响应时间分布,因此能够解决现有微服务性能异常检测方法没有考虑服务响应时间和调用路径之间的关联关系,而导致异常检测效果不佳的技术问题;
[0067]
(4)由于本发明采用步骤(3)到(4),其利用模型输出的概率分布获取调用链中服务的实际特征值的概率来判断异常,使得异常检测时能够细粒度地识别调用链中的异常服务,因此能够由于无法检测到异常调用链中的异常服务而导致无法快速准确的定位异常的根因的技术问题。
附图说明
[0068]
图1是本发明基于transformer的微服务性能异常检测方法的整体框架示意图;
[0069]
图2是本发明在aiops挑战赛数据集和开源微服务train-ticket数据集上的异常检测效果与现有方法在f1-score指标上的对比;
[0070]
图3是本发明基于transformer的微服务性能异常检测方法的流程图。
具体实施方式
[0071]
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。
[0072]
本发明的基本思路在于,利用transformer模型注意力机制捕捉服务之间的调用关系,并利用transformer模型中编码器-解码器注意力模块建立服务的响应时间和调用路径之间的关联关系,进而能够更加有效学习服务响应时间的正常分布情况,提升了对于微服务性能异常的检测效果。
[0073]
如图1和图3所示,本发明提供了一种基于transformer的微服务性能异常检测方法,包括以下步骤:
[0074]
(1)获取微服务系统的跨度日志,使用python将跨度日志中具有相同跟踪id的跨度组合在一起,以得到多条不同的调用链,针对每条调用链而言,使用深度优先搜索算法搜索该调用链从根节点到叶子节点的所有路径,以得到该调用链中的多个服务调用序列及其对应的多个响应时间序列,将得到的每个服务调用序列对应的每个响应时间序列中的每个响应时间输入到预先建立的cart回归树中,以得到每个响应时间对应的特征值,该调用链中每个服务调用序列对应的每个响应时间序列对应的所有特征值构成了该服务调用序列对应的特征值序列,即该服务调用序列对应的路径向量集合。
[0075]
本步骤的优点在于,利用调用链的结构信息和服务响应时间将调用链构建为服务调用序列和路径向量,避免了所构建的调用链的特征向量过于稀疏的问题,基于服务调用序列和路径向量能够实现更高效的服务正常模式建模。
[0076]
具体而言,本步骤cart回归树是通过以下步骤得到:
[0077]
(1-1)获取一个服务的多个响应时间,按照大小升序对服务的响应时间排序,以得到有序变量集合d。
[0078]
d={(x1,y1),(x2,y2),(x3,y3),...,(xn,yn)}
[0079]
其中xi表示服务的第i个响应时间在有序变量集合中的位置,yi表示服务的第i个响应时间的数值,且有i∈[1,n],其中n表示服务的响应时间的总数。
[0080]
(1-2)遍历步骤(1-1)得到的有序变量集合d中服务的第i个响应时间在有序变量集合中的位置xi和服务的第i+1个响应时间在有序变量集合中的位置x
i+1
之间的切分点si,即计算每个切分点si划分的两部分的误差平方和m(si)。选择使误差平方和m(s)最小的s作为最优的切分点sj,以sj为切分点将有序变量集合d划分为左子集(y1,y2,...,yj)和右子集(y
j+1
,y
j+2
,...,yn)。
[0081]
具体而言,本步骤中获取切分点si对应的误差平方和m(si)是采用以下公式:
[0082][0083]
其中r1={x1,x2,...,xi},r2={x
i+1
,x
i+2
,...xn},c1和c2分别为左子集(y1,y2,...,yj)和右子集(y
j+1
,y
j+2
,...,yn)的平均值。
[0084]
(1-3)针对步骤(1-2)中以最优切分点sj切分集合得到的左子集和右子集而言,通过设置比例因子,并不断重复上述步骤(1-2),即不断以递归的方式对这两个子集进行划分,直到满足划分停止条件(即当划分得到的左子集或右子集中的元素数量小于有序变量集合d中元素数量乘以比例因子)为止,进而获取得到的左子集(y1,y2,...,yj)和右子集(y
j+1
,y
j+2
,...,yn)的平均方差作为该比例因子对应的平均方差。
[0085]
在本步骤中,比例因子设置为0.1;
[0086]
(1-4)不断以递归的方式增加比例因子,并重复上述步骤(1-3),从而得到多个比例因子对应的平均方差;
[0087]
具体而言,本步骤中,以0.05作为间隔,不断增加比例因子的取值,直到其等于0.5为止。
[0088]
(1-5)从步骤(1-3)和(1-4)得到的多个平均方差中选择最小平均方差对应的比例因子以及左子集和右子集,并得到具有m个子树的决策树,分别用y1,y2,...,ym表示,其中yi={yi|ys≤yi《y
s+1
},计算每个子树的均值ci作为每个子树的输出:
[0089][0090]
其中nm表示子树ym的元素个数。
[0091]
上述子步骤(1-1)到(1-5)的优点在于,利用cart回归树对每个服务的响应时间进行分箱,有效地减少了每个服务特征值的数量,降低了模型的运算复杂度,同时减少了响应时间噪声和波动对模型的干扰,从而提高了模型检测的效果。
[0092]
(2)将步骤(1)得到的每个服务调用序列输入到预先训练好的检测模型中,以得到该服务调用序列对应的路径向量集合中各个特征值的概率分布。
[0093]
本发明的检测模型是一个transfomer模型,其包括依次连接的词嵌入层、位置编
码层、编码器-解码器层和输出层,具体结构如下:
[0094]
第一层是词嵌入层,输入是一个c维的整数向量(其中c代表输入序列的长度),每个整数代表输入序列中一个单词的索引,利用一个大小为v
×dmodel
(其中v为自然数,其大小和数据集中的服务和服务的特征值数量有关,服务数越多,则v的取值越大,d
model
为常数,通常取64)的嵌入矩阵将每个索引映射为一个d
model
维的词向量,输出由c个d
model
维词向量组成的c
×dmodel
的词向量。
[0095]
第二层为位置编码层,其输入为第一层得到的c
×dmodel
的词向量,使用正弦和余弦位置编码方式为每个d
model
维的词向量计算一个d
model
维的向量作为其位置编码向量,并将词向量和位置编码向量相加,输出一个c
×dmodel
维向量。
[0096]
第三层为编码器-解码器层,其输入为第二层得到的c
×dmodel
维向量,对其进行矩阵变换和计算,输出c
×
v维向量。
[0097]
第四层为输出层,其输入为第三层得到的c
×
v维向量,利用一个全连接层和softmax层对其进行线性变换和归一化处理,输出为一个c
×
v的向量。
[0098]
具体而言,本发明的检测模型是通过以下步骤训练得到的:
[0099]
(2-1)获取微服务系统的跨度日志,对跨度日志进行预处理,以得到服务调用序列[op1,op2,...,opa]和路径向量集合[d1,d2,...,da]组成的训练集。
[0100]
本步骤中跨度日志是通过分布式监控工具jaeger从微服务系统中采集的行数据,包括时间戳、服务名、服务操作名、跨度id、跟踪id等信息。
[0101]
本步骤对跨度日志进行预处理的过程,和上述步骤(1)中的处理过程完全相同,在此不再赘述。
[0102]
(2-2)针对步骤(2-1)得到的训练集中的服务调用序列[op1,op2,...,opa](其中opi由服务名和服务操作名组成)和路径向量集合[d1,d2,...,da],使用一个大小为v
×dmodel
(其中v为自然数,其大小和数据集中的不同的服务数量有关,服务数越多,则v的取值越大,d
model
为常数,通常取64)的嵌入矩阵分别将服务调用序列和路径向量集合中的每个元素映射成词向量,分别用于表示服务的语义信息和特征信息,使用正弦和余弦位置编码为每个元素的词向量进行d
model
维的位置编码,并将每个元素对应的位置编码和词向量相加以得到该元素对应的求和结果,服务调用序列和路径向量集合中所有元素对应的求和结果分别构成transformer模型中编码器-解码器层的输入向量集合[s1,s2,...,sa]和[t1,t2,...,ta]。
[0103]
对于服务调用序列和路径向量中给定位置pos和词向量中的维度i(其中i∈[1,a]),位置编码的计算如下:
[0104][0105][0106]
其中,pe
(pos,i)
表示位置pos的第i维的位置编码。d
model
表示嵌入向量的维度。
[0107]
具体而言,位置编码的参数是一个基于位置和词向量维度计算的值。当i是偶数时,这个值为当i是奇数时,这个值为对
于给定位置pos的每个维度i,其对应的位置编码值都是由不同周期的正弦和余弦曲线组成。例如当i=0时,对应周期为2n的正弦函数;当i=1时,对应周期为2π的余弦函数。如果两个不同位置posa和posb在某个维度i上具有相同的编码值,则它们之间的差值等于该维度所在曲线的周期,即|pos
a-posb|=ti。在其他维度k∈{0,1,2,...,d-1}(k≠i),由于周期tk≠ti,posa和posb在维度k上的编码就不会相等。因此,这种位置编码方式可以确保不同位置在所有d
model
维度上被编码成不完全相同的值,从而序列中不同位置上的元素都能获得独一无二的位置编码。
[0108]
(2-3)将步骤(2-2)得到的输入向量集合[s1,s2,...,sa]输入transformer模型的编码器中,以利用自注意力机制获取输入向量集合的特征矩阵y。
[0109]
具体来说,首先通过权重矩阵wq、wk和wv对输入向量集合中的每个输入向量si(其中i∈[1,a])进行线性变换,分别得到查询(query)向量q、键(key)向量k和值(value)向量,在训练过程中,权重矩阵wq、wk和wv会不断更新;
[0110]
然后,利用查询向量和键向量计算输入向量si的注意力分数
∝
i,j
。
[0111][0112]
其中q1,q2,...,qn表示查询向量q中的元素,k1,k2,...,kn表示键向量k中的元素;
[0113]
由
∝
i,j
组成的注意力得分矩阵(attention score)代表了服务调用序列中不同服务之间的依赖程度。
[0114]
接下来,使用softmax函数对
∝
i,j
进行归一化得到
∝′
i,j
。
[0115]
∝′
i,j
=softmax(
∝
i,1
,
∝
i,2
,...,
∝
i,n
)=exp(
∝
i,j
)/∑
t
exp(
∝
i,t
)
[0116]
其中t∈[1,n];
[0117]
随后,通过将value向量与归一化后的相关性分数进行加权和计算,以得到表征服务上下文的向量yi。
[0118][0119]
其中v1,v2,...,vn表示值向量v中的元素;
[0120]
最后,使用一个两层的全连接网络ffn对所有向量y1,,y2,...,yn进行非线性变换,最终得到服务调用序列经过编码器处理后的特征矩阵y。
[0121]
上述子步骤(2-2)到(2-3)的优点在于,利用自注意机制计算服务调用序列的输入向量进行处理,能够更充分地捕获服务的上下文信息,更有效地对服务的正常响应时间分布进行建模。
[0122]
(2-4)将步骤(2-2)得到的向量[t1,t2,...,tn]输入到transformer模型解码器中,以利用带掩码的自注意力机制获取特征矩阵z。
[0123]
具体而言,本步骤的计算过程与步骤(2-3)相同,在此不再赘述。
[0124]
(2-5)将步骤(2-3)计算得到的特征矩阵y作为k和v矩阵,将步骤(2-4)计算得到特征矩阵z作为q矩阵,将q、k、v矩阵输入检测模型的解码器中的编码器-解码器注意力模块
中,以获取新的特征矩阵f。将新的特征矩阵f输入激活函数为softmax的全连接层网络,以得到模型预测的服务特征值的概率分布。
[0125]
具体而言,本步骤输入编码器-解码器注意力模块后的过程和步骤(2-3)完全相同,在此不再赘述。
[0126]
本步骤的优点在于,通过编码器-解码器注意力机制,能够建立起服务响应时间和服务调用路径之间的关联关系,进而使模型更准确地学习到服务响应时间的正常分布情况。
[0127]
(2-6)根据步骤(2-5)得到的模型预测的服务特征值概率分布、并使用交叉熵损失函数对检测模型进行迭代训练,直到检测模型收敛为止,从而得到训练好的检测模型。
[0128]
具体而言,本步骤是通过最小化交叉熵损失函数的值来不断更新检测模型的参数,使检测模型能够学习到服务响应时间的正常分布情况。
[0129]
优选地,交叉熵损失函数l为:
[0130][0131]
其中,ty表示目标序列的长度,y
t,i
表示目标序列ty在时间步t时,第i个特征值的one-hot表示,表示检测模型在时间步t时,预测的第i个特征值的概率值。
[0132]
(3)根据步骤(2)中检测模型输出的服务特征值的概率分布,获取路径向量中服务实际特征值的概率作为服务的异常得分。
[0133]
(4)根据步骤(3)得到的服务的异常得分判断服务是否是调用链中出现性能异常的服务。
[0134]
具体而言,本步骤首先是获取步骤(3)得到的该服务调用序列对应服务的异常得分并记录下来,在初始(即第一天)检测系统的性能异常时,针对所有服务的异常得分设置固定的阈值th(th=0.6)来判断服务是否异常,即当服务的异常得分小于0.6时,则判定该服务是调用链中出现性能异常的服务。在之后(非第一天)的检测过程中,首先根据记录的该服务历史(前一天或者一个星期,优选为前一天)异常得分获取该服务历史异常得分的累计分布函数(cumulative distribution function,简称cdf),然后根据该服务当前异常得分和累计分布函数计算累计分布值,如果累计分布值小于预设阈值(其在本发明中为0.1),则判定该服务是调用链中出现性能异常的服务。
[0135]
上述步骤(3)到(4)的优点在于,利用模型输出的每个服务特征值的概率分布能够细粒度的检测出调用链中出现性能异常的服务,便于对微服务系统出现的性能异常问题进行根因定位。
[0136]
本发明提供了一种面向分布式跟踪,基于transformer的微服务性能异常检测方法,其目的在于,在微服务系统中,及时准确的检测系统异常并定位异常的根本原因,保障服务的高可用性和高可靠性。其利用transformer的自注意机制捕捉服务之间的调用关系,并通过编码器-解码器架构关联服务的响应时间和调用路径,从而有效建模服务响应时间的正常分布情况,利用训练好的模型在线检测微服务性能异常,并在异常检测的基础上利用服务之间的调用关系快速推断根因,使得对于微服务性能异常的发现和诊断更加准确。
便于运维人员及时采取有效的措施,提高系统的可靠性。
[0137]
实验结果
[0138]
本发明实验环境:cpu为8枚amd ryzen 7 3700x@3.60ghz,gpu为1块nvidia geforce rtx 3060,内存为16gb ddr4,硬盘容量为2tb,在windows 10操作系统下,采用python和机器学习库pytorch编程实现本文算法。
[0139]
为了说明检测模型在本发明中的有效性以及本发明对于服务性能异常检测的优越性,本发明在aiops数据集和train-ticket数据集上做了相关的测试。并将模型与现有的方法aevb、multimodallstm和traceanomaly进行了效果对比,表1给出了对比结果。其中p、r、f分别代表精确率、召回率和模型的综合性能三种评价指标。
[0140]
表1不同方法的异常检测效果
[0141][0142]
由表1可知,相比于现有的三种异常检测的方法,在两种数据集下,本发明在精确率上平均提高了48.6%、30.2%和3.5%,在召回率上平均提高了34.7%、11.1%和4.1%,可以看出本发明提出的微服务性能异常检测方法在两个数据集上的检测效果均有所提升。在于,本发明提出的基于transformer的微服务性能异常根因定位方法,一方面,采用自注意机制捕获服务之间的调用关系,更充分的提取服务的上下文信息,另一方面,使用编码器-解码器注意力机制,建立了服务特征值和服务调用序列之间的关联关系,提升了对于服务响应时间的正常分布的建模效果,从而提高对于服务性能异常的检测效果。
[0143]
为了说明在异常检测基础上所进行的根因定位算法能够准确定位出异常的根因服务。本发明在aiops数据集上做了相关的测试。并将模型与现有的方法sbfl、monitorrank和traceanomaly进行了效果对比,表2给出了对比结果。其中a@k(k=1,2,3)表示根本原因包含在top-k结果中的概率,即前k个结果中包含根因服务的数占总的异常跟踪数的比例。由表2可知相比于现有的三种异常检测的方法,本发明根因定位的准确率分别提高了35.4%和6.1%。这些结果表明在异常检测的基础上算法能准确定位出异常的根本原因,有效解决了微服务性能异常检测效率不高的问题。
[0144]
表2不同方法根因定位效果对比
[0145][0146]
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
技术特征:
1.一种基于transformer的微服务性能异常检测方法,其特征在于,包括以下步骤:(1)获取微服务系统的跨度日志,使用python将跨度日志中具有相同跟踪id的跨度组合在一起,以得到多条不同的调用链,针对每条调用链而言,使用深度优先搜索算法搜索该调用链从根节点到叶子节点的所有路径,以得到该调用链中的多个服务调用序列及其对应的多个响应时间序列,将得到的每个服务调用序列对应的每个响应时间序列中的每个响应时间输入到预先建立的cart回归树中,以得到每个响应时间对应的特征值,该调用链中每个服务调用序列对应的每个响应时间序列对应的所有特征值构成了该服务调用序列对应的特征值序列,即该服务调用序列对应的路径向量集合。(2)将步骤(1)得到的每个服务调用序列输入到预先训练好的检测模型中,以得到该服务调用序列对应的路径向量集合中各个特征值的概率分布。(3)根据步骤(2)中检测模型输出的服务特征值的概率分布,获取路径向量中服务实际特征值的概率作为服务的异常得分。(4)根据步骤(3)得到的服务的异常得分判断服务是否是调用链中出现性能异常的服务。2.根据权利要求1所述的基于transformer的微服务性能异常检测方法,其特征在于,cart回归树是通过以下步骤得到:(1-1)获取一个服务的多个响应时间,按照大小升序对服务的响应时间排序,以得到有序变量集合d。d={(x1,y1),(x2,y2),(x3,y3),
…
,(x
n
,y
n
)}其中x
i
表示服务的第i个响应时间在有序变量集合中的位置,y
i
表示服务的第i个响应时间的数值,且有i∈[1,n],其中n表示服务的响应时间的总数。(1-2)遍历步骤(1-1)得到的有序变量集合d中服务的第i个响应时间在有序变量集合中的位置x
i
和服务的第i+1个响应时间在有序变量集合中的位置x
i+1
之间的切分点s
i
,即计算每个切分点s
i
划分的两部分的误差平方和m(s
i
)。选择使误差平方和m(s)最小的s作为最优的切分点s
j
,以s
j
为切分点将有序变量集合d划分为左子集(y1,y2,
…
,y
j
)和右子集(y
j+1
,y
j+2
,
…
,y
n
)。(1-3)针对步骤(1-2)中以最优切分点s
j
切分集合得到的左子集和右子集而言,通过设置比例因子,并不断重复上述步骤(1-2),即不断以递归的方式对这两个子集进行划分,直到满足划分停止条件为止,进而获取得到的左子集(y1,y2,
…
,y
j
)和右子集(y
j+1
,y
j+2
,
…
,y
n
)的平均方差作为该比例因子对应的平均方差。(1-4)不断以递归的方式增加比例因子,并重复上述步骤(1-3),从而得到多个比例因子对应的平均方差;(1-5)从步骤(1-3)和(1-4)得到的多个平均方差中选择最小平均方差对应的比例因子以及左子集和右子集,并得到具有m个子树的决策树,分别用y1,y2,
…
,y
m
表示,其中y
i
={y
i
|y
s
≤y
i
<y
s+1
},计算每个子树的均值c
i
作为每个子树的输出。3.根据权利要求1或2所述的基于transformer的微服务性能异常检测方法,其特征在于,步骤(1-2)中获取切分点s
i
对应的误差平方和m(s
i
)是采用以下公式:
其中r1={x1,x2,
…
,x
i
},r2={x
i+1
,x
i+2
,
…
x
n
},c1和c2分别为左子集(y1,y2,
…
,y
j
)和右子集(y
j+1
,y
j+2
,
…
,y
n
)的平均值;步骤(1-5)是采用以下公式:其中nm表示子树y
m
的元素个数。4.根据权利要求1至3中任意一项所述的基于transformer的微服务性能异常检测方法,其特征在于,检测模型是transfomer模型,其包括依次连接的词嵌入层、位置编码层、编码器-解码器层和输出层,具体结构如下:第一层是词嵌入层,输入是一个c维的整数向量(其中c代表输入序列的长度),每个整数代表输入序列中一个单词的索引,利用一个大小为v
×
d
model
(其中v为自然数,其大小和数据集中的服务和服务的特征值数量有关,服务数越多,则v的取值越大,d
model
为常数,通常取64)的嵌入矩阵将每个索引映射为一个d
model
维的词向量,输出由c个d
model
维词向量组成的c
×
d
model
的词向量。第二层为位置编码层,其输入为第一层得到的c
×
d
model
的词向量,使用正弦和余弦位置编码方式为每个d
model
维的词向量计算一个d
model
维的向量作为其位置编码向量,并将词向量和位置编码向量相加,输出一个c
×
d
model
维向量。第三层为编码器-解码器层,其输入为第二层得到的c
×
d
model
维向量,对其进行矩阵变换和计算,输出c
×
v维向量。第四层为输出层,其输入为第三层得到的c
×
v维向量,利用一个全连接层和softmax层对其进行线性变换和归一化处理,输出为一个c
×
v的向量。5.根据权利要求4所述的基于transformer的微服务性能异常检测方法,其特征在于,检测模型是通过以下步骤训练得到的:(2-1)获取微服务系统的跨度日志,对跨度日志进行预处理,以得到服务调用序列[op1,op2,
…
,op
a
]和路径向量集合[d1,d2,
…
,d
a
]组成的训练集。(2-2)针对步骤(2-1)得到的训练集中的服务调用序列[op1,op2,
…
,op
a
](其中op
i
由服务名和服务操作名组成)和路径向量集合[d1,d2,
…
,d
a
],使用一个大小为v
×
d
model
(其中v为自然数,其大小和数据集中的不同的服务数量有关,服务数越多,则v的取值越大,d
model
为常数,通常取64)的嵌入矩阵分别将服务调用序列和路径向量集合中的每个元素映射成词向量,分别用于表示服务的语义信息和特征信息,使用正弦和余弦位置编码为每个元素的词向量进行d
model
维的位置编码,并将每个元素对应的位置编码和词向量相加以得到该元素对应的求和结果,服务调用序列和路径向量集合中所有元素对应的求和结果分别构成transformer模型中编码器-解码器层的输入向量集合[s1,s2,
…
,s
a
]和[t1,t2,
…
,t
a
]。(2-3)将步骤(2-2)得到的输入向量集合[s1,s2,
…
,s
a
]输入transformer模型的编码器中,以利用自注意力机制获取输入向量集合的特征矩阵y。(2-4)将步骤(2-2)得到的向量[t1,t2,
…
,t
n
]输入到transformer模型解码器中,以利
用带掩码的自注意力机制获取特征矩阵z。(2-5)将步骤(2-3)计算得到的特征矩阵y作为k和v矩阵,将步骤(2-4)计算得到特征矩阵z作为q矩阵,将q、k、v矩阵输入检测模型的解码器中的编码器-解码器注意力模块中,以获取新的特征矩阵f。将新的特征矩阵f输入激活函数为softmax的全连接层网络,以得到模型预测的服务特征值的概率分布。(2-6)根据步骤(2-5)得到的模型预测的服务特征值概率分布、并使用交叉熵损失函数对检测模型进行迭代训练,直到检测模型收敛为止,从而得到训练好的检测模型。6.根据权利要求5所述的基于transformer的微服务性能异常检测方法,其特征在于,步骤(2-2)中,对于服务调用序列和路径向量中给定位置pos和词向量中的维度i(其中i∈[1,a]),位置编码的计算如下:[1,a]),位置编码的计算如下:其中,pe
(pos,i)
表示位置pos的第i维的位置编码。d
model
表示嵌入向量的维度。7.根据权利要求6所述的基于transformer的微服务性能异常检测方法,其特征在于,步骤(2-3)具体为,首先,通过权重矩阵w
q
、w
k
和w
v
对输入向量集合中的每个输入向量s
i
进行线性变换,分别得到查询向量q、键向量k和值向量,在训练过程中,权重矩阵w
q
、w
k
和w
v
会不断更新;然后,利用查询向量和键向量计算输入向量s
i
的注意力分数
∝
i,j
。其中q1,q2,
…
,q
n
表示查询向量q中的元素,k1,k2,
…
,k
n
表示键向量k中的元素;由
∝
i,j
组成的注意力得分矩阵(attention score)代表了服务调用序列中不同服务之间的依赖程度。接下来,使用softmax函数对
∝
i,k
进行归一化得到
∝′
i,j
。
∝′
i,j
=softmax(
∝
i,1
,
∝
i,2
,
…
,
∝
i,n
)=exp(
∝
i,j
)/∑
t
exp(
∝
i,t
)其中t∈[1,n];随后,通过将value向量与归一化后的相关性分数进行加权和计算,以得到表征服务上下文的向量y
i
。其中v1,v2,
…
,v
n
表示值向量v中的元素;最后,使用一个两层的全连接网络ffn对所有向量y
1,
,y2,
…
,y
n
进行非线性变换,最终得到服务调用序列经过编码器处理后的特征矩阵y。
8.根据权利要求7所述的基于transformer的微服务性能异常检测方法,其特征在于,步骤(2-6)中的交叉熵损失函数l为:其中,t
y
表示目标序列的长度,y
t,i
表示目标序列t
y
在时间步t时,第i个特征值的one-hot表示,表示检测模型在时间步t时,预测的第i个特征值的概率值。9.根据权利要求1所述的基于transformer的微服务性能异常检测方法,其特征在于,步骤(4)首先是获取步骤(3)得到的该服务调用序列对应服务的异常得分并记录下来,在初始检测系统的性能异常时,针对所有服务的异常得分设置固定的阈值th来判断服务是否异常,即当服务的异常得分小于0.6时,则判定该服务是调用链中出现性能异常的服务。在之后的检测过程中,首先根据记录的该服务历史异常得分获取该服务历史异常得分的累计分布函数cdf,然后根据该服务当前异常得分和累计分布函数计算累计分布值,如果累计分布值小于预设阈值,则判定该服务是调用链中出现性能异常的服务。10.一种基于transformer的微服务性能异常检测系统,其特征在于,包括以下步骤:第一模块,用于获取微服务系统的跨度日志,使用python将跨度日志中具有相同跟踪id的跨度组合在一起,以得到多条不同的调用链,针对每条调用链而言,使用深度优先搜索算法搜索该调用链从根节点到叶子节点的所有路径,以得到该调用链中的多个服务调用序列及其对应的多个响应时间序列,将得到的每个服务调用序列对应的每个响应时间序列中的每个响应时间输入到预先建立的cart回归树中,以得到每个响应时间对应的特征值,该调用链中每个服务调用序列对应的每个响应时间序列对应的所有特征值构成了该服务调用序列对应的特征值序列,即该服务调用序列对应的路径向量集合。第二模块,用于将第一模块得到的每个服务调用序列输入到预先训练好的检测模型中,以得到该服务调用序列对应的路径向量集合中各个特征值的概率分布。第三模块,用于根据第二模块中检测模型输出的服务特征值的概率分布,获取路径向量中服务实际特征值的概率作为服务的异常得分。第四模块,用于根据第三模块得到的服务的异常得分判断服务是否是调用链中出现性能异常的服务。
技术总结
本发明公开了一种基于Transformer的微服务性能异常检测方法,包括:获取微服务系统的跨度日志,将跨度日志中具有相同跟踪ID的跨度组合在一起,以得到多条不同的调用链,使用深度优先搜索算法搜索该调用链从根节点到叶子节点的所有路径,以得到该调用链中的多个服务调用序列及其对应的多个响应时间序列,将每个服务调用序列输入到预先训练好的检测模型中,以得到该服务调用序列对应的路径向量集合中各个特征值的概率分布,根据检测模型输出的服务特征值的概率分布,获取路径向量中服务实际特征值的概率作为服务的异常得分,根据服务的异常得分判断服务是否是调用链中出现性能异常的服务。本发明能够解决现有方法模型的收敛速度和检测效果不佳的技术问题。速度和检测效果不佳的技术问题。速度和检测效果不佳的技术问题。
技术研发人员:周可 李春花 方浩天
受保护的技术使用者:华中科技大学
技术研发日:2023.06.25
技术公布日:2023/9/20
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/