一种基于调用链的微服务异常检测方法转让专利

申请号 : CN202211165473.8

文献号 : CN115269357B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘发贵陈健

申请人 : 华南理工大学

摘要 :

本发明公开了一种基于调用链的微服务异常检测方法。所述方法包括以下步骤:对调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行预处理;对预处理后的数据进行分类处理;使用基于密度的聚类算法对每一类数据进行降噪处理,得到异常检测模型训练所需要的数据集;使用训练好的基于图神经网络的异常检测模型对实时保存的数据样本进行异常检测,得到每一个数据样本的异常概率;设置异常概率阈值,根据数据样本的异常概率判断该数据样本是否为异常数据样本得到异常检测的结果。本发明能够同时发现服务质量异常和资源使用异常,且具有不依赖于标签数据、扩展性强、性能优的优点。

权利要求 :

1.一种基于调用链的微服务异常检测方法,其特征在于,包括以下步骤:

S1、对调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行预处理;所述调用链中所有微服务的响应时间指利用分布式链路追踪系统收集到的span数据中每个微服务对于用户请求的响应时间,若存在多个span数据的调用微服务与被调用微服务相同,则该微服务的响应时间为多个相同span数据的平均值;

所述微服务所在容器的性能指标包括微服务运行所在容器的CPU使用率、内存使用率、磁盘使用率和网络使用率;所述预处理包括缺失值处理、归一化处理和数据格式转换处理;

所述缺失值处理指对于容器的性能指标而言,间隔的缺失值即性能指标的某行或某列的连续缺失值不超过5个,采用最近的12个非缺失值进行线性插值补全修复;

所述归一化处理指对经过缺失值处理后的调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行归一化,让其分布在[0,1];

所述数据格式转换处理指根据分布式链路系统收集到的span数据中的父span与子span之间的调用关系,构建服务调用拓扑图,再根据数据的时间戳以及微服务与容器的对应关系构建成属性图,属性图包括一个邻接矩阵A和一个特征矩阵X,其中所述邻接矩阵表示一次用户请求的微服务请求路径,也就是服务调用拓扑图;特征矩阵表示一次用户请求中所有微服务的一系列特征,包括微服务自身的响应时间以及对应span时间戳时刻所处容器的性能指标;

S2、根据每条调用链中拥有的微服务种类对预处理后的数据进行分类处理;预处理后的数据样本,依据每个数据样本所包括的微服务种类生成0‑1编码,即一次用户请求中访问的微服务标记为1,未访问的微服务标记为0,利用K‑Means++聚类算法对于所有数据样本的

0‑1编码进行聚类,得到多个聚类簇,基于同一种业务的所有用户请求路径相似的假设,每一个数据样本的类别代表整个微服务系统所提供的一种业务类型;对于每一个数据样本的类别自适应地去除没有访问的微服务节点及其对应特征,以降低计算复杂度,加快模型训练和检测速度;使用K‑Means++聚类算法将预处理后的属性图数据进行聚类;K‑Means是经典的聚类算法之一,其核心思想是随机选取第一个聚类中心,在选取第i个聚类中心时,距离前i‑1个聚类中心越远的点被选中的概率就越高,其中i>1;K‑Means++聚类过程中样本和聚类中心点的距离、样本点P被选中为聚类中心的概率p(x)的计算分别如公式(1)和公式(2)所示:其中m是数据样本的维度,x代表样本点P,bi是聚类中心B的第i维数据样本;P(x)为样本点P被选中为聚类中心的概率,V为样本集;

S3、使用基于密度的聚类算法对每一类数据进行降噪处理,得到异常检测模型训练所需要的数据集;

S4、使用训练好的基于图神经网络的异常检测模型对实时保存的数据样本进行异常检测,得到每一个数据样本的异常概率;基于图神经网络的异常检测模型包括图变分自编码器和基于LSTM自编码器两个部分,图变分自编码器的目的是为了提取数据样本的拓扑特征,并检测是否存在拓扑结构异常,而LSTM自编码器的目的是为了学习数据样本在时间维度上的特征,并检测是否存在微服务相关特征异常;

通过设置两个超参数α和β将两部分的损失值进行线性加和得到异常检测模型最终的损失值Ltotal,并以此作为异常得分,损失值越大的样本是异常样本的概率越高,计算公式如下:Ltotal=α*LVGAE+β*LLSTM‑AE    (3)

其中,α和β两个超参数根据图变分自编码器的损失值LVGAE和基于LSTM自编码器的损失值LLSTM‑AE之间的数量级差值来确定,初始设定为α∶β=1∶150;

基于图神经网络的异常检测模型中的图变分自编码器部分包括编码器和解码器,编码器的目的是充分提取拓扑特征,并将拓扑特征映射到隐空间中,而解码器的目的是通过对提取的拓扑特征解码,重构输入数据样本的拓扑结构;

