From 473a4b32009f2d253d8e6b51b67543fd60ade8e8 Mon Sep 17 00:00:00 2001 From: wenqiangzhu Date: Fri, 16 Nov 2018 12:41:53 +0800 Subject: [PATCH] #443 #444 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. fix tomcat jar scanner过程中抛出的FileNotFoundException. 2. fix重调用链请求过程中返回码为204时,response中entity可能为空造成的NPE问题 --- .../invokeChain/ApacheHttpClientAdapter.java | 27 ++++++++++++++----- .../pom.xml | 2 +- .../adaptors/AbstractAdaptor.java | 3 ++- .../config/uav.properties | 2 +- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/invokeChain/ApacheHttpClientAdapter.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/invokeChain/ApacheHttpClientAdapter.java index 819003fa..e6d97e85 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/invokeChain/ApacheHttpClientAdapter.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/invokeChain/ApacheHttpClientAdapter.java @@ -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); @@ -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, ""); } } diff --git a/com.creditease.uav.monitorframework.agent/pom.xml b/com.creditease.uav.monitorframework.agent/pom.xml index 4de82036..600fd67e 100644 --- a/com.creditease.uav.monitorframework.agent/pom.xml +++ b/com.creditease.uav.monitorframework.agent/pom.xml @@ -50,7 +50,7 @@ - true + false diff --git a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/AbstractAdaptor.java b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/AbstractAdaptor.java index c5ababd7..b7486444 100644 --- a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/AbstractAdaptor.java +++ b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/AbstractAdaptor.java @@ -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; @@ -195,7 +196,7 @@ protected Map 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); diff --git a/com.creditease.uav.monitorframework.buildComponent/config/uav.properties b/com.creditease.uav.monitorframework.buildComponent/config/uav.properties index 4124fb58..44cf8497 100644 --- a/com.creditease.uav.monitorframework.buildComponent/config/uav.properties +++ b/com.creditease.uav.monitorframework.buildComponent/config/uav.properties @@ -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:"",jar:"",proxy:",supports:[,...]"} -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