微服务系统运行时环境具有高度的复杂性和动态性,由此带来的各种问题导致微服务系统常常出现各种故障。为了尽早发现故障,快速准确的异常检测方法成为保证微服务系统可靠性的重要手段。为了提高微服务系统异常检测的准确率,复旦大学CodeWisdom团队提出一种基于图神经网络的微服务系统调用链和日志融合异常检测方法。该方法通过统一的图模型建模调用链及其相关日志的复杂关系,并使用图神经网络和Deep SVDD训练异常检测模型。基于该研究的论文“DeepTraLog: Trace-Log Combined Microservice Anomaly Detection through Graph-based Deep Learning” 发表于软件工程领域顶级国际会议ICSE 2022中。

论文作者包括复旦大学的张晨曦、彭鑫、沙朝锋、张可、傅震卿、吴茜雅,微软亚洲研究院的林庆维、张冬梅。

论文链接地址:https://cspengxin.github.io/publications/icse22-DeepTraLog.pdf

调用链与日志

微服务架构已成为云原生的重要组成部分。微服务架构将应用程序分解为一组细粒度的服务,每个服务可以独立开发、独立部署、独立扩缩容。工业微服务系统往往包含数百至数千个微服务,每个微服务又有多个动态变化的服务实例。这使得微服务系统运行时环境具有高度的复杂性和动态性。为了观察微服务系统的运行状况、及时发现及定位系统运行时问题,可观测性技术在微服务系统得到了广泛应用。现有的可观测性技术专注于指标(Metrics)、日志(Logging)和调用链(Tracing)三种数据。其中日志、调用链作为反应软件细粒度执行行为的两种数据,大部分运维人员都会通过这两种数据分析系统故障。

图1 调用链与日志

日志是由软件中的日志打印语句产生的半结构化数据,记录了软件执行时产生的离散事件。调用链描述了由外部请求触发的服务调用行为,一般由分布式追踪系统采集,每个调用链由一组span组成,每个span记录一次服务调用的相关信息。在传统的单体软件中,软件处理请求时会以日志序列的形式记录所有执行时产生日志。而微服务系统中每个服务会单独记录日志,且因为异步/多线程调用的广泛存在,分散在不同服务中的日志难以通过简单的时间关系进行关联。图1中给出了由一个请求产生的调用链和日志的示例。可以看出每个span分别记录了其执行期间产生的日志。

为了关联调用链和其相关的日志,许多分布式追踪系统都支持通过在日志中打印traceId和spanId将调用链和日志关联。运维人员可以通过搜索traceId和spanId的方式关联分析调用链和日志,但这种方式仍需要运维人员人工操作。而工业系统中每天会产生海量的调用链和日志,仅依靠人工分析是不现实的,如何自动化的进行调用链和日志关联分析对微服务系统是十分重要的。

调用链与日志融合异常检测方法

为了实现自动化的调用链和日志融合异常检测,我们提出了DeepTraLog。图2给出了DeepTraLog的总体框架,其主要有六个步骤:日志解析、调用链解析、事件向量化、调用链事件关系图构建、异常检测模型训练和在线异常检测。

图2 DeepTraLog方法流程

日志解析步骤将原始日志数据解析为日志模板,并使用日志模板代表不同的日志事件。同时保存每条日志对应的时间戳、traceId和spanId。

调用链解析步骤将原始调用链数据解析为不同类型的调用事件,并用“事件类型+操作名称”的方式代表每个span事件,并记录每个事件发生的时间。我们根据调用类型对原始调用链中的每个span进行解析。同步调用被解析为四个事件:客户端发出请求、服务端收到请求、服务端发出响应,客户端收到响应。异步调用被解析为两个事件:生产者生产消息、消费者消费消息。

事件向量化步骤将解析得到的日志事件和span事件转换为向量表示。我们将每个事件视为一个由英文单词组成的句子,并使用预训练的GloVe模型对每个单词进行向量化,然后使用TF-IDF计算得到每个事件的最终向量表示。

调用链事件关系图构建步骤根据不同span间的父子关系和事件发生时间关联日志和调用链事件,从而描述一个请求在微服务系统中的执行流程。我们首先根据发生时间将每个span对应的日志事件分别排序,为每个span生成一个日志序列。然后将属于该span的所有调用事件根据时间插入对应的日志序列中,最后根据调用事件的父子关系连接不同的span。图3给出了一个调用链事件关系图的示例,图中所示的调用链包含6个span,不同span之间通过同步/异步调用关系相连。

图3 调用链事件关系图示例

异常检测模型训练步骤训练了一个基于GGNN的Deep SVDD模型。Deep SVDD是一种单分类异常检测方法,该方法不需要每个训练样本的标签,而只需要保证绝大部分样本是正常样本,并通过学习一个超球体来描述正常数据的行为。对于调用链异常检测,我们可以很容易的收集到大量系统正常运行产生的数据并用来训练模型,使用该方法可以有效降低数据打标的开销。

在线异常检测步骤将训练完成的模型部署在系统中,每当有新调用链产生,我们依次执行前四个步骤,并将调用链事件关系图输入模型,若获得的图向量位于模型学习获得的超球体以外,则判断该调用链为异常。

实验评估

基于开源微服务基准系统TrainTicket,我们评估了DeepTraLog的有效性和效率。

有效性

表1 异常检测的准确率和召回率

表1中展示了DeepTralog与多个已有的调用链/日志异常检测方法在实验中获得的准确率、召回率和F1分数。可以看出DeepTraLog获得了较高的准确率(0.930)、召回率(0.978)和F1分数(0.954),优于其他方法。

图4 t-SNE降维后的调用链表示

为了说明使用图模型建模调用链及其相关日志之间关系的必要性,我们设计了一个变体模型GRU-based Deep SVDD,该模型将一个调用链中的所有事件根据发生时间排序,并基于该序列训练Deep SVDD模型。图4中给出了使用DeepTraLog和GRU-based Deep SVDD模型对测试集数据进行表示后使用t-SNE进行降维可视化的结果。可以看出,DeepTraLog可以学习到一个更好的超球体来描述正常的调用链行为。

效率

表2 模型训练和测试消耗的时间

表2中展示了DeepTralog与多个已有的调用链/日志异常检测方法在实验中花费的训练时间和测试时间。可以看出,DeepTraLog训练时间略慢于已有的调用链异常检测方法,但快于已有的日志异常检测方法,且具有最快的测试速度。

图5 响应时间随调用链时间数量变化

图5展示了不同方法处理不同大小的调用链所需的时间。可以看出DeepTraLog在调用链包含的事件数量大于100时处理速度明显快于基于序列的方法。在工业系统中,单个调用链经常包含超过几十到几百个事件,这说明基于图的表示方法可以加快线上异常检测的速度。

结束语

微服务架构的广泛应用给系统运维带来了新的挑战。通过可观测性数据发现系统异常、定位故障根因、理解系统行问成为了运维人员的广泛需求。其中如何关联分析不同的可观测性数据困扰着运维人员。DeepTraLog提出了一种调用链和日志数据关联方法,可以有效描述调用链和日志的复杂关系,基于图神经网络的异常检测方法也可以有效提升微服务异常检测的准确率。我们相信DeepTraLog提出的调用链和日志关联方法也可以应用于系统行为理解、故障根因定位等问题,为微服务系统分析提供了可能的途径。(张晨曦、彭鑫

声明:本文来自CodeWisdom,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。