图变分自编码器的输入数据样本为Tset={t1,t2,...,tn}|,其中ti代表一次用户请求经过数据预处理得到的属性图,按照用户请求的时间顺序排序,i=1~n,n表示输入序列Tset的长度,输入序列Tset是基于请求时间排序;根据属性图的组成,Tset可以分为和其中ai和xi分别代表对应ti的邻接矩阵和特征矩阵,m表示属性图的节点数,即微服务种类数,f表示属性图的特征维度;

图变分自编码器是为图结构数据设计的,整体结构基于变分自动编码器,图变分自编码器使用两层的图卷积层作为编码器部分,将预处理得到属性图的邻接矩阵和属性矩阵编码到隐藏层Z1中;图变分自编码器的定义如下:Z1=μ+ε*σ    (6)

其中,W1和W2分别代表第一层GCNh1和第二层GCNh2的权重矩阵;X代表输入的特征矩阵,使用ReLU作为第一层GCNh1输出的激活函数,μ和σ是第二层GCNh2的输出值,分别代表近似后验的平均值和标准偏差,ε表示一个取样于正态分布N(0,1)的随机变量, 代表对称归一化的邻接矩阵,归一化公式如下:其中,A代表输入序列Tset中输入数据样本的邻接矩阵,D代表邻接矩阵对应的度矩阵;

通过两层的GCN进一步提取节点的拓扑特征,得到更为准确的微服务节点表示,考虑到不同邻居节点对于节点自身的影响不同,采用图注意力机制对所有微服务的特征表示赋予不同的权重,计算公式如下:其中,ejn表示第j个微服务的隐藏状态vj和第n个微服务的隐藏状态vn的相关系数,可以通过神经网络来学习ejn,其中W和 是需要学习的权重参数,K代表节点所拥有的邻接节点数量,最后使用Softmax归一化得到归一化权重ajn,再对编码器的隐藏层的状态进行加权求和并通过非线性激活函数sigmoid函数得到每个微服务最终的编码向量gj:解码器部分采用内积的方式对编码得到的隐藏层Z1进行解码,输出重建后的邻接矩阵具体如下:

图变分自编码器的损失函数与VAE相同,通过计算重建误差与正则化项之和得到图变分自编码器的损失值LVGAE;重建误差即计算属性图的邻接矩阵A与图变分自编码器重构得到的邻接矩阵 之间的交叉熵;正则化项即用于测量一般正态分布与标准正态分布差异的KL距离;

基于图神经网络的异常检测模型中的LSTM自编码器部分包括编码器和解码器,其中编码器部分采用多层的堆叠LSTM神经网络来实现,目的是充分提取微服务特征数据的时序特征,具体如下:LSTM自编码器的编码器的LSTM单元的状态传递时需要同时考虑到前一个LSTM单元的隐层状态和上一层LSTM单元的隐层状态,即:其中,Xt代表LSTM自编码器(LSTM‑AE)的输入特征矩阵,按照时间顺序排序,T代表LSTM自编码器的时间步参数,t=1~T,为了充分考虑微服务的特征属性存在拓扑结构上的相关依赖,这里使用VGAE编码器的第一层图注意力卷积层的输出代替原始属性图的特征矩阵,和 分别代表第k层,t‑1时刻的记忆单元状态和隐藏层状态,L表示多层的堆叠LSTM神经网络的层数;

经过多层的堆叠LSTM神经网络的特征提取,最终得到每个时刻的隐藏层向量分别为以最后一层的最后一个时刻的记忆单元状态和隐藏层状态作为编码得到的特征Z2;

解码器部分采用单层LSTM神经网络来实现,基于单层LSTM对编码得到的特征Z2进行解码,输出重建后的特征矩阵解码器的LSTM的状态更新如下:

其中St‑1表示前一时刻的隐藏层状态,Y′t‑1表示解码器对于t‑1时刻的输出结果,St‑1由(ht‑1,ct‑1)构成,Z2表示编码器输出的编码向量;解码器的第一个时刻使用编码向量Z2来初始化隐藏层的状态和记忆单元的状态,输入为0;通过计算重构得到的属性图特征矩阵和原始特征矩阵Xt之间的均方差得到LSTM自编码器的损失值LLSTM‑AE;

S5、设置异常概率阈值,根据数据样本的异常概率判断该数据样本是否为异常数据样本,大于异常概率阈值的被认为是异常数据样本,反之则是正常数据样本,得到异常检测的结果。

2.根据权利要求1所述的一种基于调用链的微服务异常检测方法,其特征在于,步骤S3中,考虑到训练集中可能存在的噪声,对于每一个聚类簇中的数据样本,进一步的采用基于密度的聚类算法DBSCAN进行降噪处理,具体实施步骤如下:将属性图中的特征矩阵X展开为一维向量(1,N*F),其中N表示微服务种类数,F表示微服务特征维度;基于同一种服务中所有正常请求的特征都相似的假设,采用基于密度的聚类算法提取出每一类服务的正常特征模,即将S2中分好类的训练数据集输入到基于密度的聚类算法中,只选择聚类结果中样本数量最多的一个簇作为异常检测模型训练所需要的数据集,降低异常样本对模型训练的影响。

