以Trace为核心的根因分析概述

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
阿里云盘企业版 CDE,企业版用户数5人 500GB空间
简介: 近期一直在学习和复现“根因分析”领域的相关文章,在这里跟大家一起分享下相关内容。这里不在赘述关于“可观测性”和“AIOps”的重要性和必要性,也不过多的陈述在“复杂系统”中进行快速根因诊断的必要性,直接进入到相关算法和系统设计部分。

上一篇文章《【论文调研】根因分析:Micro.X系列》主要是通过阅读以下两篇文章进行的实验流程梳理和相关方法的总结而得来。

  • 《MicroRCA: Root Cause Localization of Performance Issues in Microservices》
  • 《MicroDiag: Fine-grained Performance Diagnosis for Microservice Systems》

近期一直在学习和复现“根因分析”领域的相关文章,在这里跟大家一起分享下相关内容。这里不在赘述关于“可观测性”和“AIOps”的重要性和必要性,也不过多的陈述在“复杂系统”中进行快速根因诊断的必要性,直接进入到相关算法和系统设计部分。

在智能运维的体系中,用来分析和建模的数据可以笼统的分为:Log + Trace + Metric,这里面的数据量是巨大的,且数据形态是复杂多样,对于企业来说,不仅仅要考虑存储系统的吞吐、以及架构在存储系统之上计算引擎的灵活性,同时也会很关注成本。

基于Trace我们可以做些什么?

业务场景

  • 拓扑生成
  • 架构梳理
  • 各服务的流量估算
  • 系统的热点分析
  • 链路的性能分析
  • 错误的传播分析
  • 发布过程中,流量的灰度分析,发布质量的评估


各家根因分析系统(系统+算法)

EMonitor -> 基于Tracing和Metrics的诊断系统

该系统是来自阿里本地生活的故障诊断的分享,在特定场景中可以较好的解决如下问题:

  • 哪些入口受到了影响?
  • 受影响的入口的本地操作和远程操作的影响如何?
  • 受影响的入口都抛出了哪些异常?

在该系统中,无法准确(无法直接根据数据给出,需要推断)的解决如下问题:

  • GC问题
  • 容器问题
  • 变更导致的问题

该诊断系统的上层出发点是源自于观测的核心SLO指标的抖动,去分析是哪些聚合维度的指标的异常导致了当前的扰动,从而定位到需要进一步诊断的下层入口,通过如此反复的确认,得到最终的定位信息。这里提供一张特定的图(来自知乎上的发表过的图)。

通过上述图中的描述,我们可以看到饿了么团队可以完成如下几个能力:

  • 大量复杂的数据预处理,通过一定的手段将数据进行清洗后格式化(或者严格要求日志字段格式),较好的完成了Metrics、Logs、Trace的关联跳转;
  • 开发了特定的计算策略(OLAP侧或者本地服务侧)支持扰动分析,提供出探寻的候选集;
  • 在特定的业务场景中,支持多个服务模块之间的参数调用,得到较为完成的业务侧拓扑;

但是分析下来,里面必定特别多的定制化的操作和对于开发的严格日志结构的要求,且有较大的定制化开发需求,在云上快速拓展有一定的难度。


GMTA Explorer -> 基于Trace的监控和服务诊断

该系统是eBay建立并在企业中落地的诊断系统,这套系统可以解决eBay每天1500亿条Span数据,可以在一定程度上处理Trace数据中的断链和错链问题。这里最核心的概念在如下的图2中已经描述出来了,这里重新提取下:

  • BusinessFlow(业务流):最终是由业务方(使用方)来确定的;
  • Path:同一个业务在一段时间内的请求所构成的一个链路,最终是有多条Trace的路径合并出来的(业务请求在微服务系统中流经的节点所构成的Path)

数据流图+算法设计

在上图中,我们可以看到最核心的是要通过Flink计算出单条Trace的Path,然后通过一定的手段(聚类等)实现业务流的生成(Business Flow)。在数据处理的环节有几个重要的手段进行数据的处理:

  • 根据特定业务输入,完成一些无效操作名称的替换;
  • 根据标准的Trace定义,丢弃一些错误的数据,比如:根节点缺失、多个根节点等;
  • 同时要尽可能关联一些错误日志数据,叫做错误传播链(EP Chains, Error Propagation Trace);

下图较为清晰的描述了几个核心概念之间的关系。

