SOFATracer 在亿通国际可观察性下的落地与实践

Stella981
• 阅读 716

陈晨: Github ID: chenmudu  ,SOFATracer Committer , 专注于基础服务和可观察性方向。

SOFATracer 是蚂蚁集团开源的基于 OpenTracing 规范的分布式链路跟踪系统组件,其核心理念就是通过一个全局的 TraceId 将分布在各个服务节点上的同一次请求串联起来。通过统一的 TraceId 将调用链路中的各种网络调用情况以日志的方式记录下来同时也提供远程汇报到 Zipkin /Jaeger 进行展示的能力,以此达到透视化网络调用的目的。

我们选择了将 SOFATracer 作为公司云原生架构下分布式应用透传的核心组件,并依此构建了我们公司内部的众多的产品。其中最重要的是:借助其全局透传能力,将上下游及其相关中间件 Client 端串联起来,为我们内部应用可观察性相关指标做了重要的补充。以此丰富了公司应用维度的相关指标,为我们应用级问题定位、应用链路诊断以及中间件运行期分析提供了重要的能力。所以今天想和大家分享一下分布式链路组件 SOFATracer 在亿通内部落地的相关情况。

SOFATracer: https://github.com/sofastack/sofa-tracer

1

技术背景

在公司内,我们将 Spring Cloud 全家桶和 Apache Dubbo 作为微服务解决方案和服务通讯框架。由于微服务下分布式应用之间的调用关系开始变得复杂起来,不仅在开发过程中,在后续的测试和发布过程都会存在问题排查过难;同时我们需要开始构建一些其他平台,用于满足我们日益增长的业务需求和其他需求。

由于公司内技术栈的更新迭代和业务增长等背景,我们急需一套应用级系统透传的组件作为基础服务,并在此基础上,为公司内部其他相关平台赋能。经过大量对比以及考虑到团队内技术栈分布和所需中间件产品的需求,我们选择了 SOFATracer 作为首选的透传组件,以下则是我们选择的重要原因。

  • 轻量级 SDK 接入

选择 JavaAgent 这种非侵入式的透传组件诚然是一件省力和简单的事儿,业内也有许多优秀的产品。但是我们的目标是寻找核心的 SDK 作为一部分微服务应用的基础组件,并不直接使用,借助 SOFATracer 完成公司内平台所需的相关需求,构建一整套的分布式应用链路跟踪解决方案;同时我们还考虑团队内技术栈分布情况。由于在调研期间已大致学习和观摩过 SOFATracer 相关源码,确定其代码清晰、实现轻巧及利于后期扩展等特点,使得我们最终选择了 SOFATracer 作为应用透传的基础组件。

  • 灵活的扩展性和可插拔性

由于我们最初的目标是一整套分布式全链路应用相关的解决方案,我们需要其具备易于扩展和可插拔的能力。

相信熟悉 SOFATracer 的同学已经了解其设计和相关架构,在 plugins 目录下存放众多中间件 Client 端的增强,如果有需要定制化则可自行扩展,同时基于 SOFABoot Starters 下的初始化也使得其增强 具备可插拔性。如果不太熟悉的同学,可以寻找往期介绍 SOFATracer 的相关文章。

  • 满足公司内云原生架构所需特性

SOFAStack 作为业内金融级云原生架构的标杆,其开源的组件是金融场景里锤炼出来的优秀实践。由于公司内部 云原生架构下的中间件需要具备动态性、安全性和合规性等特点,所以我们内部定制的中间件 Client 端在 SOFATracer 清晰和具备扩展性的代码下完成了超过 10 余种 Client 端动态能力的增强。感谢蚂蚁集团开源出如此优秀的金融级云原生组件。

2

落地 SOFATracer 解决了我们哪些问题

 

  • 问题定位及应用性能优化,并补全云原生下可观察性遗失的相关指标

借助于 SOFATracer 的全链路透传和借助高性能内存队列 Disruptor 关联数据落盘等功能,我们在内部的可观察性平台上帮助业务应用快速定位问题,分析问题和对部分应用做相关优化,补全了公司云原生架构下关于应用可观察性的相关指标的短板。包括不仅限于业务应用级 Logs , 应用级 Traces , 及其相关中间件 Client 端的 Metrics 指标,同其他监控平台一同构建了云原生下企业级的的可观察性平台。

例如:我们利用 SOFATracer 全局透传的 TraceId 将此次请求涉及到的所有的应用日志数据串联起来,以此确定整个链路发生的所有情况。问题发生时,确定动态系统数据产生的瞬时状态,为问题定位、还原业务场景提供重要能力。

SOFATracer 在亿通国际可观察性下的落地与实践

这样我们可以通过全局的 TraceId 筛选出某一次请求调用过程中,途径的所有应用日志数据,将复杂冗余的调用情况及其数据转换为可观察的线性数据,以此更方便的去排查问题。

SOFATracer 在亿通国际可观察性下的落地与实践

而且我们借助 Logs 与 Traces 共有的 TraceId 和 SpanId,将业务日志数据与链路追踪进行渲染和关联,将问题定位的范围由应用级到核心代码层级,将可观察性下的关键指标 Logs 与 Traces 进行关联,不断缩小问题的定位范围。