3.根据权利要求1所述的一种基于调用链的微服务异常检测方法,其特征在于,步骤S5中,根据训练好的基于图神经网络异常检测模型对收集并存储到的微服务数据样本进行异常检测,得到每个数据样本的异常概率,并且设定异常概率的阈值为模型历史训练损失的均值与三倍标准差之和,大于阈值则判定为异常数据样本,否则为正常数据样本。

说明书 :

一种基于调用链的微服务异常检测方法

技术领域

[0001] 本发明属于计算机应用技术领域,尤其涉及一种基于调用链的微服务异常检测方法。

背景技术

[0002] 微服务架构除了拥有动态扩展和独立部署的特点之外,还支持使用不同种类的编程语言,这使得微服务架构成为越来越多的电子商务网站部署其应用的最佳解决方案。例如京东在50万个容器的集群上提供了超过8000个应用和约34000个微服务,每天支持超过2500亿次基于RPC的微服务调用。对于用户来说,希望应用的响应时间越短越好,如果微服务系统出现错误,会给企业带来不可预知的经济损失。研究指出(O. Ibidunmoye, F. Hern´andez‑Rodriguez, and E. Elmroth, “Performance anomaly detection and bottleneck identification,” ACM Computing Surveys(CSUR), vol. 48, no. 1, pp. 
1–35, 2015.),当用户请求的响应时间增加100ms时,电商网站的营业额就会下降1%,因此研究如何确保微服务系统的高可用性是十分重要的。
[0003] 随着云计算的快速发展,微服务系统变得越来越庞大,微服务之间的依赖关系也变得错综复杂,业务需求更新迭代快使得传统静态的异常检测方法无法适用,迫切需要一种灵敏且适用范围广的微服务异常检测方法,来快速发现系统中存在的故障或潜在异常,保障微服务系统的可靠性和性能。
[0004] 针对微服务异常检测的工作,目前研究学者已经提出了众多方法,中国专利文献CN113467421A“获取微服务健康状态指标的方法和微服务异常诊断方法”提出利用微服务所处物理机的硬件状态数据以及微服务的健康状态进行异常检测,该方法不适用于微服务部署在当下流行的虚拟化容器上的云环境场景,云环境复杂且变化多样,难以从物理机层面对微服务进行异常预测。中国专利文献CN109933452B“一种面向异常传播的微服务智能监测方法”提出通过使用代理的方式对微服务的调用进行监控,使用Lasso回归对所检测的度量值进行预测,大于设定阈值的则判定为异常,但该方法没有考虑到微服务所处环境带来的可能影响,无法发现微服务系统中潜在的性能影响因素。因此,如何构造适合分布式部署环境下微服务异常检测的方法仍旧是云计算智能运维的一项挑战。

发明内容

