pinpoint-dubbo插件兼容泛化调用
背景
dubbo插件中需要记录当前调用的接口和方法,但是在泛化调用的场景下,记录的接口和方法都变成了
com.alibaba.dubbo.rpc.service.GenericService:$invoke,需要把它转化为真实的API和方法
@Override
public void after(Object target, Object arg0, Object result, Throwable throwable) {
//插件开关
if(!traceContext.collectSwitch(traceContext.getApplicationName(),"dubbo",null)){
return ;
}
Trace trace = this.getTrace(target);
if (trace == null) {
return;
} RpcInvocation invocation = (RpcInvocation) arg0; try {
SpanEventRecorder recorder = trace.currentSpanEventRecorder(); String endPoint = RpcContext.getContext().getRemoteAddressString();
recorder.recordApi(descriptor,new Object[]{endPoint}); if (throwable == null) {
// RPC client have to record end point (server address)
recorder.recordEndPoint(endPoint); // Optionally, record the destination id (logical name of server. e.g. DB name)
recorder.recordDestinationId(endPoint); URL url = invocation.getInvoker().getUrl();
// 2017/9/11 上午11:22 记录调用的接口
String interfaceName = ((Invoker)target).getInterface().getName();
String methodName = invocation.getMethodName();
//泛化调用兼容
if (GENERIC_SERVICE.equals(interfaceName) && INVOKE.equals(methodName)) {
interfaceName = invocation.getAttachment("interface");
methodName = (String) invocation.getArguments()[0];
}
//记录调用的api
recorder.recordAttribute(DubboConstants.DUBBO_INTERFACE_ANNOTATION_KEY,interfaceName+":"+methodName);
//记录dubbo调用分组
recorder.recordAttribute(DubboConstants.DUBBO_GROUP_ANNOTATION_KEY,url.getParameter("group"));
//记录dubbo调用请求参数
recorder.recordAttribute(DubboConstants.DUBBO_ARGS_ANNOTATION_KEY, DubboUtils.getParam(invocation.getArguments(),traceContext)); if (result instanceof RpcResult && trace.isDebug()){
// if (result instanceof RpcResult ){
RpcResult rpcResult = (RpcResult)result;
Object value = rpcResult.getValue();
recorder.recordAttribute(DubboConstants.DUBBO_RESULT_ANNOTATION_KEY, traceContext.toJsonString(value));
}else {
// recorder.recordAttribute(DubboConstants.DUBBO_RESULT_ANNOTATION_KEY, result);
}
} else {
recorder.recordException(throwable);
}
} finally {
trace.traceBlockEnd();
}
}
pinpoint-dubbo插件兼容泛化调用的更多相关文章
- Dubbo基本特性之泛化调用
Dubbo 是支持泛化调用的,什么是泛化调用呢?泛化调用的好处是什么呢,泛化调用说白一点就是服务消费者并没有服务的接口. 在<Dubbo入门-搭建一个最简单的Demo框架>一文中,我们已完 ...
- Dubbo高级特性实践-泛化调用
引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...
- Dubbo学习笔记4:服务消费端泛化调用与异步调用
本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...
- Dubbo 高级特性实践-泛化调用
引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...
- dubbo接口泛化调用例子
@ApiOperation(value = "dubbo泛化调用工具接口") public Result dubboApiTool( @ApiParam(value = " ...
- dubbo泛化调用 小demo
前两天刚好有个同事来问是否用过 dubbo泛化 调用,不需要通过指定配置.第一次听到的时候,还是有点懵,但觉得有意思,可以学点东西. 立马百度了,找了demo,这篇比较容易上手(http://www. ...
- dubbo的泛化调用研究
结论: 泛化调用需要继承一个类,在配置文件里需要明确指出generic=true; 泛化调用在书写provider代码时,变化不大: 泛化调用和普通调用的区别主要在consumer,从‘调用’的表面意 ...
- 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活
图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) by zhangxinxu from http://www.zhangxinxu.com 本 ...
- SOFARPC —— Generic Service (泛化调用) 解析
今晚心情无比激动,多云转晴!原因在于弄懂些 Generic Service 实现原理,很有成就感. 各位看官莫笑,今晚,小小的收获,也是非常满足的.下面进入正题! 一.前言 普遍RPC在客户端需要提供 ...
随机推荐
- h5+ 管理设备信息
Device模块管理设备信息,用于获取手机设备的相关信息,如IMEI.IMSI.型号.厂商等.通过plus.device获取设备信息管理对象. 1.属性 1.1.imei: 设备的国际移动设备身份码, ...
- 阿里CI/CD、DevOps、分层自动化技术
原文地址:http://www.infoq.com/cn/news/2017/01/alibaba-yunxiao-cicd-devops 在互联网时代,产品快速迭代的重要性不言而喻.不管是传统企业还 ...
- laravel处理ajax的post提交
Html页面(laravel表单提交必须token)所以 头部要加入: <meta name="csrf-token" content="{{ csrf_token ...
- Html中嵌套其他HTML文件的几种方法(转)
给大家整理了3个方法,一个是HTML的iframe标签,别两个是JS引用.比如要在arr.html文件里引用index.html文件,方法如下. HTML引用方法: <iframe name=& ...
- leetcode第一刷_Binary Tree Zigzag Level Order Traversal
以出现的频率来看.树的层序遍历一定是考察的重点,除非工作人员想找题水数量. zigzag,还是有几道题的,层序的这个非常easy,假设是奇数层.reverse下面就可以.无他.我写的时候预计还不知道这 ...
- servlet文件下载2(单文件下载和批量下载)
使用servlet完毕单文件下载和批量文件下载.批量下载的原理是先将文件打包成zip , 然后再下载. 之前也转载过一篇文件下载的博客,地址:http://blog.csdn.net/ch717828 ...
- jeesite中activiti中的流程表梳理
最近在利用jeesite开发一个小系统,趁着这个机会整理了activiti中的相关表,跟踪流程,然后查看这几个表中数据的变化,可以更好地理解流程的开发.现在整理出来,希望可以帮助更多的人! 表结构 一 ...
- oracle中sql执行性能关注点
繁琐复杂的执行计划.可能迷了开发人员的眼.导致一条性感又傻X的SQL 在服务器上跑得特欢乐 有介于此.重点抓住几个部分.至于其他的嘛.当然是.非礼勿视咯.. ㈠ 返回行的数量 ...
- Android控件ListView获取item中EditText值
能够明白,如今没有直接方法能够获得ListView中每一行EditText的值. 解决方式:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值. 大概算法:重写Ba ...
- centos7防火墙--firewall
centos7的防火墙变成firewall了 systemctl start firewalld.service#启动firewallsystemctl stop firewalld.service# ...