这里我们可以简单说下,产生最终业务流的依赖的数据。根据文中的数据来说,在图数据存储中,时刻更新着当前系统中操作粒度的调用关系图,在分析型存储中按照一定的需求,存储着Path信息和业务流信息。

通过文中这个图,我们可以基本知道分析型存储中的基本结构,其中对于后续分析问题较为重要的两个核心属性是:PathID和BusinessFlowName,其中重中之重的属性值是PathID。那么,我们查看下原文中对于PathID的生成部分的描述。这里我们就要查看下文中的一个SpanHash的策略了。

span
 + serviceName
 + operationName
 + level
 + durations
 + statusCode
 + labels
 + childSpans[]Algorithm 1 SpanHash(span)
+ hash = HashCode(span.serviceName) + HashCode(span.operationName) + span.level * PrimeNumber
+ for each child in span.childSpans do
+     hash += SpanHash(child)
+ end for
+ return hash


这里面一个比较核心的问题在于:如何在海量的Trace数据中,以较小的成本去解决单个span在Trace链路中的level和childSpans的问题?(这个问题本质上将是:底层的存储和计算引擎的选型和问题,文中提到,在eBay中使用的是Neo4j+Druid+Flink进行存储和计算

还有一点值得称赞的是,该平台的完整度问题,在GMTA Explorer中,提供了很多基础能力,我们一起来看下。

基于上述能力,可以解决不同场景的业务问题

  • 作为开发人员,可视化业务流程中服务的依赖关系和依赖项,以确定服务的更改影响。
  • 作为架构师,学习与关键业务(例如支付)相关的路径和指标,以支持架构决策。
  • 作为 SRE,确认服务行为的变化或模式,并评估业务变化或其他因素对流量、延迟和错误率等指标的影响。

这里就提供下文中的实验例子,由于接口变更导致的服务指标的变化。

可以较为清晰的看到,上部分表达的是某个业务流中有三个核心链路,下面部分表示的是链路归并后的效果,我们可以很清晰的看到,在userCheckout这个链路中calculateMoney的调用接口由"coupon" -> "couponV2"后,可以较清楚的看到,对于createOrder来说,调用量上升了20%,延迟降低了5%。

在工程实践上的一些取舍

  • 在后端存储和计算的选型上,不额外的造轮子,选择现有的大数据组件,且经过一些中间层粘合起来使用
  • 对于如此大的数据规模,在实际中,也会进行一定的采样(文中提到了1%的采样率写入到Kafka中)
  • 对于trace中数据的迟到和完整度的问题,采用Flink去解决
  • 对于Flink消费之后的结果,一部分写入到Druid中,一部分直接提取后写入到neo4j中
  • 在通过一些UI可视化组件解决后续的交互式分析问题

几点思考

  • 这偏文章读下来更多的是偏向介绍数据在系统中的流转,并非过多的在介绍算法本身(单纯的看算法部分缺失不复杂),落地起来较为可行;
  • 在PathID生成中,过分依赖Flink的State能力,并没有设计或优化下高效的生成PathID的策略,这里还需要进一步的提升;
  • 在文末提到,对数据进行Trace数据的1%的采样,并没有透露出具体的采样策略,因为采样策略对数据质量和数据覆盖度有较为严重的影响;
  • 文中提出了Business Flow的概念,这个让我眼前一样,继续探索下,如何能进一步自动生成BusinessFlow的策略,可以通过一个UI让用户可以来管理自己的业务就是很大的进步了;


根因诊断的下一步思考

  • 算法侧需求
  • Trace场景的数据相对来说较为确定且具体,其中面临的问题也是确定的,这里更多的是是考虑如何在端上可以灵活的按需去采样,去解决后端的存储成本的问题,对于算法侧来说复杂度不是很高;
  • 在解决Trace数据后,如何将Metric和Alarm整合在一起,去自动化的做因果分析,这个还是复杂一些的;
  • 是否可以在以一步的让AI去学习我们的业务代码,能否将根因结果自动的和代码提交进行诊断,进一步定位到具体的更改(微软等已经在做了一些尝试)
  • 下一步更多的需要去考虑多元数据的融合问题,能否在云上提供类似APM中的完整能力,做到简单、易用;
  • 现阶段对于平台来说,要解决好信息抽取后的表达和管理工作,为后续的自动化分析和诊断扫清 障碍;


欢迎大家一起讨论

我是来自阿里云日志存储(SLS)团队的悟冥,我们已经提供了基于OpenTelemetry等其它标准协议的Trace数据的存储、计算、分析能力,也欢迎大家使用。


在参考资料中,放了一些阅读过和将要读的文章列表,欢迎大家可以私信我一起讨论,同时也欢迎各位前来实习或者工作,这里留个邮箱:

  • 悟冥
  • wuming.lgy@alibaba-inc.com


参考资料

  • SLS Trace https://help.aliyun.com/document_detail/208889.html
  • 【论文调研】根因分析:Micro.X系列 https://zhuanlan.zhihu.com/p/407298025
  • EMonitor之根因分析 https://zhuanlan.zhihu.com/p/137555421
  • AIOps项目开发实战https://www.shouxicto.com/article/115.html
  • 《MicroRCA: Root Cause Localization of Performance Issues in Microservices》
  • 《MicroDiag: Fine-grained Performance Diagnosis for Microservice Systems》
  • 《MicroHECL: High-Efficient Root Cause Localization in Large-Scale Microservice Systems》
  • Graph-Based Trace Analysis for Micro-service Architecture Understanding and Problem Diagnosis
  • CauseInfer: Automated End-to-End Performance Diagnosis with Hierarchical Causality Graph in Cloud Environment
  • 《CauseInfer: Automatic and Distributed Performance Diagnosis with Hierarchical Causality Graph in Large Distributed Systems》
  • 《On Microservice Analysis and Architecture Evolution: A Systematic Mapping Study》
  • 《AutoMAP: Diagnose Your Microservice-based Web Applications Automatically》
  • 《Self-Adaptive Root Cause Diagnosis for Large-Scale Microservice Architecture》
  • 《MS-Rank: Multi-Metric and Self-Adaptive Root Cause Diagnosis for Microservice Applications》
  • 《FacGraph: Frequent Anomaly Correlation Graph Mining for Root Cause Diagnose in Micro-Service Architecture》


相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
6月前
|
存储 监控 Java
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)
【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇)
164 0
|
3月前
|
存储 Prometheus Kubernetes
在K8S中,如何收集K8S日志?有哪些方案?
在K8S中,如何收集K8S日志?有哪些方案?
|
6月前
|
数据采集 存储 运维
如何使用SkyWalking收集分析分布式系统的追踪数据
通过以上步骤,你可以使用 SkyWalking 工具实现对分布式系统的数据采集和可视化。SkyWalking 提供了强大的追踪和度量功能,帮助开发者和运维人员更好地理解系统的性能状况。欢迎关注威哥爱编程,一起学习成长。
157 0
|
Java API
LOG4J2-MDC-全链路跟踪等功能研究
LOG4J2-MDC-全链路跟踪等功能研究
320 0
|
Arthas 监控 Java
慢调用链诊断利器-ARMS 代码热点
慢调用链诊断利器-ARMS 代码热点
|
存储 消息中间件 监控
代码级别监控:常见的全链路监控工具介绍
代码级别监控:常见的全链路监控工具介绍
|
SQL JSON 运维
如何使用下探分析定位多维指标异常根因
在系统运维过程中,关键指标的异常变化往往意味着服务异常、系统故障等等。因此我们往往会对一些关键指标进行自动巡检,例如异常检测和时序预测等等,及时感知指标的异常变化,了解系统的健康状况。对于复杂系统来说,感知到异常后直接在系统层面根因定位可能是十分困难的。因此我们需要一些手段缩小问题的排查范围或者直接定位问题,如使用 trace 根因分析等等。阿里云日志服务上线了下探分析功能,用于多维指标异常根因定位。我们将介绍该功能的使用场景和使用案例。
680 0
如何使用下探分析定位多维指标异常根因
|
XML 缓存 前端开发
【解决方案 十一】问题排查方法的思考
【解决方案 十一】问题排查方法的思考
112 0
|
运维
《基于日志trace的智能故障定位系统》电子版地址
基于日志trace的智能故障定位系统
69 0
《基于日志trace的智能故障定位系统》电子版地址
|
存储 缓存 运维
调用链追踪系统在伴鱼:OpenTelemetry 最佳实践案例分享
在 理论篇 中,我们介绍了伴鱼在调用链追踪领域的调研工作,本篇继续介绍伴鱼的调用链追踪实践。在正式介绍前,简单交代一下背景:2015 年,在伴鱼服务端起步之时,技术团队就做出统一使用 Go 语言的决定。
754 0
调用链追踪系统在伴鱼:OpenTelemetry 最佳实践案例分享