[0005] 本发明的目的在于克服上述现有技术的不足,提供一种基于调用链的微服务异常检测方法,用属性图的形式融合微服务本身以及微服务所处环境的特征,通过图神经网络等模型对微服务系统状态进行评估,从而实现异常检测,及时降低或避免异常问题带来的损失。
[0006] 本发明的目的至少通过如下技术方案之一实现。
[0007] 一种基于调用链的微服务异常检测方法,包括以下步骤:
[0008] S1、对调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行预处理;
[0009] S2、根据每条调用链中拥有的微服务种类对预处理后的数据进行分类处理;
[0010] S3、使用基于密度的聚类算法对每一类数据进行降噪处理,得到异常检测模型训练所需要的数据集;
[0011] S4、使用训练好的基于图神经网络的异常检测模型对实时保存的数据样本进行异常检测,得到每一个数据样本的异常概率;
[0012] S5、设置异常概率阈值,根据数据样本的异常概率判断该数据样本是否为异常数据样本,大于异常概率阈值的被认为是异常数据样本,反之则是正常数据样本,得到异常检测的结果。
[0013] 进一步地,步骤S1中,所述调用链中所有微服务的响应时间指利用分布式链路追踪系统收集到的span数据中每个微服务对于用户请求的响应时间,若存在多个span数据的调用微服务与被调用微服务相同,则该微服务的响应时间为多个相同span数据的平均值;
[0014] 所述微服务所在容器的性能指标包括微服务运行所在容器的CPU使用率、内存使用率、磁盘使用率和网络使用率。
[0015] 进一步地,所述预处理包括缺失值处理、归一化处理和数据格式转换处理;
[0016] 所述缺失值处理指对于容器的性能指标而言,间隔的缺失值即性能指标的某行或某列的连续缺失值不超过5个,采用最近的12个非缺失值进行线性插值补全修复;
[0017] 所述数据归一化处理指对经过缺失值处理后的调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行归一化,让其分布在 ;
[0018] 所述数据格式转换处理指根据分布式链路系统收集到的span数据中的父span与子span之间的调用关系,构建服务调用拓扑图,再根据数据的时间戳以及微服务与容器的对应关系构建成属性图,属性图包括一个邻接矩阵A和一个特征矩阵X,其中所述邻接矩阵表示一次用户请求的微服务请求路径,也就是服务调用拓扑图;特征矩阵表示一次用户请求中所有微服务的一系列特征,包括微服务自身的响应时间以及对应span时间戳时刻所处容器的性能指标。
[0019] 进一步地,步骤S2中,预处理后的数据样本,依据每个数据样本所包括的微服务种类生成0‑1编码,即一次用户请求中访问的微服务标记为1,未访问的微服务标记为0,利用K‑Means++聚类算法对于所有数据样本的0‑1编码进行聚类,得到多个聚类簇,基于同一种业务的所有用户请求路径相似的假设,每一个数据样本的类别代表整个微服务系统所提供的一种业务类型;对于每一个数据样本的类别自适应的去除没有访问的微服务节点及其对应特征,以降低计算复杂度,加快模型训练和检测速度。
[0020] 进一步地,使用K‑Means++聚类算法将预处理后的属性图数据进行聚类;K‑Means是经典的聚类算法之一,其核心思想是随机选取第一个聚类中心,在选取第 个聚类中心时,距离前 个聚类中心越远的点被选中的概率就越高,其中 ;K‑Means++聚类过程中样本和聚类中心点的距离、样本点 被选中为聚类中心的概率 的计算分别如公式(1)和公式(2)所示:
[0021] (1)
[0022]  (2)
[0023] 其中 是数据样本的维度, 和 分别是样本点 和聚类中心  的第 维数据样本。
[0024] 进一步地,步骤S3中,考虑到训练集中可能存在的噪声,对于每一个聚类簇中的数据样本,进一步的采用基于密度的聚类算法DBSCAN进行降噪处理,具体实施步骤如下:
[0025] 将属性图中的特征矩阵X展开为一维向量(1,N*F),其中N表示微服务种类数,F表示微服务特征维度;基于同一种服务中所有正常请求的特征都相似的假设,采用基于密度的聚类算法能够提取出每一类服务的正常特征模,即将S2中分好类的训练数据集输入到基于密度的聚类算法中,只选择聚类结果中样本数量最多的一个簇作为异常检测模型训练所需要的数据集,降低异常样本对模型训练的影响。
[0026] 进一步地,步骤S4中,基于图神经网络的异常检测模型包括图变分自编码器(VGAE)和基于LSTM自编码器(LSTM‑AE)两个部分,图变分自编码器的目的是为了提取数据样本的拓扑特征,并检测是否存在拓扑结构异常,而LSTM自编码器的目的是为了学习数据样本在时间维度上的特征,并检测是否存在微服务相关特征异常;
[0027] 通过设置两个超参数 和 将两部分的损失值进行线性加和得到异常检测模型最终的损失值 ,并以此作为异常得分,损失值越大的样本是异常样本的概率越高,计算公式如下:
[0028]  (3)
[0029] 其中, 和 两个超参数根据图变分自编码器(VGAE)的损失值 和基于LSTM自编码器(LSTM‑AE)的损失值 之间的数量级差值来确定,初始设定为: =1:150。
[0030] 进一步地,基于图神经网络的异常检测模型中的图变分自编码器(VGAE)部分包括编码器和解码器,编码器的目的是充分提取拓扑特征,并将拓扑特征映射到隐空间中,而解码器的目的是通过对提取的拓扑特征解码,重构输入数据样本的拓扑结构;
[0031] 图变分自编码器(VGAE)的输入数据样本为 其中代表一次用户请求经过数据预处理得到的属性图,按照用户请求的时间顺序排序,, 表示输入序列 的长度,输入序列 是基于请求时间排序;根据
属性图的组 成, 可以分 为 和
,其中 和 分别代表对应 的邻接矩阵和
特征矩阵, 表示属性图的节点数,即微服务种类数, 表示属性图的特征维度;
[0032] 图变分自编码器(VGAE)是为图结构数据设计的,整体结构基于变分自动编码器(VAE),图变分自编码器(VGAE)使用两层的图卷积层(GCN)作为编码器部分,将预处理得到属性图的邻接矩阵和属性矩阵编码到隐藏层 中;图变分自编码器(VGAE)的定义如下:
[0033] (4)
[0034] (5)
[0035]  (6)
[0036] 其中, 和 分别代表第一层GCN 和第二层GCN 的权重矩阵;X代表输入的特征矩阵,使用 作为第一层GCN输出的激活函数, 和 是第二层GCN 的输出值,分别代表近似后验的平均值和标准偏差,表示一个取样于正太分布 的随机变量, 代表对称归一化的邻接矩阵,归一化公式如下:
[0037] (7)
[0038] 其中, 代表输入序列 中输入数据样本的邻接矩阵, 代表邻接矩阵对应的度矩阵;通过两层的GCN进一步提取节点的拓扑特征,得到更为准确的微服务节点表示,考虑到不同邻居节点对于节点自身的影响不同,采用图注意力机制(Graph Attention)对所有微服务的特征表示赋予不同的权重,计算公式如下:
[0039]  (8)
[0040] (9)
[0041] 其中, 表示第 个微服务的隐藏状态 和第 个微服务的状态隐藏状态的相关系数,可以通过神经网络来学习 ,其中 和 是需要学习的权重参数,K代表节点所拥有的邻接节点数量,最后使用 归一化得到归一化权重 ,再对编码器的隐藏层的状态进行加权求和并通过非线性激活函数sigmoid函数得到每个微服务最终的编码向量 :
[0042] (10)
[0043] 解码器部分采用内积(innerproduct)的方式对编码得到的隐藏层 进行解码,输出重建后的邻接矩阵 ,具体如下:
[0044] (11)
[0045] 图变分自编码器(VGAE)的损失函数与VAE相同,通过计算重建误差与正则化项之和得到图变分自编码器(VGAE)的损失值 ;重建误差即计算属性图的邻接矩阵 与图变分自编码器(VGAE)重构得到的邻接矩阵 之间的交叉熵;正则化项即用于测量一般正态分布与标准正态分布差异的KL距离(Kullback–Leibler divergence)。
[0046] 进一步地,基于图神经网络的异常检测模型中的LSTM自编码器(LSTM‑AE)部分包括编码器和解码器,其中编码器部分采用多层的堆叠LSTM神经网络来实现,目的是充分提取微服务特征数据的时序特征,具体如下:
[0047] LSTM自编码器(LSTM‑AE)的编码器的LSTM单元的状态传递时需要同时考虑到前一个LSTM单元的隐层状态和上一层LSTM单元的隐层状态,即:
[0048]  (12)
[0049] 其中, 代表 LSTM自编码器(LSTM‑AE)的输入特征矩阵,按照时间顺序排序,T代表LSTM自编码器的时间步参数, ,为了充分考虑微服务的特征属性存在拓扑结构上的相关依赖,这里使用VGAE编码器的第一层图注意力卷积层的输出代替原始属性图的特征矩阵, 和 分别代表第 层,‑1时刻的记忆单元状态和隐藏层状态,表示多层的堆叠LSTM神经网络的层数;
[0050] 经过多层的堆叠LSTM神经网络的特征提取,最终得到每个时刻的隐藏层向量分别为 ,以最后一层的最后一个时刻的记忆单元状态和隐藏层状态 , 作为编码得到的特征 ;
[0051] 解码器部分采用单层LSTM神经网络来实现,基于单层LSTM对编码得到的特征进行解码,输出重建后的特征矩阵 ;
[0052] 解码器的LSTM的状态更新如下:
[0053]  (13)
[0054] 其中 表示前一时刻的隐藏层状态, 表示解码器对于t‑1时刻的输出结果, 由 构成, 表示编码器输出的编码向量;解码器的第一个时刻使用编码向量 来初始化隐藏层的状态和记忆单元的状态,输入为0;通过计算重构得到的属性图特征矩阵 和原始特征矩阵 之间的均方差(MSE)得到LSTM自编码器(LSTM‑AE)的损失值 。
[0055] 进一步地,步骤S5中,根据训练好的基于图神经网络异常检测模型对收集并存储到的微服务数据样本进行异常检测,得到每个数据样本的异常概率,并且设定异常概率的阈值为模型历史训练损失的均值与三倍标准差之和,大于阈值则判定为异常数据样本,否则为正常数据样本。
[0056] 与现有技术相比,本发明具有如下的优点与技术效果:
[0057] 1. 提供了一种在复杂云环境中不依赖于标签数据,能够处理不平衡数据的基于分布式链路跟踪的微服务异常检测方法。而常规的异常检测方法往往是有监督或半监督的,且难以处理不平衡的数据。
[0058] 2. 所提出的基于属性图表示的数据形式,融合了分布式链路追踪系统收集微服务本身调用相关信息,包括调用关系和响应时间等,以及收集微服务所处容器的系统运行指标,比如CPU、内存、网络等,能够较为全面的体现云环境下微服务的运行健康状态。
[0059] 3. 所提出的基于图神经网络的异常检测模型,其采用的基于K‑Means++和DBSCAN的预标注技术能够为异常检测提供更合理的输入,降低训练难度;其采用的VGAE和LSTM‑AE部分能够从不同角度(空间和时间)对原始数据进行异常检测,融合二者的检测结果使得异常检测模型整体具有高检测精度、适用范围广、鲁棒性强的特点。

