sofa-rpc源码分析 4-全链路追踪技术

一、简介
sofa-rpc的全链路追踪技术是基于Sofa-Tracer实现的,Sofa-Tracer是基于ZipKin(谷歌Dapper)实现的,Sofa-Tracer参考了ZipKin的Trace-span设计;提供了相应的异步处理机制,每次会将父线程的上下文复制到子线程,为了防止多此异步调用的场景下,上下文的串用,不会再客户端相应阶段才清理上下文,而是会提前清理。
sofa-rpc在Sofa-Tracer的基础上,提供了以下新的特性

可插拔:基于Extension机制,用户可以重写,实现自己的trace,包括相应的Filter逻辑
总线设计:sofa-rpc的trace机制实现是基于其EventBus机制实现的,对于业务方来说是无侵入式的
trace/span:将一次系统调用用traceId标记,traceId通过IP地址+时间戳+自增+进程PID生成;而spanId将在一次服务间的调用分为了cs (client send)、cr (client recv)、sr (server recv)、ss (server send),如此设计,是为了区分在一个服务发生的多次调用,通过spanID能区分
数据采样设计:在高并发系统中,可能某个Error日志出现的时候,一定不会是一天,可能几千几万条,但并不是所有都需要被持久化的,sofa-rpc提供了基于RingBuffer的机制,对数据进行随机采样,当然,你也可以通过Sofa-Tracer的Sampler自定义采用规则
异步刷新机制:通常,我们的日志的持久化都是同步操作,但是在高并发系统,这会对业务系统造成一定的影响,特别是日志内容较大的时候,sofa-rpc的RingBuffer机制,是通过异步线程,消费RingBuffer里的trace日志任务,将日志持久化到磁盘
耗时计算:sofa-rpc的trace在上下文中提供了对于RPC操作的耗时计算
埋点数据透传:sofa-rpc每次request都会把traceId和spanId等信息带在SofaRequest的requestProps里,以便下一次请求对ID进行继承自增;此方式称为带内透传,谷歌的Dapper默认采用的是带外传播,即通过单独提供一个宽带来传播,不影响原调用数据和网络
异步线程的链路调动:为了防止多此异步调用的场景下,上下文的串用,不会再客户端相应阶段才清理上下文,而是会提前清理。
文件存储结构:sofa-rpc将日志按类型做了以下分类

文件 功能
rpc-client-digest.log 记录client rpc 调用的链路调用数据
rpc-client-stat.log 记录 client rpc 链路调用的统计数据
rpc-server-digest.log 记录 server rpc 调用的链路调用数据
rpc-server-stat.log 记录 server rpc 链路调用的统计数据
static-info.log 统计信息日志
tracer-self.log tracer 自身的日志记录

二、源码分析
ClientProxyInvoker.invoke //客户端调用入口,Trace生产流程

//触发事件总线
1.EventBus.post
//消费到从EventBus来的trace消息,onEvent内对上述trace/span机制细分出来的各类消息进行了相应的处理
2.SofaTracerSubscriber.onEvent
    //处理rpc调用前的消息,主要是生成当前调用的Span信息、生成上下游Span关系,并将新的Span放到SofaTracerThreadLocalTraceContext的ThreadLocal的变量里
    2.1 Tracers.startRpc
    //处理客户端发送请求前的消息,将当前线程的trace和spand等信息放到SofaRequest的requestProps里
    2.2 Tracers.clientBeforeSend
    //从相应消息体获取到trace和spand等信息并放到自己的线程上下文里
    2.3 Tracers.clientAsyncReceivedPrepare
    //处理客户端收到响应或者异常的消息,通过相应结果,判定成功或失败,失败则组装异常信息并抛出,异常包含服务端返回异常和客户端信息异常而产生的异常,无论成功与否,结束本次调用Span
    2.4 Tracers.clientReceived
    //处理服务端收到请求后的消息,获取请求体内的trace和spand等信息,并放到自己的当前线程
    2.5 Tracers.serverReceived
    //处理服务端返回请求或者异常的消息,判定自己的返回是否出现异常,异常则设置相应的返回的Span的code为(00=成功/01=业务异常/02=RPC逻辑错误)
    2.6 Tracers.serverSend
    //检查状态,在结束调用的时候进行调用,防止资源泄露
    2.7 Tracers.checkState

三、总结
1.sofa-rpc的全链路追踪依靠sofa-trace实现,包含上述说的trace/span、数据采样设计、异步刷新机制等设计,核心功能还是在sofa-trace里

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容