论文标题 | TraceLingo: Trace representation and learning for performance issue diagnosis in cloud services
论文来源 | ICSE 2021
论文链接 | https://www.computer.org/csdl/proceedings-article/cloudintelligence/2021/456300a037/1wHKxtXXPrO
源码链接 | https://github.com/serina-hku/TraceLingo

TL;DR

对于服务间调用链 trace 异常检测任务,当前很多方法都忽略了 trace 的上下文特征和图结构特征,因此论文提出一种 trace 的表示学习模型 TraceLingo,采用 tree-based RNN 模型来捕捉不同 trace 中 span 的特征及其依赖关系,可以有效地进行性能诊断。实验部分非常简单只采用一个 case 说明 TraceLingo 的有效性。

Algorithm/Model

需要解决的问题是:给定告警时间和一定时间范围的 tracesT={T1,T2,,Tn}T=\left\{T_{1}, T_{2}, \ldots, T_{n}\right\} 序列,检测异常的 traces 集合ATAT 和故障 spans 集合AS={si}AS=\{s_i\}

论文中提出 TraceLingo 模型架构如下图所示

模型架构

第一步:首先使用 TreeLstm 来编码 span 特征,包含两类特征:

  • Contextual features:包含 span 名称、软硬件设置等。
  • Temporal features:包含 span 延迟、平均延迟和标准差延迟。

论文中使用 Child-Sum Tree-LSTM 来编码 span 特征,计算方式如下所示

cj=ijuj+l=1Nfjlcjlhj=ojtanh(cj)c_{j}=i_{j} \odot u_{j}+\sum_{l=1}^{N} f_{j l} \odot c_{j l} \\ h_{j}=o_{j} \odot \tanh \left(c_{j}\right)

Tree-LSTM 模型可以参考论文:【2019/ICSC】Improving tree-lstm with tree attention。这篇论文中根本没有讲清楚。

第二步:得到节点 span 编码特征HN×FH^{N\times F} 后,采用自注意机制来学习不同 spans 的权重ZRN×1Z\in R^{N\times 1}

Z=σ(HΘatt)Z=\sigma\left(H \Theta_{a t t}\right)

基于权重选择 top-k spans 来保留,论文中写的是保留kNkN 个 spans ,好像不太正确而是直接选择 top-k 。这样就算每个 trace 中 spans 数量不同也可以得到固定维度的特征 👏

第三步:由于是无监督的,所以得到每个 trace 的 embedding 后论文基于编码器来训练,以此获得更高层的 trace 特征表示,这一步比较简单就不再细述。

第四步:基于 trace 特征的异常检测和定位,这一步和想象的不一样,不是基于重构误差的。

论文中对训练的正常 trace 集合得到编码后的向量t1,,tkt_1,\cdots, t_k , 测试集中一条 trace 编码向量eje_j ,计算Skj=ϕ(tk,ej)S_{kj} = \phi(t_k, e_j) 间的余弦相似度。如果和所有正常 trace 间的余弦相似度平均值小于 0.5,那么 traceeje_j 就是异常 trace。

得到异常 trace 后,论文中根据第二步学习到的 span 注意力权重,选择 10% 的最高权重作为异常 span,以此来推荐根因。

Experiments

实验部分说明采用 10000 正常 trace 和异常后 1 小时内 4000 条 trace 作为训练和测试数据,其它就是讲了个故事没什么价值。

Thoughts

  • 这篇 workshop 短文整体想法与现在做的差不多,只是使用的模型不同。
  • 异常检测部分需要优化,可以基于模型直接异常检测,论文中基于特征再计算余弦相似度性能不太行。
  • 实验部分缺少对比实验,缺少说服力。

Contact