附图说明

[0060] 图1为本发明方法的具体实施例中基于分布式链路跟踪的微服务异常检测方法示意图。
[0061] 图2 为本发明方法具体实施例中基于收集到的调用链数据生成微服务调用拓扑示意图。
[0062] 图3为本发明方法具体实施例中基于收集到的调用链数据和微服务所在容器性能指标数据转化成属性图示意图。
[0063] 图4为本发明方法具体实施例中基于图神经网络异常检测模型示意图。
[0064] 图5为本发明方法具体实施例中基于Kubernetes部署的微服务系统进行异常检测的流程示意图。
[0065] 图6为本发明方法具体实施例在TrainTicket上的实验结果。

具体实施方式

[0066] 为了使本发明的技术方案及优点更加清楚明白,以下结合附图,进行进一步的详细说明,但本发明的实施和保护不限于此。
[0067] 实施例1:
[0068] 一种基于调用链的微服务异常检测方法,如图1所示,包括以下步骤:
[0069] S1、对调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行预处理;
[0070] 所述调用链中所有微服务的响应时间指利用分布式链路追踪系统收集到的span数据中每个微服务对于用户请求的响应时间,每一次用户请求会生成一条调用链,每条调用链由多个span组成,每个span代表微服务之间的一次调用,包含调用方微服务也就是父span,被调用方微服务也就是子span,以及被调用方微服务的响应时间和名称,若存在多个span数据的调用微服务与被调用微服务相同,则该微服务的响应时间为多个相同span数据的平均值;
[0071] 所述微服务所在容器的性能指标包括微服务运行所在容器的CPU使用率、内存使用率、磁盘使用率和网络使用率。
[0072] 所述预处理包括缺失值处理、归一化处理和数据格式转换处理;
[0073] 所述缺失值处理指对于容器的性能指标而言,间隔的缺失值即性能指标的某行或某列的连续缺失值不超过5个,采用最近的12个非缺失值进行线性插值补全修复;
[0074] 所述数据归一化处理指对经过缺失值处理后的调用链中所有微服务的响应时间及对应微服务所在容器的性能指标进行归一化,让其分布在 ;
[0075] 所述数据格式转换处理指根据分布式链路系统收集到的span数据中的父span与子span之间的调用关系,构建服务调用拓扑图,再根据数据的时间戳以及微服务与容器的对应关系构建成属性图,属性图包括一个邻接矩阵A和一个特征矩阵X,其中所述邻接矩阵表示一次用户请求的微服务请求路径,也就是服务调用拓扑图;特征矩阵表示一次用户请求中所有微服务的一系列特征,包括微服务自身的响应时间以及对应span时间戳时刻所处容器的性能指标。
[0076] 图2为本实施例中根据每条调用链中的span信息构建用户请求的调用拓扑图,具体而言,如图2所示,根据分布式链路系统收集到的调用链表示一次用户请求所调用微服务之间的基本信息,其中每一行代表一个span(包括一次调用的调用方和被调用方以及调用和被调用方的时间戳),构建服务调用拓扑图并计算出每一次调用的响应时间(被调用方返回给调用方的时间戳减去被调用方收到调用方请求的时间戳);图3为本实施例中根据调用链和微服务所在容器的性能指标构建成属性图的过程,具体而言,如图3所示,将服务调用拓扑图转换成邻接矩阵的形式,再将用户请求所调用微服务对应容器的性能指标与分布式链路系统收集到调用微服务的响应时间按照时间戳对齐的方式进行组合,根据此方法将一次用户请求构建成属性图的形式,这种表示方式不仅能够反映出每个服务的服务级指标SLO(service‑levelobjective,例如响应时间),还能反映微服务系统实时的健康状态;属性图由一个邻接矩阵和一个特征矩阵构成,其中所述邻接矩阵表示一次用户请求的微服务请求路径,特征矩阵表示所调用微服务的一系列特征,包括一次用户请求中自身的响应时间和所处容器的性能指标。
[0077] S2、根据每条调用链中拥有的微服务种类对预处理后的数据进行分类处理;
[0078] 预处理后的数据样本,依据每个数据样本所包括的微服务种类生成0‑1编码,即一次用户请求中访问的微服务标记为1,未访问的微服务标记为0,例如,[0,1,0,1,1]表示此次用户请求访问了微服务系统中的二、四和五号微服务;
[0079] 利用K‑Means++聚类算法对于所有数据样本的0‑1编码进行聚类,得到多个聚类簇,基于同一种业务的所有用户请求路径相似的假设,每一个数据样本的类别代表整个微服务系统所提供的一种业务类型;对于每一个数据样本的类别自适应的去除没有访问的微服务节点及其对应特征,以降低计算复杂度,加快模型训练和检测速度。
[0080] 基于同一种业务的所有用户请求路径相似的假设,每一个类代表整个微服务系统所提供的一种业务类型,包含该业务所有可能访问到的微服务种类;对于所有需要进行异常检测的样本(测试集),计算每个样本与所有聚类簇的欧氏距离,将其归入欧氏距离最小的簇中进行异常检测;
[0081] 使用K‑Means++聚类算法将预处理后的属性图数据进行聚类;K‑Means是经典的聚类算法之一,其核心思想是随机选取第一个聚类中心,在选取第 个聚类中心时,距离前个聚类中心越远的点被选中的概率就越高,其中 ;K‑Means++聚类过程中样本和聚类中心点的距离、样本点 被选中为聚类中心的概率 的计算分别如公式(1)和公式(2)所示:
[0082] (1)
[0083]  (2)
[0084] 其中 是数据样本的维度, 和 分别是样本点 和聚类中心 的第 维数据样本。
[0085] S3、使用基于密度的聚类算法对每一类数据进行降噪处理,得到异常检测模型训练所需要的数据集;
[0086] 考虑到训练集中可能存在的噪声,对于每一个聚类簇中的数据样本,进一步的采用基于密度的聚类算法DBSCAN进行降噪处理,具体实施步骤如下:
[0087] 将属性图中的特征矩阵X展开为一维向量(1,N*F),其中N表示微服务种类数,F表示微服务特征维度;基于同一种服务中所有正常请求的特征都相似的假设,采用基于密度的聚类算法能够提取出每一类服务的正常特征模,即将S2中分好类的训练数据集输入到基于密度的聚类算法中,只选择聚类结果中样本数量最多的一个簇作为异常检测模型训练所需要的数据集,降低异常样本对模型训练的影响。
[0088] S4、使用训练好的基于图神经网络的异常检测模型对实时保存的数据样本进行异常检测,得到每一个数据样本的异常概率;
[0089] 如图4所示,基于图神经网络的异常检测模型包括图变分自编码器(VGAE)和基于LSTM自编码器(LSTM‑AE)两个部分,图变分自编码器的目的是为了提取数据样本的拓扑特征,并检测是否存在拓扑结构异常,而LSTM自编码器的目的是为了学习数据样本在时间维度上的特征,并检测是否存在微服务相关特征异常;
[0090] 通过设置两个超参数 和 将两部分的损失值进行线性加和得到异常检测模型最终的损失值 ,并以此作为异常得分,损失值越大的样本是异常样本的概率越高,计算公式如下:
[0091]  (3)
[0092] 其中, 和 两个超参数根据图变分自编码器(VGAE)的损失值 和基于LSTM自编码器(LSTM‑AE)的损失值 之间的数量级差值来确定,初始设定为: =1:150。
[0093] 基于图神经网络的异常检测模型中的图变分自编码器(VGAE)部分包括编码器和解码器,编码器的目的是充分提取拓扑特征,并将拓扑特征映射到隐空间中,而解码器的目的是通过对提取的拓扑特征解码,重构输入数据样本的拓扑结构;
[0094] 图变分自编码器(VGAE)的输入数据样本为 ,其中代表一次用户请求经过数据预处理得到的属性图,按照用户请求的时间顺序排序,, 表示输入序列 的长度,输入序列 是基于请求时间排序;根据
属性图的组成, 可以分为
,其中 和 分别代表对应 的邻接矩阵和
特征矩阵, 表示属性图的节点数,即微服务种类数, 表示属性图的特征维度;
[0095] 图变分自编码器(VGAE)是为图结构数据设计的,整体结构基于变分自动编码器(VAE),图变分自编码器(VGAE)使用两层的图卷积层(GCN)作为编码器部分,将预处理得到属性图的邻接矩阵和属性矩阵编码到隐藏层 中;图变分自编码器(VGAE)的定义如下:
[0096]   (4)
[0097] (5)
[0098] (6)
[0099] 其中, 和 分别代表第一层GCN 和第二层GCN 的权重矩阵;X代表输入的特征矩阵,使用 作为第一层GCN输出的激活函数, 和 是第二层GCN 的输出值,分别代表近似后验的平均值和标准偏差,表示一个取样于正太分布 的随机变量, 代表对称归一化的邻接矩阵,归一化公式如下:
[0100] (7)
[0101] 其中, 代表输入序列 中输入数据样本的邻接矩阵, 代表邻接矩阵对应的度矩阵;通过两层的GCN进一步提取节点的拓扑特征,得到更为准确的微服务节点表示,考虑到不同邻居节点对于节点自身的影响不同,采用图注意力机制(Graph Attention)对所有微服务的特征表示赋予不同的权重,计算公式如下:
[0102]  (8)
[0103] (9)
[0104] 其中, 表示第 个微服务的隐藏状态 和第 个微服务的状态隐藏状态的相关系数,可以通过神经网络来学习 ,其中 和 是需要学习的权重参数,K代表节点所拥有的邻接节点数量,最后使用 归一化得到归一化权重 ,再对编码器的隐藏层的状态进行加权求和并通过非线性激活函数sigmoid函数得到每个微服务最终的编码向量 :
[0105] (10)
[0106] 解码器部分采用内积(innerproduct)的方式对编码得到的隐藏层 进行解码,输出重建后的邻接矩阵 ,具体如下:
[0107] (11)
[0108] 图变分自编码器(VGAE)的损失函数与VAE相同,通过计算重建误差与正则化项之和得到图变分自编码器(VGAE)的损失值 ;重建误差即计算属性图的邻接矩阵与图变分自编码器(VGAE)重构得到的邻接矩阵 之间的交叉熵;正则化项即用于测量一般正态分布与标准正态分布差异的KL距离(Kullback–Leibler divergence)。
[0109] 基于图神经网络的异常检测模型中的LSTM自编码器(LSTM‑AE)部分包括编码器和解码器,其中编码器部分采用多层的堆叠LSTM神经网络来实现,目的是充分提取微服务特征数据的时序特征,具体如下:
[0110] LSTM自编码器(LSTM‑AE)的编码器的LSTM单元的状态传递时需要同时考虑到前一个LSTM单元的隐层状态和上一层LSTM单元的隐层状态,即:
[0111]  (12)
[0112] 其中, 代表 LSTM自编码器(LSTM‑AE)的输入特征矩阵,按照时间顺序排序,T代表LSTM自编码器的时间步参数, ,为了充分考虑微服务的特征属性存在拓扑结构上的相关依赖,这里使用VGAE编码器的第一层图注意力卷积层的输出代替原始属性图的特征矩阵, 和 分别代表第 层,‑1时刻的记忆单元状态和隐藏层状态,表示多层的堆叠LSTM神经网络的层数;
[0113] 经过多层的堆叠LSTM神经网络的特征提取,最终得到每个时刻的隐藏层向量分别为 ,以最后一层的最后一个时刻的记忆单元状态和隐藏层状态 , 作为编码得到的特征 ;
[0114] 解码器部分采用单层LSTM神经网络来实现,基于单层LSTM对编码得到的特征行解码,输出重建后的特征矩阵 ;
[0115] 解码器的LSTM的状态更新如下:
[0116]  (13)
[0117] 其中 表示前一时刻的隐藏层状态, 表示解码器对于t‑1时刻的输出结果, 由 构成, 表示编码器输出的编码向量;解码器的第一个时刻使用编码向量 来初始化隐藏层的状态和记忆单元的状态,输入为0;通过计算重构得到的属性图特征矩阵 和原始特征矩阵 之间的均方差(MSE)得到LSTM自编码器(LSTM‑AE)的损失值 。
[0118] 图5为本实施例中整体流程示意图,具体而言,如图5所示,将目标微服务系统利用Kubernetes部署在多台服务器上,每个容器运行一个微服务实例,通过cadvisor或轮询的方式读取/proc/stat收集微服务所在容器的性能指标,再通过部署分布式链路追踪系统(例如zipkin和jeager)收集微服务的服务级指标,将收集到的数据按步骤S1和S2处理成属性图的形式存储到数据库中(例如Prometheus或Neo4j等),再使用训练好的基于图神经网络的异常检测模型对实时保存的数据样本进行异常检测,得到每一个数据样本的异常概率,并根据结果给出响应的告警信息。
[0119] S5、设置异常概率阈值,根据数据样本的异常概率判断该数据样本是否为异常数据样本,大于异常概率阈值的被认为是异常数据样本,反之则是正常数据样本,得到异常检测的结果;
[0120] 根据训练好的基于图神经网络异常检测模型对收集并存储到的微服务数据样本进行异常检测,得到每个数据样本的异常概率,并且设定异常概率的阈值为模型历史训练损失的均值与三倍标准差之和,大于阈值则判定为异常数据样本,否则为正常数据样本。
[0121] 本实施例中,本发明在开源微服务框架Train Ticket上进行了实验。实验通过将微服务系统Train Ticket部署在拥有5台服务器的集群上,利用locust等工具模拟用户请求生成负载,再根据分布式链路追踪系统收集用户请求的相关信息,例如zipkin和skywalking等,以及微服务间的调用关系构建微服务调用关系图,同时,采集微服务所处容器的性能指标特征进行数据转换。使用K‑means++和DBSCAN聚类算法对预处理好的数据样本进行过滤选择,剔除大量存在噪声、无效的数据。选择后的数据样本以邻接矩阵和特征矩阵的形式作为基于图神经网络的异常检测模型输入,用于微服务的异常检测。然后计算异常检测模型中两部分的损失值并进行加权求和得到每个数据样本的异常概率,对比设定的阈值,来表明微服务系统是否存在异常情况。
[0122] 图6示出了本发明的一个实施例在Train Ticket上的实验结果,其中TraceGra表示本发明。实验结果表明,相比于现有方法,本发明的方法误判率更低,具有更高的诊断准确性,相比于TraceAnomaly将所有不同的span编码成向量的形式,造成调用链编码稀疏,需要巨大的时间开销,本发明通过对每一类属性图进行自适应去除孤立点的处理,能够显著降低模型的训练时间,且以属性图的形式表示调用链能更直观的体现异常的类型,节点属性维度可以根据实际应用场景进行自适应伸缩,具有良好的可扩展性。
[0123] 实施例2:
[0124] 相比于实施例1,本实施例在开源微服务系统Sock Shop上进行了实验。
[0125] 实施例3:
[0126] 相比于实施例1,本实施例在开源微服务系统TeaStore上进行了实验。
[0127] 实施例2和实施例3中,与TrainTicket火车订票系统功能不同,主要功能为网络商城购物,一个是售卖袜子,另一个是售卖茶叶。实验利用Locust模拟用户登录注册和在线购物的行为,通过zipkin收集所有用户请求的调用链数据,输入到异常检测模型中,实现了较好的异常检测精度。