Giter VIP home page Giter VIP logo

remote-debug-agent's Introduction

remote-debug-agent

A java agent which allows you to debug your web application remotely. It's very useful in integration tests.
Go to wiki

How to use:

Add this agent to your application's JAVA_OPTS, do testing actions(click a button or invoke an interface) normally, send a request to the custom port, and get debug information of the program that just ran. Here are the details:

From source code: cd ${project dir}, type command gradle jar, you will find all binary files in ${project dir}/agent/build/libs.
From binary files: put all jar files to any directory you want, add -javaagent:${directory above}/remote-debug-agent.jar=includes=com.foo.bar,apiport=8098 to your web application's JAVA_OPTS. (e.g. if you use tomcat as middleware, you can add this option in catalina.sh) Then start your web application, the agent will provide service in port 8098. This is your debugging interface.

Now you can debug your program remotely. For example, a button in GUI sends a request and invokes a method in com.foo.bar.SomeClass. Before clicking the button, send another request with url http://ip:8098/trace/start. Then click the button. Last, send a http://ip:8098/trace/list request, and the agent will return you debug information that contains what methods you invoked just now, what are the parameters and return value, cost time, even covered code lines.
A specific example likes:

[{
	"coverage": "[11,13][16,16]",
	"cost time": 0,
	"method": "java.lang.String com.github.rdagent.test.WebappHandler.handle()",
	"calls": [{
		"coverage": "[21,21][24,24]",
		"cost time": 0,
		"method": "boolean com.github.rdagent.test.WebappHandler.largeThanHalf(double)",
		"parameters": ["0.24444334899195885"],
		"return value": "0"
	}],
	"return value": "random number( 0.24444334899195885 ) is little than half"
}]

The example is in the test directory of this project.

For now, this agent supports some popular frameworks:

  • Frameworks and middlewares that use standard java servlet, like Spring, Tomcat and so on.
  • Struts2
  • Dubbo
  • Rabbitmq
  • Groovy Grails(yes, this agent supports other JVM languages)
  • Scala Play

Of course, you can use this agent in your local java program. It collects debug information and dumps them into a file after the main thread stoped.

Advance Usage

How to make this agent be compatible with more frameworks
I also have provided an easy way to support more frameworks(based on HttpServlet). For example, you have a web application that uses com.foo.bar.MyServlet as core frame. To use this agent in your application, just write a class extends com.github.rdagent.transformer.handler.DefaultServletAdatper, override injectClassNameList() method, make it return a List contains String value "com.foo.bar.MyServlet". Pack this class into a jar file, put it beside remote-debug-agent.jar, and done. You have already been able to debug your application remotely.

How to use it in the internet environment
By default, this agent uses the client's IP address as threads' identification to distinguish different invokers, so that many testers can debug remotely in the integration environment at the same time. But if you work in the internet environment or can't fix your IP address for any reason, this default way may not be enough. Like How to make this agent be compatible with more frameworks chapter, you can easily solve this problem by extending DefaultServletAdatper too. Override extractIdentity() method and use getHttpXXX(e.g. getHttpHeader()) method to get other information in the request, you can use any String as the thread's identification.
* Scala Play doesn't use servlet architecture, and I haven't provided any easy way to obtain custom identification yet.

About sql and jdbc driver
You can use http://ip:8098/trace/list?sql=true to get what SQL was excuted by a method. This function depends on which jdbc driver you use. By default, the agent supports oracle and mysql database. If you use other databases, you have to do a little development. Like above chapters, you just need to write a class extends com.github.rdagent.transformer.handler.DefaultJdbcAdapter, and override filterClassName method. Make it return a List contains the prefix of your jdbc driver's package, like "com.mysql", "oracle.jdbc" and son on (E.g. if you use PostgreSql, you should return "org.postgresql". You can unzip your jdbc driver's jar file to check the prefix of package). That's all you need to do for supporting your own database.

remote-debug-agent's People

Contributors

uniquetruth avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

remote-debug-agent's Issues

关于异步线程调用链问题

测试了一下异步线程执行的方法调用情况,好像没有参与调用链,
在controller里开一个线程异步调用service的asyncChain方法,再调到mapper
再调用一个非异步的syncChain方法,再调到mapper

代码如下

Controller.java

    @GetMapping("/asy/")
    public String asyMethod(){
        new Thread(() -> {
            commitDiffService.asyncChain("我去异步调用service方法了");

        }).start();
        commitDiffService.syncChain("我去非异步调用service方法了");
        return "调用service方法结束返回";
    }

Service.java

    public void asyncChain(String name){
        asyChainMapper.async(name);
    }

    public void syncChain(String name){
        asyChainMapper.sync(name);
    }

mapper.java

    public void async(String name){
        System.out.println("异步调用最终走到了Mapper");
    }
    public void sync(String name){
        System.out.println("非异步调用最终走到了Mapper");
    }

最终的调用链如下,从调用链看,没有执行到异步线程的方法


[
	{
		"coverage": "[59,66]",
		"method": "java.lang.String com.chr.commitdiff.controller.CommitDiffController.asyMethod()",
		"calls": [
			{
				"coverage": "[43,45]",
				"method": "void com.chr.commitdiff.service.CommitDiffService.syncChain(java.lang.String)",
				"calls": [
					{
					"coverage": "[19,21]",
					"method": "void com.chr.commitdiff.mapper.AsyChainMapper.sync(java.lang.String)",
					"parameters": [
						"我去非异步调用service方法了"
					],
					"sql": []
					}
				],
				"parameters": [
				       "我去非异步调用service方法了"
				],
				"sql": []
			}
		],
		"return value": "调用service方法结束返回",
		"sql": []
	}
]

疑问:spring项目是怎么过滤掉跟spring相关方法的调用的

想问一下,如果是注入spring项目,那么调用链应该是从 springApplication的main开始吗
比如下面这样

[/CommitDiff111Application.main([Ljava/lang/String;)V] --->
[/CommitDiff111Application$$EnhancerBySpringCGLIB$$a14efe4d.CGLIB$STATICHOOK2()V] --->
[/CommitDiff111Application$$EnhancerBySpringCGLIB$$a14efe4d.CGLIB$STATICHOOK1()V] --->
[/CommitDiff111Application$$EnhancerBySpringCGLIB$$a14efe4d.CGLIB$SET_STATIC_CALLBACKS([Lorg/springframework/cglib/proxy/Callback;)V] --->
[/CommitDiff111Application$$EnhancerBySpringCGLIB$$a14efe4d.CGLIB$BIND_CALLBACKS(Ljava/lang/Object;)V] --->
[/CommitDiff111Application$$EnhancerBySpringCGLIB$$a14efe4d.setBeanFactory(Lorg/springframework/beans/factory/BeanFactory;)V] --->
[/CommitDiff111Application$$EnhancerBySpringCGLIB$$a14efe4d.setBeanFactory(Lorg/springframework/beans/factory/BeanFactory;)V] --->
[/service/impl/ProjectInfoServiceImpl$$EnhancerBySpringCGLIB$$d13cbcc2.CGLIB$STATICHOOK7()V] --->
[/service/impl/ProjectInfoServiceImpl$$EnhancerBySpringCGLIB$$d13cbcc2.setCallbacks([Lorg/springframework/cglib/proxy/Callback;)V] --->
[/service/impl/ProjectInfoServiceImpl$$EnhancerBySpringCGLIB$$d13cbcc2.isFrozen()Z] --->
[/service/impl/ProjectInfoServiceImpl$$EnhancerBySpringCGLIB$$d13cbcc2.getTargetClass()Ljava/lang/Class;] 

但是从获取到的调用链看到,您是过滤掉了这部分内容,想问一下是怎么过滤的

还有个问题,假设项目里依赖的第三方包的包前缀跟 项目业务代码包前缀一样
那么测试在执行业务逻辑代码的时候 ,肯定会走到依赖包,那么依赖包里的调用链也会跟业务方法一样返回吗?
还是说这部分也做了过滤

关于dubbo的rpc调用疑问

流程:服务器111(consumer)接受http请求,请求处理过程中RPC到服务器222(provider)
在consumer和provider都 注入了agent agent参数:/agent.jar=includes=com.yy.*,apiport=8778
发请求到服务器111(consumer)模拟测试
接着获取trace/list,返回结果只包含了consumer的执行链路,没有provider的执行链路

注:我没有通过ip进行标识,是通过在http请求头里写入了标识比如name=zhangsan。发请求模拟测试
http请求(请求头带标识A)访问服务器111被拦截,建立线程A和标识A的绑定关系,dubbo client 根据线程A获取到标识,写入setAttachment,dubbo 服务端(服务器222)从getAttachment获取到标识A,用自己的线程B和标识A的建立绑定关系,
然后发请求去服务器111获取trace/list,为啥服务器222的代码链路没有在trace/list中,trace/list中只有服务器111的链路

trace/list 报错

<title>Error 500 Server Error</title>

HTTP ERROR 500

Problem accessing /trace/list. Reason:

    Server Error

Caused by:

java.lang.NullPointerException

发送 /trace/start 请求后日志里出现WARN

agent注入到服务端,发送 curl http://10.11.16.6/trace/start 后 日志出现如下warn

2022-08-18 19:34:28,900 WARN 10077581 --- [qtp314337396-12] [org.eclipse.jetty.io.ManagedSelector ] [org.eclipse.jetty.util.log.JavaUtilLog:169] : [0||0] java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
org/eclipse/jetty/server/Request.extractMultipartParameters(Lorg/eclipse/jetty/util/MultiMap;)V @14: invokeinterface
Reason:
Type 'java/lang/Object' (current frame, stack[1]) is not assignable to 'java/lang/Throwable'
Current Frame:
bci: @14
flags: { }
locals: { 'org/eclipse/jetty/server/Request', 'org/eclipse/jetty/util/MultiMap', 'java/lang/Object' }
stack: { 'org/eclipse/jetty/util/log/Logger', 'java/lang/Object' }
Bytecode:
0x0000000: 2a2b b702 5c57 a700 164d b201 be2c b902
0x0000010: 4702 00bb 0249 592c b702 4bbf b1
Exception Handler Table:
bci [0, 6] => handler: 9
bci [0, 6] => handler: 9
Stackmap Table:
same_locals_1_stack_item_frame(@9,Object[#4])
same_frame(@28)

本地测试一点问题没有,接入项目不顺利,磕磕碰碰 哈哈

本地测试递归调用,还是栈溢出了

求阶乘,调用1500次,具体多少次我没测试,应该跟跟本机xss配置有关,随手写了1500次,被测应用本身能正确返回,
但是 http://127.0.0.1:8098/trace/list 获取调用链的时候报错

我们公司三方包的包前缀跟项目包前缀一样,注入的时候三方包也会注入探针,如果三方包参与调用,那方法层级应该就比较多了

这样的话,可能就像您之前说的

  1. 通过 excludes 写正则过滤
  2. 加个 maxTrace 参数
  3. 调整jvm xss参数

比较推荐第一点,可能正则比较难写
第2,3 点 公司很多应用都接入的话,也不知道哪些项目啥时候会溢出,所以 这2个参数的值 也不知道设置多少

代码如下

    @GetMapping("/recursion/")
    public String recursionMethod(){
        commitDiff111Service.recursionChain(1500);
        return "递归调用recursionChain方法结束返回";
    }
    public int recursionChain(int n){
        if (n==1){
            return 1;
        }else {
            return recursionChain(n-1)*n;
        }
    }

报错如下

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /trace/list. Reason:
<pre>    Server Error</pre></p><h3>Caused by:</h3><pre>java.lang.StackOverflowError
	at com.google.gson.stream.JsonWriter.beforeValue(JsonWriter.java:641)
	at com.google.gson.stream.JsonWriter.open(JsonWriter.java:326)
	at com.google.gson.stream.JsonWriter.beginObject(JsonWriter.java:309)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:205)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)

。。。。。。。。 提交时gitbug 说  Comment is too long (maximum is 65536 characters)  所以 我把中间的错误堆栈删了

	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:145)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69)
	at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.write(MapTypeAdapterFactory.java:208)
</pre>
<hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/>

</body>
</html>

大佬能否支持一下,把请求信息也返回

如下:

{
        clientIp='127.0.0.1', 
        serverIp='192.168.31.24', 
        requestParamNames=[], 
        requestParamValues=[], 
        requestMethod='GET', 
        requestUrl='http://127.0.0.1:6655/nanyi/m1/'
        requestHeader=RequestHeader{userAgent='apifox/1.0.0 (https://www.apifox.cn)', referer='null', cookie=''}, 
        responseCode='200', 
        responseType='null', 
        error=null, 
        traceVo=[]    // 目前现有的
}

这样的话,测试同学在执行一条测试用例后,就能知道是那个请求对应哪些调用链

添加dubbo调用链的支持

我增加了一个分支,dubbo_invoke_chain,里面添加了dubbo框架下RPC调用的调用链传递支持。单元测试中使用了一个非常简单的网络架构测试通过了(junit案例作为客户端,直连调用服务端的dubbo接口),但尚需要在真实、复杂的环境下测试。

dubbo的调用链传递说明
与HttpServlet类似,客户端发起调用时如果工作线程已与某个身份标识绑定,则使用org.apache.dubbo.rpc.RpcInvocation.setAttachment函数将身份标识写入请求,服务端则优先使用getAttachment方法提取身份标识。
agent的启动参数中增加了参数 dubboLocalIP=true或false ,默认为false。如果设置为true,则客户端发起调用时,如果工作线程未与任何身份标识绑定,则使用org.apache.dubbo.remoting.Endpoint.getLocalAddress().getAddress().getHostAddress()的值做为身份标识,传入setAttachment的参数中。

关于如果屏蔽调用链中的get ,set 方法

你好,目前测试来看调用链数据很大,想屏蔽掉其中的get,set方法 ,目前有2个方案
1,通过excludes指定包来排除,但是这些方法分布在项目中到处都有,可能需要写很多,比如,
excludes=/domain//:/entity//:/model//:/bean//:/dto//:/do//:/vo//:/bo//:*/Param.:/DTO.:/Dt0.:/DO.:/VO.:**/BO. 这样怎么看都显得不太灵活,
2,把有@DaTa注解的类全部排除,也比较麻烦
请问在这里有些什么好的方案吗

获取 /trace/list 报错 NPE

前段时间被拉去做一个项目,一直没时间捣鼓,今天继续测试一上来就出问题了

有点不是太理解 这个调用链是 一个请求一条调用链吗?
点击一个按钮可能是多个请求 那就是返回中有多条调用链?
如果是这样的话,测试在页面上执行一条测试用例,那也会返回多条调用链?

刚操作了很多步骤 然后获取/trace/list 会报这个问题

后来又试了一下 又没报错

2022-10-20 15:46:27.016 |  WARN 9162 | qtp97730845-9 [TID: N/A] org.eclipse.jetty.server.HttpChannel     | /trace/list

java.lang.NullPointerException: null
	at com.github.rdagent.common.Util.getCoverageStr(Util.java:104)
	at com.github.rdagent.common.Util.prepareGeneralObject(Util.java:83)
	at com.github.rdagent.common.Util.prepareGeneralObject(Util.java:96)
	at com.github.rdagent.common.Util.prepareGeneralObject(Util.java:96)
	at com.github.rdagent.common.Util.getJsonTrace(Util.java:51)
	at com.github.rdagent.server.TraceContext$List.doGet(TraceContext.java:93)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:864)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:535)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
	at org.eclipse.jetty.server.handler.ScopedHan

怎么从众多的调用链中快速定位到出问题的方法

目前发现如果应用代码有bug,去查看调用链的时候,由于调用链可能会有很多条记录,可能有的记录很长,要找到出问题的方法,花费时间比较多,在这些很多很长的调用链中怎么快速定位到出问题的代码? 大佬有啥建议吗

docker容器部署应用注入agent,怎么访问

http://ip:8098/trace/start 告知探针开始记录某个调用者的调用链。默认情况下,探针使用调用者的IP地址作为身份标识。例如从IP=10.20.30.40的机器上发送该请求后,通过该机器的浏览器访问被测应用,那么这些访问操作执行的代码将被记录下来

我们应用是docker容器部署的,启动的时候把agent注入进去,然后访问http://ip:8098/trace/start
这里的ip 是容器启动后分配的ip ,还是本机发起请求的ip

我都做了尝试,
1,进入机器 通过curl http://127.0.0.1:8098/trace/list 报错:curl: (56) Recv failure: Connection reset by peer
2,本机浏览器访问 http://10.11.28.194:8098/trace/start (10.11.28.194是容器启动后生成的ip) 无法访问

开始之后点击页面。后端遇到sql执行报错

报错代码:
image

异常信息:
SqlInterceptor Exception : null
java.lang.NullPointerException
at com.github.rdagent.transformer.intercepter.IPmap.traceSql(IPmap.java:369)
at com.github.rdagent.transformer.intercepter.SqlIntercepter.recordSql(SqlIntercepter.java:46)
at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java)
at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:366)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:86)
at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
at sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.intercept(PaginationInterceptor.java:193)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy192.prepare(Unknown Source)
at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.prepareStatement(MybatisSimpleExecutor.java:94)
at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:68)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:165)
at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
at com.sun.proxy.$Proxy191.query(Unknown Source)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:132)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy191.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
at com.sun.proxy.$Proxy135.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:173)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:78)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at com.sun.proxy.$Proxy136.list(Unknown Source)
at com.zt.itd.accurate.test.web.service.impl.UserServiceImpl.list(UserServiceImpl.java:61)
at com.zt.itd.accurate.test.web.controller.UserManageController.list(UserManageController.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.util.AssertionThreadLocalFilter.doFilter(AssertionThreadLocalFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.util.HttpServletRequestWrapperFilter.doFilter(HttpServletRequestWrapperFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:239)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.zt.digital.common.cas.filter.ZtAuthenticationFilter.doFilter(ZtAuthenticationFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
SqlInterceptor Exception : null
java.lang.NullPointerException
at com.github.rdagent.transformer.intercepter.IPmap.traceSql(IPmap.java:369)
at com.github.rdagent.transformer.intercepter.SqlIntercepter.recordSql(SqlIntercepter.java:46)
at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java)
at com.mysql.cj.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:1565)
at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:366)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:86)
at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:88)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:59)
at sun.reflect.GeneratedMethodAccessor69.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
at com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor.intercept(PaginationInterceptor.java:193)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy192.prepare(Unknown Source)
at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.prepareStatement(MybatisSimpleExecutor.java:94)
at com.baomidou.mybatisplus.core.executor.MybatisSimpleExecutor.doQuery(MybatisSimpleExecutor.java:68)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at com.baomidou.mybatisplus.core.executor.MybatisCachingExecutor.query(MybatisCachingExecutor.java:165)
at sun.reflect.GeneratedMethodAccessor73.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
at com.sun.proxy.$Proxy191.query(Unknown Source)
at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:132)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy191.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426)
at com.sun.proxy.$Proxy135.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:173)
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:78)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148)
at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
at com.sun.proxy.$Proxy136.list(Unknown Source)
at com.zt.itd.accurate.test.web.service.impl.UserServiceImpl.list(UserServiceImpl.java:61)
at com.zt.itd.accurate.test.web.controller.UserManageController.list(UserManageController.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.util.AssertionThreadLocalFilter.doFilter(AssertionThreadLocalFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.util.HttpServletRequestWrapperFilter.doFilter(HttpServletRequestWrapperFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:239)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:94)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.zt.digital.common.cas.filter.ZtAuthenticationFilter.doFilter(ZtAuthenticationFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1639)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

是否支持应用间的调用链收集?

比如 app1和app2都注入了agent,且app1和app2通过dubbo实现调用
测试A 点了按钮 ButtonA,走到app1 (ip1)和 app2 (ip2)
收集调用链的时候 http://ip:8098/trace/list 这里的ip是ip1吗? 貌似也不对,不知道怎么收集应用间的调用链
请指点

顺便弱弱问一下,为啥不把 jetty 和 asm的jar包一起打进agent.jar

启动报错Exception in thread "main" java.lang.reflect.InvocationTargetException

我直接命令行里面执行

D:\workspace\gitlab\XXXXXX>java -javaagent:D:\workspace\gitlab\XXXXXX\remote-debug-agent.jar=includes=com.XXXXXX.prd,apiport=9099 -jar XXXXXX.jar

AgentEntrance.premain() was called. +++ agentArgs:includes=com.fofund.prd,apiport=9099
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.RuntimeException: RealAgent reflect exception.
at com.github.rdagent.AgentEntrance.doPremain(AgentEntrance.java:70)
at com.github.rdagent.AgentEntrance.premain(AgentEntrance.java:22)
... 6 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.github.rdagent.AgentEntrance.doPremain(AgentEntrance.java:68)
... 7 more
Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
at com.github.rdagent.transformer.AsmTransformer.(AsmTransformer.java:29)
at com.github.rdagent.RealAgent.doAgentEnter(RealAgent.java:37)
... 12 more
Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at com.github.rdagent.loader.Agent3rdPartyClassloader.loadClass(Agent3rdPartyClassloader.java:273)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 14 more
FATAL ERROR in native method: processing of -javaagent failed

关于注入后 RPC 报错问题

agent注入了项目,然后没有发送 trace/list ,直接去页面操作,报错,抓包发现 RPC其他服务的接口报错
No provider available from registry 其他服务不在注册中心
取消注入,又正常了

覆盖率数据 怎么查看

你好,感谢你的开源项目,我试用了一下,有2点

  1. 就发了一个请求,操作了几次数据库,调用链数据太大了,看了很费劲,set,get 这些感觉不是太重要
  2. 生成的 覆盖率数据 2022_07_31_10_49_25_318.cover 怎么查看,只能看到map数据吗,这样的话看起来也很费劲

你好,能支持访问常用中间件的数据吗

中间件: redis , es ,rocketMQ
比如 点个按钮,执行到某个方法,此方法访问到了redis,从redis获取到了什么值,或者往redis写了啥
再比如,点击某个按钮,执行到某个方法,此往消息队列写了数据,或者从消息队列读了数据
不知道我说明白没有

关于项目中的三方包插桩问题

目前插桩的时候 通过includes=com.yangao.* 来收集这个包下调用链数据,
如果公司中对比如 zk,dubbo,redis 进行了封装也是用 com.yangyao.*来作为包名,
项目中用到这些会通过maven 进行依赖,那么 是否也会收集maven依赖包的调用链
说白了就是 项目的包名跟三方依赖包名一样,会不会也收集到依赖包的调用链

加了 lombok @Data的类,配置在excludes,没有被排除

java -javaagent:/Users/yy/Downloads/code/accurate/remote-debug-agent-master/agent/build/libs/agent.jar=includes=com.yy.*,excludes=@DaTa,apiport=8098 -jar...

@DaTa
public class ProjectInfo implements Serializable {
。。。。
}

image

日志打印如下,按道理这里不应该打印出这个类,这个类加了@DaTa应该被过滤掉了 AppHandler.process.className:com/yy/commitdiff/domain/ProjectInfo

可能就如你之前所说,@DaTa注解生命周期是source,导致不会生效

image

server访问agent的兼容问题

image

报一个bug,如图所示,浏览器如果直接访问agent 发送start、coverage等信息是ok的。但是如果浏览器访问server,server再通过接口访问agent,就会有问题。因为server访问agent这个代码也被agent插桩了,这边没处理好

访问/trace/list没有任何返回

我是不是打开方式不对?

java -javaagent启动也成功了,start也看到start了,调了接口以后,访问trace/list,没看到任何返回

被测应用是dubbo2.x ,注入报错

如果被测应用是dubbo2.x,注入agent的时候,org/apache/dubbo/remoting/exchange/Request.getData() 找不到
我看代码,是在DubboVisitor里面,方法进入的时候调用了 dubbo3.x的方法,是否要做一下兼容

@Override
protected void onMethodEnter() {
         mv.visitVarInsn(Opcodes.ALOAD, 1);
         mv.visitVarInsn(Opcodes.ALOAD, 2);
         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL,
			"org/apache/dubbo/remoting/exchange/Request",
			"getData",
			"()Ljava/lang/Object;", false);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.