百度工程师眼中的云原生可观测性追踪技术

作者 | daydreamer

一、概念介绍

在云原生范畴,可观测性指从外部输出揣度和衡量体系内部状况,描绘体系中所发生状况的了解程度。常见的可观测性的三大基础是Metrics、Tracing和Logging:

  • 监控目标(Metrics): 监控目标的界说特征是可聚合的,是在一段时间内组成单个逻辑目标、计数器或直方图的原子。例如:传入的http恳求的数量能够建模为一个计数器,其更新聚合为简略的加法。

  • 追寻(Tracing): 它界说特征是它处理恳求范围内的信息,任何能够绑定到体系中单个事务对象的生命周期的数据或元数据。例如:发送到数据库的实践sql查询的文本。

  • 日志(Logging): 日志的界说特征是它处理离散事情。例如:运用程序调试或错误消息经过一个可切割的文件发送到集群统一处理。

在这三个范畴中,监控目标往往需求最少的资源来办理,由于从本质上来说,它们“压缩”得相当好;日志记载往往是压倒性的超越它所陈述的出产流量。从数据量开支的量级来看,从监控(低)到日志(高),追寻技能tracing可能坐落中间的某个地方。

百度工程师眼中的云原生可观测性追踪技术

当然,可观测性的含义在于更好的服务于事务体系,在实践中的运用往往是贴合事务需求,对其剖析笼统,能够看到几种可观测体系的功用和特性,例如,开源的prometheus项目开端仅仅作为一个监控体系发动的,跟着时间的推移,它可能会向盯梢方向发展,然后进入恳求范围(request-scope)内的监控,但很可能不会深入到日志空间。

二、追寻技能数据模型(以OpenTelemetry规范为例)

咱们以OpenTelemetry规范[1]为例,简略介绍tracing的通用数据模型。

追寻数据的经典模型开端来源于Google的经典论文[2],其间界说了一套通用的数据上报接口,要求各个散布式追寻体系都来完成这套接口,然后适配各种遵循此规范的散布式追寻体系,而关于开发者来说,能够依据事务需求,随意切换不同的散布式追寻体系。

OpenTelemetry规范中的盯梢由它们的 Span 隐式界说。特别是,能够将 Trace 视为 Spans 的有向无环图(DAG),其间 Spans 之间的边称为 References。

百度工程师眼中的云原生可观测性追踪技术

每个 Span 都封装了以下状况:

  • Name

  • Start and End Timestamps

  • Span Context

  • 跨度上下文运用两个标识符提供有关盯梢和跨度的特定上下文:Trace ID 和Span ID。每个 Span 由一个在 Trace 中仅有的 ID 标识,称为 Span ID。Span 运用 Trace ID 来标识 span 与其盯梢之间的联系。Span Context 以此描绘跨过服务和流程鸿沟联系。

  • Attributes

  • 包括元数据的键值对(key-value),您能够运用元数据来注释 Span 以携带有关它正在盯梢的操作的信息。

  • Span Events

  • 被认为是 Span 上的结构化日志消息(或注释),一般用于表明 Span 持续时间内有含义的单点。

  • Span Links

  • 能够将一个span与一个或多个span相关联,然后描绘执行上的上下游联系。例如,假设咱们有一个散布式体系,为了呼应其间一些操作(称其为操作a),一个额外的操作(称其为操作b)被排队等候执行,操作b的执行是异步的。咱们期望将操作b与操作a相关联,但咱们无法预测操作b何时开端。此时将操作a最终一个span链接到操作b第一个span,然后描绘他们的上下游联系。

  • Span Status

  • 状况码

**三、**业界tracing落地

Uber Jaeger

GEEK TALK

Uber公司于2016年开源了云原生范畴优秀的tracing渠道Jaeger[3]。当时该项目提出的布景是,Uber公司面临事务呈指数级增加微服务数量增加,而关于大型散布式微服务架构的可观测性,还缺乏一套完善的追寻渠道支撑。该项目开源后,一直遭到行业追捧,2017年被CNCF接收成为毕业项目。该渠道的特征是将单一API 年代的规划转变为散布式规划,完成统一的上下文传达的context,以及采样战略的决策转移到盯梢后端,允许后端动态调整采样率。该渠道全面支撑OpenTelemetry规范,一直是云原生范畴的事实规范产品。

