当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-01 15:40:56 Java

daydreamer1.概念介绍在云原生领域,可观察性是指从外部输出推断和测量系统内部状态,描述对系统中发生的事情的理解程度。可观察性的三个共同基础是指标、跟踪和日志记录:监控指标(指标):监控指标的定义特征是可聚合的,并且是在一段时间内构成单个逻辑指标、计数器或直方图的原子。例如:传入的http请求数可以建模为一个计数器,其更新聚合为简单的加法。跟踪:它的定义特征是它处理请求范围的信息,可以绑定到系统中单个事务对象的生命周期的任何数据或元数据。例如:发送到数据库的实际sql查询的文本。日志记录:日志记录的定义特征是它处理离散事件。例如:应用程序调试或错误信息通过可切割文件发送到集群统一处理。在这三个领域中,监控指标往往需要最少的资源来管理,因为从本质上讲,它们“压缩”得相当好;日志记录往往会压倒性地超过它报告的生产流量。就数据量开销的大小而言,从监控(低)到日志记录(高),跟踪可能处于中间位置。当然,可观察性的意义在于更好地为业务系统服务。在实践中,应用往往满足业务的需要,对其分析进行了抽象。你可以看到几个可观察系统的功能和特点。例如,开源的prometheus项目最初只是一个监控系统,随着时间的推移,它可能会演变成跟踪,进入请求范围的监控,但可能不会深入到日志空间。2.追踪技术数据模型(以OpenTelemetry标准为例)下面以OpenTelemetry标准[1]为例,简单介绍一下追踪的通用数据模型。追踪数据的经典模型最初来自谷歌的经典论文[2],它定义了一套通用的数据上报接口,要求每个分布式追踪系统都实现这个接口,以适应遵循这个标准的各种分布。对于开发者来说,可以根据业务需求自由切换不同的分布式追踪系统。OpenTelemetry标准中的跟踪由它们的Span隐式定义。特别地,Trace可以被视为Spans的有向无环图(DAG),其中Spans之间的边称为References。每个Span封装以下状态:NameStart和EndTimestampsSpanContextspan上下文使用两个标识符提供有关跟踪和跨度的特定上下文:TraceID和SpanID。每个Span在Trace中由一个唯一的ID标识,称为SpanID。跨度使用跟踪ID来标识跨度及其跟踪之间的关系。SpanContext使用它来描述跨服务和流程边界的关系。属性包含元数据的键值对,您可以使用这些元数据来注释Span以携带有关它正在跟踪的操作的信息。Span事件被认为是Span上的结构化日志消息(或注释),通常用于表示Span持续时间内有意义的单点。SpanLinks可以将一个span与一个或多个span关联起来,从而描述执行中的上下游关系。例如,假设我们有一个分布式系统,其中响应其中一些操作(称为操作a),一个额外的操作(称为操作b)排队等待执行,操作b异步执行。我们想把操作b和操作a关联起来,但是我们无法预测操作b什么时候开始。此时,将操作a的最后一个跨度与操作b的第一个跨度联系起来,描述它们的上下游关系。SpanStatusStatusCode3.行业溯源实现UberJaeger2016年,Uber开源了云原生领域优秀的溯源平台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/阿里鹰眼平台鹰眼是阿里巴巴为双十一等大流量打造的新一代基于日志的分布式调用跟踪系统事件。解决了故障定位难、容量预估、资源浪费、链路排序等在线问题。该平台具有以下特点:架构迭代逐渐轻量化,数据呈现更加实时,监控过程从批计算升级到流计算实现可视化,降低接入成本。构造设计交给用户根据分析场景对数据进行抽样,比如链接形式的分析不需要全量数据。平台通过统一的日志打印形式和度量标准发现热点和容量预估,支持压力测试和非法流量。实现全局调用统计、轨迹查询、实时监控等功能。支持http/tcp等协议,接入方式支持中间件埋入、字节码增强等,底层使用HDFS/HBASE/HSTORE/MPP等存储数据库。下图是平台全局调用拓扑结构示意图。平台介绍请参考阿里云的介绍文章《打造立体化监控体系的最佳实践》。4、实际工作中遇到的难点及解决方案在百度实际生产系统中,我们也应用了大量的跟踪技术,实现了全链路实时监控、流量性能统计、请求轨迹查询、案例排查等功能。在应用过程中,我们也有一些实践经验:1.跟踪数据量大,主要表现在:采集压力大,对SDK的性能要求高,由于去中心化上报和传输压力小requests,optimization实现合理的采样策略深度优化编码和映射算法数据根据类型和使用场景进行分类,选择不同的底层存储。2.访问成本非常重要,需要保持在极低的水平。主要表现在:开发人员对非业务代码的接入不是很积极。在这种情况下,要求界面设计简单易用。大量的嵌入点可以依赖底层框架。如SDK文档中所述,自定义嵌入点易于使用。简洁、精准、已有的良好实践场景,可直接复用。投资性价比高,看到系统真正能解决的实际问题。任务组合,插入技巧任务等。4.实现一些高级特性的需求,例如:指标的置信度分析,以及数据科学与实时分析的多个聚合窗口的结合,兼顾短期termtimelinessandlongtrendtrends分析更直观的展示形式,如何用尽可能少的指标直观展示尽可能多的信息总的来说,随着OpenTelemetry标准的落地,云原生可观察性追踪技术也在不断发展,并且在生产环境中也得到了广泛的应用,有力支撑了大规模分布式微服务系统的稳定性、性能、效率等方面。站在一个百度工程师的角度,我们也可以窥豹一斑,看到可观察性的博大精深。----------结束----------参考文献:[1]OpenTelemetry:https://opentelemetry.io/docs...[2]BenjaminH.SigelmanLuizAndréBarroso等。阿尔。2010,Dapper,一个大规模分布式系统追踪基础设施[3]UberJaeger:https://eng.uber.com/distribu...推荐阅读【技术加油站】系列:用百度阅读器工具4.0开发打造独家小程序IDE百度工程师教你玩转设计模式(观察者模式)揭秘百度智能测试自动测试执行领域实践H.265编码原理设计模式(单例模式)