作者 | 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
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 的介绍详见官网:https://www.jaegertracing.io/
阿里鹰眼平台
鹰眼是阿里为双十一等大流量流动打造的新一代基于日志的分布式调用跟踪零碎。解决了故障定位难,容量预估难,资源节约多,链路梳理难等线上问题。该平台有如下特点:
- 架构迭代逐步轻量,数据出现更加实时,从批量降级为流式计算
- 将监控流程搭建可视化,升高接入老本,搭建设计交给应用方
- 依据剖析场景对数据进行抽样,如对链路状态的剖析不须要全量数据
该平台通过对立的日志打印模式和衡量标准,能够发现热点和容量预估,反对压测,非法流量。实现全局调用统计,trace 查问和实时监控等性能。反对 http/tcp 等协定,接入形式反对中间件埋点,字节码加强等形式,底层采纳了 HDFS/HBASE/HSTORE/MPP 等存储数据库。下图是该平台的全局调用拓扑示意图。
对于该平台的介绍能够参考阿里云的介绍文章《打造立体化监控体系的最佳实际》。
四、理论工作遇到的难点及解决方案
在百度的理论生产零碎中,咱们也大量利用追踪技术来实现全链路实时监控、流量性能统计以及申请 trace 查问和 case 排查等性能。在利用过程中,咱们也有一些实践经验:
1. 追踪的数据量大,次要体现在:
- 采集压力高,要求 SDK 高性能,因为申请扩散上报和传输的压力不大
- 优化实现正当的抽样策略
- 深度优化编码及映射算法
- 数据依据类型和应用场景分类,抉择不同的底层存储
2. 接入老本十分重要,须要放弃极低成本。次要体现在:
- 开发人员对于非业务代码接入的主动性不高,这种状况下须要接口设计简略、易用,大量埋点能够依赖底层框架,自定义埋点简略易用
- SDK 应用文档表述的简洁、精准,有比拟好的已有实际场景能够间接复用
- 投入的性价比要高,能看到零碎切实解决的理论问题
3. 稳定性要求高,次要教训有:
- 采纳本地长久化作为缓冲
- 流量与工作的的联合,插入 trick task 等
4. 实现一些高级个性的需要,例如:
- 指标的置信度剖析,和数据迷信的联合
- 多种聚合窗口实时剖析,兼顾短时间的时效性和较长时间的趋势剖析
- 更加直观的展示模式,如何用尽量少的指标直观展现尽量多的信息
总的来说,随着 OpenTelemetry 规范的落地,云原生可观测性追踪技术也在一直倒退,在生产环境中也失去了宽泛的利用,无力反对了大型散布式微服务零碎的稳定性,性能,效率等各个方面。咱们从一个百度工程师的视角登程,也能管中窥豹,一见可观测性的博大精深之妙。
———- END ———-
参考资料:
[1] OpenTelemetry:https://opentelemetry.io/docs…
[2] Benjamin H. Sigelman Luiz André Barroso, et. al. 2010, Dapper, a Large-Scale Distributed Systems Tracing Infrastructure
[3] Uber Jaeger:https://eng.uber.com/distribu…
举荐浏览【技术加油站】系列:
应用百度开发者工具 4.0 搭建专属的小程序 IDE
百度工程师教你玩转设计模式(观察者模式)
揭秘百度智能测试在测试主动执行畛域实际
H.265 编码原理入门
小程序启动性能优化实际
百度工程师教你玩转设计模式(单例模式)