『互联网架构』dubbo 调用埋点(114)

原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:『互联网架构』dubbo 调用埋点(114)

上边几次都是说的单体的拦截埋点,应用的内部进行的,很多的情况系统都是分布式的,怎么去监听RPC(远程过程调用),dubbo,RMI,springcloud,http。只要远程调用,跨进程调用都属于RPC,也不可能所有的能都涉及到,很多公司都有自己的封装,例如阿里的HFS,这次只针对dubbo这种RPC进行调用。
源码:https://github.com/limingios/netFuture/tree/master/源码/『互联网架构』调⽤链系统工程结构(111)

(一)Dubbo执行过程

对于dubbo的埋点,首先要了解dubbo的执行过程

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器
  • Dubbo调用过程


  • 消费者调用过程


(二)调用端埋点实现

  • 埋点目的
    1.捕捉消费者调用信息(远程接口、URL、参数、用时、返回结果、异常)
    2.传递TraceRequest

  • 调用信息模型表结构

名称 类型 描述
servicePath string 服务路径
serviceName string 服务
inParam json 返回结果
outParam json 返回结果
ErrorMessage string 异常信息
ErrorStack text 异常堆栈
ResultState string 执行状态
beginTime date 开始时间
endTime date 结束时间
addressIp string 远程IP
fromIp string 调用者IP
  • 埋点位置

如何才能完整的捕捉到以上信息呢?那么就需要了解Dubbo内部的调用
1.分解调用过程为多个步骤。
2.这些步骤分别是在哪些协作线程上完成的?
3.经过了哪些方法?
4.经过了哪些过滤器?

  • 调用过程分解&线程协作


  1. 选择断点位置Debug调试调用过程
  2. 消费者调用线程源码分析:


  • 经过对源码的分析,埋点的位置如下:
    DubboInvoker.doInvoke()
    FutureFilter.invoke()
    DubboInvoker.doInvoke() 方法最靠近调用方,异常捕捉范围较大,但是该位置无法通过Attachment 向下传递TraceRequest 参数,所以需要FutureFilter.invoke() 进行补充,其具体分工如下:
    ·1.DubboInvoker.doInvoke捕获如下信息: 1、开始时间 2、服务路径 3、服务方法 4、输入参数 5、异常信息 6、本地地址
    2.FutureFilter.invoke 基于Attachment 向下传递参数 2、异常信息与堆栈 3、返回结果

DubboInvoker.doInvoke拦截源码参见 :com.cbt.agent.collects.dubbo.DubboConsumerRpcExceptionMonitorHandle#invokerBefore

FutureFilter.invoke拦截源码参见 :
com.cbt.agent.collects.dubbo.DubboConsumerMonitorHandle#invokerBefore

(三)调用端埋点实现

  • 埋点目的
    接收TraceRequest信息 ,并创建会话
  • 埋点位置:
    相对调用广方接收方埋点目的较简单,但同样需分析源码找准埋点位置
  • 提供者处理线程分析


经分析埋点位置选在离实际调用方法较远的EchoFilter过滤器理由是捕捉的信息更全面。

具体会话开启过程:

  1. 基于Attachment获取TraceId、ParentId、TraceProperties。
  2. 封装TraceRequest ,并此为参数开启会话。
  3. 在调用结束时关闭会话。
    具体源码参见:com.cbt.agent.collects.dubbo.DubboProviderMonitorHandle#invokerBefore

(二)Servlet处理埋点

  • Servlet埋点目的
    1.生成TraceId
    2.开启关闭监控会话
    3.捕捉Http请求(url、客户端IP、参数、响应时长、响应状态码)

  • 埋点埋在哪?
    1.每一个Control方法
    2.DispatcherServlet.doDispatch方法
    3.HttpServlet.service 方法

  • 方案对比

方案 优点 缺点
应用层Control类 简单,风险因素低 判别成本高,有局限性,只能根据 HttpServlet 子类或@RequestMapping进行识别。
DispatcherServlet.doDispatch 简单,适应性强 1、只能针对spring mvc 项目 2、spring boot 项目不支持
HttpServlet.service 适应性强,与应用层和框架无关 1、不同的容器ClassPath不一样,存在兼容性问题。 2、存在风险,几乎所有请求都会经过此方法 3、业务异常无法捕获

总合比较还是选择 HttpServlet.service 会更好些。

  • HttpServlet.service 埋点需要做的工作:
    1.字节码插桩
    2.请求拦截并获取请求信息

  • 字节码插桩流程

字节码插是指在数据装载前在HttpServlet.service 插入监控指令,以拦截Http请求,其插桩的过程。

请求拦截是指具体Http请求过来时进行拦截过滤,这么做主要是为了完成两个目的

1.开启监控会话
2.开启对Servlet响应过程的监控

(三)Redis 调用埋点

  • 埋点可选方案
方案 优点 缺点
埋点jedis 类Get、Set等API方法 简单直接 工作量大,方法较多、需要了解每个方法特性
埋点 Connection sendCommand方法 全面、所有命令都会经过此方法 存在未知风险、不方便计算执行时间、和返回结果
埋点 Protocol 全面、所有命令都会经过此方法 存在未知风险、不方便计算执行时间、和返回结果

PS:源码中可以查看DevelopBootMain类,我看这代码也看了2天,原来老写业务代码,看看这确实很容易懵X,确实这才是有技术含量的代码。其实有没有技术含量不太重要,重要是的有没有商业价值。

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

推荐阅读更多精彩内容