Jaeger的整体架构如下所示:

百度工程师眼中的云原生可观测性追踪技术

其间jaeger-client是客户端采集组件,支撑动态流量模仿,对存储压力可感知。jaeger-agent负责采样相关战略。jaeger-collector负责tracing数据的收集,收拾和转存工作。jaeger-ui和jaeger-query负责渠道UI交互。接入方法支撑中间件埋点,支撑HTTP 等多种协议,底层存储选用Cassandra,Elasticsearch等开源存储渠道。

关于Jaeger的介绍详见官网:www.jaegertracing.io/

阿里鹰眼渠道

鹰眼是阿里为双十一等大流量活动打造的新一代基于日志的散布式调用盯梢体系。处理了故障定位难,容量预估难,资源浪费多,链路整理难等线上问题。该渠道有如下特点:

  1. 架构迭代逐渐轻量,数据呈现更加实时,从批量晋级为流式计算

  2. 将监控流程建立可视化,下降接入本钱,建立规划交给运用方

  3. 依据剖析场景对数据进行抽样,如对链路形状的剖析不需求全量数据

该渠道经过统一的日志打印方法和衡量规范,能够发现热点和容量预估,支撑压测,不合法流量。完成全局调用计算,trace查询和实时监控等功用。支撑http/tcp等协议,接入方法支撑中间件埋点,字节码增强等方法,底层选用了HDFS/HBASE/HSTORE/MPP等存储数据库。下图是该渠道的全局调用拓扑示意图。

百度工程师眼中的云原生可观测性追踪技术

关于该渠道的介绍能够参考阿里云的介绍文章《打造立体化监控体系的最佳实践》。

四、实践工作遇到的难点及处理方案

在百度的实践出产体系中,咱们也很多运用追寻技能来完成全链路实时监控、流量功能计算以及恳求trace查询和case排查等功用。在运用过程中,咱们也有一些实践经验:

1. 追寻的数据量大,首要表现在:

  • 采集压力高,要求SDK高功能,由于恳求涣散上报和传输的压力不大

  • 优化完成合理的抽样战略

  • 深度优化编码及映射算法

  • 数据依据类型和运用场景分类,选择不同的底层存储

2. 接入本钱非常重要,需求保持极低本钱。首要表现在:

  • 开发人员关于非事务代码接入的主动性不高,这种状况下需求接口规划简略、易用,很多埋点能够依靠底层框架,自界说埋点简略易用

  • SDK运用文档表述的简练、精准,有比较好的已有实践场景能够直接复用

  • 投入的性价比要高,能看到体系实在处理的实践问题

3. 稳定性要求高,首要经验有:

  • 选用本地持久化作为缓冲

  • 流量与任务的的结合,刺进trick task等

4. 完成一些高档特性的需求,例如:

  • 目标的置信度剖析,和数据科学的结合

  • 多种聚合窗口实时剖析,统筹短时间的时效性和较长时间的趋势剖析

  • 更加直观的展现方法,如何用尽量少的目标直观展示尽量多的信息

总的来说,跟着OpenTelemetry规范的落地,云原生可观测性追寻技能也在不断发展,在出产环境中也得到了广泛的运用,有力支撑了大型散布式微服务体系的稳定性,功能,功率等各个方面。咱们从一个百度工程师的视角出发,也能井蛙之见,一见可观测性的博学多才之妙。

———- END ———-

参考资料:

[1] OpenTelemetry:opentelemetry.io/docs/concep…

[2] Benjamin H. Sigelman Luiz Andr Barroso, et. al. 2010, Dapper, a Large-Scale Distributed Systems Tracing Infrastructure

[3] Uber Jaeger:eng.uber.com/distributed…

引荐阅读【技能加油站】系列:

运用百度开发者工具 4.0 建立专属的小程序 IDE

百度工程师教你玩转规划模式(观察者模式)

揭秘百度智能测验在测验主动执行范畴实践

H.265编码原理入门

小程序发动功能优化实践

百度工程师教你玩转规划模式(单例模式)

百度工程师眼中的云原生可观测性追踪技术