背景

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插件兼容泛化调用的更多相关文章

  1. Dubbo基本特性之泛化调用

    Dubbo 是支持泛化调用的,什么是泛化调用呢?泛化调用的好处是什么呢,泛化调用说白一点就是服务消费者并没有服务的接口. 在<Dubbo入门-搭建一个最简单的Demo框架>一文中,我们已完 ...

  2. Dubbo高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  3. Dubbo学习笔记4:服务消费端泛化调用与异步调用

    本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...

  4. Dubbo 高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  5. dubbo接口泛化调用例子

    @ApiOperation(value = "dubbo泛化调用工具接口") public Result dubboApiTool( @ApiParam(value = " ...

  6. dubbo泛化调用 小demo

    前两天刚好有个同事来问是否用过 dubbo泛化 调用,不需要通过指定配置.第一次听到的时候,还是有点懵,但觉得有意思,可以学点东西. 立马百度了,找了demo,这篇比较容易上手(http://www. ...

  7. dubbo的泛化调用研究

    结论: 泛化调用需要继承一个类,在配置文件里需要明确指出generic=true; 泛化调用在书写provider代码时,变化不大: 泛化调用和普通调用的区别主要在consumer,从‘调用’的表面意 ...

  8. 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活

    图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) by zhangxinxu from http://www.zhangxinxu.com 本 ...

  9. SOFARPC —— Generic Service (泛化调用) 解析

    今晚心情无比激动,多云转晴!原因在于弄懂些 Generic Service 实现原理,很有成就感. 各位看官莫笑,今晚,小小的收获,也是非常满足的.下面进入正题! 一.前言 普遍RPC在客户端需要提供 ...

随机推荐

  1. 10分钟-jQuery-基础选择器

    1.id 选择器 jquery能使用CSS选择器来操作网页中的标签元素.假设你想要通过一个id号去查找一个元素,就能够使用例如以下格式的选择器: $("#my_id") 当中#my ...

  2. 51单片机 | 实现SMC1602液晶屏显示实例

    ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...

  3. [linux]netstat命令详解-显示linux中各种网络相关信息

    1.功能与说明 netstat 用于显示linux中各种网络相关信息.如网络链接 路由表  接口状态链接 多播成员等等. 2.参数含义介绍 -a (all)显示所有选项,默认不显示LISTEN相关-t ...

  4. oracle字符串处理相关

    函数 返回 描述 例子 to_char(timestamp, text) text 把 timestamp 转换成 string to_char(timestamp 'now','HH12:MI:SS ...

  5. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  6. thinkphp5或3.2 php动态修改config配置文件永久保存

    thinkphp默认的参数方法只能读取,或者动态修改不能永久修改. 这是自己摸索出来的特发出来给需要的朋友(懂的朋友别笑话,功能我自己使用是没任何问题).有些参数还是保存在配置文件方便快捷!不一定所有 ...

  7. Quartz.Net - Lesson 1: 使用Quartz

    Lesson 1: 使用Quartz 本系列文章是官方3.x文档的翻译,原文地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/t ...

  8. 《HBase in Action》 第二章节的学习总结 ---- HBase基本组成

    准备工作:采用的HBase版本是:CDH4.5,其中的Hadoop版本是:hadoop-2.0.0-cdh4.5.0:HBase版本是:hbase-0.94.6-cdh4.5.0: Hbase的配置文 ...

  9. RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解决方案(转)

    转自:RecyclerView Bug:IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter的解 ...

  10. web开发之html5---html5 动画特效舞动的雨伞

    http://www.cnblogs.com/stoneniqiu/p/4199294.html