SOFATracer 在亿通国际可观察性下的落地与实践

同时我们将定时上报的统计指标信息用于反馈应用内中间件 Client 端所使用的性能,并不断优化相关 Client 和 Server 端的相关性能参数。

例如下图,我们内部定义了接口响应时间的步长为 50 ms,用不同颜色去区分不同接口在不同时间内的响应速度,借此可以清晰的确定某些 Rest 接口的响应时间,以便有利于调整相关 Rest Client 端连接参数和优化对应 Http Server 的性能。

SOFATracer 在亿通国际可观察性下的落地与实践

最后,我们将上报的 Metrics 同其他相关指标信息,一起用在我们平台内应用入口做对应的 入口流量检测、系统健康反馈、出口流量以及基础依赖的分析。确保当问题发生的时候,我们可以从整体到局部,从宏观到微观的去探测软件内部黑盒的状态。以便更好的定位问题、分析问题、解决问题,为基础服务和业务提供技术保障。

SOFATracer 在亿通国际可观察性下的落地与实践

至此,很大程度上为公司内 应用拓扑发现、跨应用追踪、全链路的日志关联以及相关应用指标及趋势分析等提供了技术支持。当然这是我们内部平台在可观察性下展现的部分能力,关于更多则涉及到公司隐私,就不在此进行讨论。

  • 基于此构建出业务所需的其他平台产品

我们后期可能会打算借助 SOFATracer 作为应用透传系统的核心,打造出其他各式各样满足业务发展的平台产品。再一次感谢 SOFA 社区开源出如此优秀的追踪组件。

3

对于 SOFATracer 我们是如何回馈开源的

 

良好的社区生态除了官方的不断迭代演进和运营之外,更需要更多的人进行参与。当有越来越多的场景落地,产品才会越来越成熟,才会更好的回馈广大开发者,对此我们也积极的参与了 SOFAStack 的建设和发展:

  • 我们内部将其作为应用间透传的基本组件,用于服务其他平台,并反哺至业务。

  • 同时将部分特殊用法案例以及相关插件的使用指南补充在了 SOFA 的 Guides 项目内,为其他开发者提供便利。包括不仅限于 SpringData Mongo Client 、SpringData Redis Client、Spring Kafka、Spring Amqp (Rabbit)及监听采样的数据控制等。

  • 使用过程中,由于我们部分服务的特殊性,致使官方代码出现兼容性问题,我们反哺给上游分支,并修复部分开源代码。包括不仅限于 RDB 增强端对于 Oracle 数据库的 TNS 模式的匹配、 Http Server 端错误标志的统一和信息填充以及一些小问题的Bug修复。

  • 同时由于我们开发了多个内部中间件的插件,我们将具备通用性的相关代码贡献至官方,作为回报给开源社区,以此表达开源社区为我们带来便利的感谢。贡献的插件包括不仅限于 Spring Kafka、Spring Amqp(Rabbit) 等。关于相关插件代码,详情请关注 SOFATracer 3.X 分支。

最后,非常感谢蚂蚁集团开源出的各个组件,让我们的基础服务插上翅膀,补全了公司在可观察性下的遗漏的应用级指标,为我们的业务应用提供保驾护航的能力。后续,我们将持续关注 SOFA 生态,为社区尽可能的贡献自己微薄的力量。

SOFATracer 在亿通国际可观察性下的落地与实践

本文分享自微信公众号 - 金融级分布式架构(Antfin_SOFA)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
3年前
Dubbo + Zipkin + Brave实现全链路追踪
DubboZipkinBrave实现全链路追踪最近写了一个链路追踪Demo分享下,实现了链路追踪过程中数据的记录,还有能扩展的地方,后期再继续补充。原理参考上面文章《Dubbo链路追踪——生成全局ID(traceId)》(https://my.oschina.net/Luc
Stella981 Stella981
3年前
Nepxion Discovery 5.5.0 发布
!(https://oscimg.oschina.net/oscnet/f81c043194ef4732880459d00c1a720e.png)发布日志功能更新:增加基于Opentracing调用链的支持,目前支持UberJaeger,实现在SpringCloudGateway、Zuul和服务上的灰度
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
Dubbo链路追踪——生成全局ID(traceId)
全局traceId关于链路追踪,在微服务的趋势下,一次调用的日志信息分布在不同的机器上或目录下,当需要看一条链路调用所有的日志信息时,这是个比较困难的地方,我们虽然有ELK,Sentry等日志异常收集分析工具,但是如何把信息串起来也是一个关键的问题。我们一般的做法是在系统调用开始时生成一个traceId,并且它伴随着一
分布式系统中的分布式链路追踪与分布式调用链路
在分布式系统中,由于服务间的调用关系复杂,需要实现分布式链路追踪来跟踪请求在各个服务中的调用路径和时间消耗。这对问题排查和性能监控都很重要。常用的分布式链路追踪实现有基于日志的和基于分布式追踪系统的两种方式: