Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
1. fix tomcat jar scanner过程中抛出的FileNotFoundException.
2. fix重调用链请求过程中返回码为204时,response中entity可能为空造成的NPE问题
  • Loading branch information
wenqiangzhu committed Nov 16, 2018
1 parent f9b59a3 commit 473a4b3
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ public void beforeDoCap(InvokeChainContext params, Object[] args) {
else {
HttpResponse response = (HttpResponse) args[0];
HttpEntity entity = response.getEntity();
/**
* NOTE:the entity may be null. eg:in the springCloud when registering application into eureka, the
* com.netflix.discovery.DiscoveryClient may return a null.
*/
if (entity == null) {
return;
}
try {
BufferedHttpEntity httpEntityWrapper = new BufferedHttpEntity(entity);
response.setEntity(httpEntityWrapper);
Expand Down Expand Up @@ -114,15 +121,21 @@ public void afterDoCap(InvokeChainContext context, Object[] args) {

slowOperContext.put(SlowOperConstants.PROTOCOL_HTTP_HEADER, getResponHeaders(response));
HttpEntity entity = response.getEntity();
// 由于存在读取失败和无法缓存的大entity会使套壳失败,故此处添加如下判断
if (BufferedHttpEntity.class.isAssignableFrom(entity.getClass())) {
Header header = entity.getContentEncoding();
String encoding = header == null ? "utf-8" : header.getValue();
slowOperContext.put(SlowOperConstants.PROTOCOL_HTTP_BODY, getHttpEntityContent(entity, encoding));
if (entity != null) {
// 由于存在读取失败和无法缓存的大entity会使套壳失败,故此处添加如下判断
if (BufferedHttpEntity.class.isAssignableFrom(entity.getClass())) {
Header header = entity.getContentEncoding();
String encoding = header == null ? "utf-8" : header.getValue();
slowOperContext.put(SlowOperConstants.PROTOCOL_HTTP_BODY,
getHttpEntityContent(entity, encoding));
}
else {
slowOperContext.put(SlowOperConstants.PROTOCOL_HTTP_BODY,
"HttpEntityWrapper failed! Maybe HTTP entity too large to be buffered in memory");
}
}
else {
slowOperContext.put(SlowOperConstants.PROTOCOL_HTTP_BODY,
"HttpEntityWrapper failed! Maybe HTTP entity too large to be buffered in memory");
slowOperContext.put(SlowOperConstants.PROTOCOL_HTTP_BODY, "");
}
}

Expand Down
2 changes: 1 addition & 1 deletion com.creditease.uav.monitorframework.agent/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addClasspath>false</addClasspath>
</manifest>
<manifestEntries>
<Premain-Class>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

package com.creditease.uav.monitorframework.adaptors;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
Expand Down Expand Up @@ -195,7 +196,7 @@ protected Map<String, String> getHookJarMap() {
public void installJar(ClassLoader webapploader, String jarPath, boolean isEnableInject) throws Exception {

ReflectionHelper.invoke(URLClassLoader.class.getName(), webapploader, "addURL", new Class<?>[] { URL.class },
new Object[] { new URL("file:///" + jarPath) }, this.getClass().getClassLoader());
new Object[] { new File(jarPath).toURI().toURL() }, this.getClass().getClassLoader());

if (isEnableInject) {
pool.appendClassPath(jarPath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ com.creditease.uav.interceptlisteners=com.creditease.uav.apm.invokechain.listene
#com.creditease.uav.hookfactory.config gives the configuration of hooks for application framework such as CXF, Spring
#this is a json array
#each elem in this array like: {detect:"<detect class>",jar:"<jar file contains hook>",proxy:"<hook proxy class extends HookProxy>,supports:[<jar file>,<jar file>...]"}
com.creditease.uav.hookfactory.config=[{detect\:"javax.xml.ws.spi.ServiceDelegate",jar\:"com.creditease.uav.hook.jaxws-1.0.jar",proxy\:"com.creditease.uav.hook.jaxws.JaxWSHookProxy"},{detect\:"org.apache.cxf.Bus",jar\:"com.creditease.uav.hook.jaxws-1.0.jar",proxy\:"com.creditease.uav.hook.jaxws.JaxWSCxfHookProxy",adapts:{"org.apache.cxf.frontend.ClientProxy":{"getClient":{args:["java.lang.Object"],target:0}}}},{detect\:"java.sql.DriverManager",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.JdbcHookProxy",adapts:{"com.alibaba.druid.pool.DruidAbstractDataSource":{"validateConnection":{args:["java.sql.Connection"],target:0,class:"com.alibaba.druid.proxy.jdbc.ConnectionProxy",preMethod:"getRawObject()"}},"com.alibaba.druid.pool.DruidDataSource":{"initExceptionSorter":{args:[],target:"driver",class:"java.sql.Driver"},"initValidConnectionChecker":{args:[],target:"driver",class:"java.sql.Driver"}}}},{detect\:"org.apache.http.client.HttpClient",jar\:"com.creditease.uav.hook.httpclients-1.0-sync.jar",proxy\:"com.creditease.uav.hook.httpclients.sync.HttpClientHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"org.apache.commons.httpclient.HttpMethod",jar\:"com.creditease.uav.hook.httpclients-1.0-sync3.jar",proxy\:"com.creditease.uav.hook.httpclients3.sync.HttpClient3HookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"org.apache.http.nio.client.HttpAsyncClient",jar\:"com.creditease.uav.hook.httpclients-1.0-async.jar",proxy\:"com.creditease.uav.hook.httpclients.async.HttpAsyncClientHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"redis.clients.jedis.Jedis",jar\:"com.creditease.uav.hook.redis-1.0-jedis.jar",proxy\:"com.creditease.uav.hook.redis.jedis.JedisHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"com.lambdaworks.redis.RedisClient",jar\:"com.creditease.uav.hook.redis-1.0-lettuce.jar",proxy\:"com.creditease.uav.hook.redis.lettuce.LettuceHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"io.lettuce.core.RedisClient",jar\:"com.creditease.uav.hook.redis-1.0-lettuce5x.jar",proxy\:"com.creditease.uav.hook.redis.lettuce5x.Lettuce5HookProxy"},{detect\:"org.aredis.cache.AsyncRedisClient",jar\:"com.creditease.uav.hook.redis-1.0-aredis.jar",proxy\:"com.creditease.uav.hook.redis.aredis.AredisHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"com.mongodb.Mongo",jar\:"com.creditease.uav.hook.mongoclients-1.0.jar",proxy\:"com.creditease.uav.hook.mongoclients.MongoClientHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"com.rabbitmq.client.Connection",jar\:"com.creditease.uav.hook.mq-1.0-rabbitmq.jar",proxy\:"com.creditease.uav.hook.rabbitmq.RabbitmqHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"com.alibaba.rocketmq.client.MQAdmin",jar\:"com.creditease.uav.hook.mq-1.0-rocketmq.jar",proxy\:"com.creditease.uav.hook.rocketmq.RocketmqHookProxy",supports:["com.creditease.uav.monitorframework.dproxy-1.0-dproxy.jar"]},{detect\:"org.apache.log4j.Logger",jar\:"com.creditease.uav.loghook-1.0.jar",proxy\:"com.creditease.uav.log.hook.Log4jHookProxy"},{detect\:"org.apache.logging.log4j.core.Logger",jar\:"com.creditease.uav.loghook-1.0.jar",proxy\:"com.creditease.uav.log.hook.Log4j2HookProxy"},{detect\:"ch.qos.logback.classic.Logger",jar\:"com.creditease.uav.loghook-1.0.jar",proxy\:"com.creditease.uav.log.hook.LogBackHookProxy"},{detect\:"com.alibaba.dubbo.common.Constants",jar\:"com.creditease.uav.hook.dubbo-1.0.jar",proxy\:"com.creditease.uav.hook.dubbo.DubboHookProxy"},{detect\:"com.mchange.v2.c3p0.C3P0Registry",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.c3p0.C3P0HookProxy"},{detect\:"com.alibaba.druid.Constants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.druid.DruidHookProxy"},{detect\:"org.logicalcobwebs.proxool.ProxoolConstants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.proxool.ProxoolHookProxy"},{detect\:"org.apache.commons.dbcp.DbcpException",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.dbcp.DBCPHookProxy"},{detect\:"org.apache.commons.dbcp2.Constants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.dbcp.DBCPHookProxy"},{detect\:"org.apache.tomcat.dbcp.dbcp2.Constants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.dbcp.DBCPHookProxy"},{detect\:"org.apache.tomcat.jdbc.pool.DataSource",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.tomcatjdbc.TomcatJdbcHookProxy"},{detect\:"com.zaxxer.hikari.HikariConfigMXBean",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.hikari.HikariHookProxy"},{detect\:"org.apache.ibatis.datasource.DataSourceFactory",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.mybatis.MybatisHookProxy"},{detect\:"org.elasticsearch.client.transport.TransportClient",jar\:"com.creditease.uav.hook.esclient-1.0.jar",proxy\:"com.creditease.uav.hook.esclient.transport.TransportHookProxy"},{detect\: "org.apache.kafka.clients.Metadata",jar\: "com.creditease.uav.hook.mq-1.0-kafka.jar",proxy\:"com.creditease.uav.hook.kafka.KafkaHookProxy"}]
com.creditease.uav.hookfactory.config=[{detect\:"javax.xml.ws.spi.ServiceDelegate",jar\:"com.creditease.uav.hook.jaxws-1.0.jar",proxy\:"com.creditease.uav.hook.jaxws.JaxWSHookProxy"},{detect\:"org.apache.cxf.Bus",jar\:"com.creditease.uav.hook.jaxws-1.0.jar",proxy\:"com.creditease.uav.hook.jaxws.JaxWSCxfHookProxy",adapts:{"org.apache.cxf.frontend.ClientProxy":{"getClient":{args:["java.lang.Object"],target:0}}}},{detect\:"java.sql.DriverManager",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.JdbcHookProxy",adapts:{"com.alibaba.druid.pool.DruidAbstractDataSource":{"validateConnection":{args:["java.sql.Connection"],target:0,class:"com.alibaba.druid.proxy.jdbc.ConnectionProxy",preMethod:"getRawObject()"}},"com.alibaba.druid.pool.DruidDataSource":{"initExceptionSorter":{args:[],target:"driver",class:"java.sql.Driver"},"initValidConnectionChecker":{args:[],target:"driver",class:"java.sql.Driver"}}}},{detect\:"org.apache.http.client.HttpClient",jar\:"com.creditease.uav.hook.httpclients-1.0-sync.jar",proxy\:"com.creditease.uav.hook.httpclients.sync.HttpClientHookProxy"},{detect\:"org.apache.commons.httpclient.HttpMethod",jar\:"com.creditease.uav.hook.httpclients-1.0-sync3.jar",proxy\:"com.creditease.uav.hook.httpclients3.sync.HttpClient3HookProxy"},{detect\:"org.apache.http.nio.client.HttpAsyncClient",jar\:"com.creditease.uav.hook.httpclients-1.0-async.jar",proxy\:"com.creditease.uav.hook.httpclients.async.HttpAsyncClientHookProxy"},{detect\:"redis.clients.jedis.Jedis",jar\:"com.creditease.uav.hook.redis-1.0-jedis.jar",proxy\:"com.creditease.uav.hook.redis.jedis.JedisHookProxy"},{detect\:"com.lambdaworks.redis.RedisClient",jar\:"com.creditease.uav.hook.redis-1.0-lettuce.jar",proxy\:"com.creditease.uav.hook.redis.lettuce.LettuceHookProxy"},{detect\:"io.lettuce.core.RedisClient",jar\:"com.creditease.uav.hook.redis-1.0-lettuce5x.jar",proxy\:"com.creditease.uav.hook.redis.lettuce5x.Lettuce5HookProxy"},{detect\:"org.aredis.cache.AsyncRedisClient",jar\:"com.creditease.uav.hook.redis-1.0-aredis.jar",proxy\:"com.creditease.uav.hook.redis.aredis.AredisHookProxy"},{detect\:"com.mongodb.Mongo",jar\:"com.creditease.uav.hook.mongoclients-1.0.jar",proxy\:"com.creditease.uav.hook.mongoclients.MongoClientHookProxy"},{detect\:"com.rabbitmq.client.Connection",jar\:"com.creditease.uav.hook.mq-1.0-rabbitmq.jar",proxy\:"com.creditease.uav.hook.rabbitmq.RabbitmqHookProxy"},{detect\:"com.alibaba.rocketmq.client.MQAdmin",jar\:"com.creditease.uav.hook.mq-1.0-rocketmq.jar",proxy\:"com.creditease.uav.hook.rocketmq.RocketmqHookProxy"},{detect\:"org.apache.log4j.Logger",jar\:"com.creditease.uav.loghook-1.0.jar",proxy\:"com.creditease.uav.log.hook.Log4jHookProxy"},{detect\:"org.apache.logging.log4j.core.Logger",jar\:"com.creditease.uav.loghook-1.0.jar",proxy\:"com.creditease.uav.log.hook.Log4j2HookProxy"},{detect\:"ch.qos.logback.classic.Logger",jar\:"com.creditease.uav.loghook-1.0.jar",proxy\:"com.creditease.uav.log.hook.LogBackHookProxy"},{detect\:"com.alibaba.dubbo.common.Constants",jar\:"com.creditease.uav.hook.dubbo-1.0.jar",proxy\:"com.creditease.uav.hook.dubbo.DubboHookProxy"},{detect\:"com.mchange.v2.c3p0.C3P0Registry",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.c3p0.C3P0HookProxy"},{detect\:"com.alibaba.druid.Constants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.druid.DruidHookProxy"},{detect\:"org.logicalcobwebs.proxool.ProxoolConstants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.proxool.ProxoolHookProxy"},{detect\:"org.apache.commons.dbcp.DbcpException",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.dbcp.DBCPHookProxy"},{detect\:"org.apache.commons.dbcp2.Constants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.dbcp.DBCPHookProxy"},{detect\:"org.apache.tomcat.dbcp.dbcp2.Constants",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.dbcp.DBCPHookProxy"},{detect\:"org.apache.tomcat.jdbc.pool.DataSource",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.tomcatjdbc.TomcatJdbcHookProxy"},{detect\:"com.zaxxer.hikari.HikariConfigMXBean",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.hikari.HikariHookProxy"},{detect\:"org.apache.ibatis.datasource.DataSourceFactory",jar\:"com.creditease.uav.hook.jdbc-1.0.jar",proxy\:"com.creditease.uav.hook.jdbc.pools.mybatis.MybatisHookProxy"},{detect\:"org.elasticsearch.client.transport.TransportClient",jar\:"com.creditease.uav.hook.esclient-1.0.jar",proxy\:"com.creditease.uav.hook.esclient.transport.TransportHookProxy"},{detect\: "org.apache.kafka.clients.Metadata",jar\: "com.creditease.uav.hook.mq-1.0-kafka.jar",proxy\:"com.creditease.uav.hook.kafka.KafkaHookProxy"}]
#REMOVE CXF Hook{detect\:"org.apache.cxf.Bus",jar\:"com.creditease.uav.cxf2.6.plus-1.0.jar",proxy\:"com.creditease.cxfplus.CXFHookProxy"},

#hookfactory is using the application server webappclassloader to hack application framework such as CXF, Spring
Expand Down

0 comments on commit 473a4b3

Please sign in to comment.