From 5398f56fc5d51a4fb84ace65df53966c6a7636c8 Mon Sep 17 00:00:00 2001 From: xingShengLi Date: Fri, 6 Jul 2018 15:20:05 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E5=9C=A8apphubManager=E5=A4=9A=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E5=A4=84=E7=90=86=E5=A4=A7=E9=87=8Fhttp=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=97=B6=EF=BC=8C=20=201.=E5=A2=9E=E5=8A=A0=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=8B=92=E7=BB=9D=E7=AD=96=E7=95=A5=EF=BC=8C=20=202.?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E5=8A=A0=E5=A4=A7=E9=98=9F=E5=88=97=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=EF=BC=8C=20=203.=E5=90=AF=E5=8A=A8=E6=97=B6=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=AF=B7=E6=B1=82=E5=92=8C=E7=9B=B8=E5=BA=94=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=97=B6=E9=97=B4=EF=BC=8C=20=20=20=20=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E4=BB=A3=E7=A0=81=E5=9C=A8=E5=A4=84=E7=90=86=E5=A4=A7?= =?UTF-8?q?=E9=87=8Fhttp=E8=AF=B7=E6=B1=82=E6=97=B6=E7=9A=84=E5=81=A5?= =?UTF-8?q?=E5=A3=AE=E6=80=A7.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- com.creditease.uav.healthmanager.buildComponent/bin/run.sh | 2 +- .../config/agent.properties | 2 +- .../src/main/java/com/creditease/uav/feature/AppHubManager.java | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/com.creditease.uav.healthmanager.buildComponent/bin/run.sh b/com.creditease.uav.healthmanager.buildComponent/bin/run.sh index 36378784..9de039d0 100644 --- a/com.creditease.uav.healthmanager.buildComponent/bin/run.sh +++ b/com.creditease.uav.healthmanager.buildComponent/bin/run.sh @@ -27,7 +27,7 @@ export CLASSPATH=bin/com.creditease.uav.base-1.0-boot.jar echo $CLASSPATH javaAgent="-javaagent:../uavmof/com.creditease.uav.agent/com.creditease.uav.monitorframework.agent-1.0-agent.jar" javaOpts="-server -Xms256m -Xss256k -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=10 -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:-CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSInitiatingOccupancyFraction=70 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=." -$executeJava $javaAgent $3 $javaOpts -XX:OnOutOfMemoryError='kill -9 %p' -DNetCardIndex=0 -DJAppID=$1 -DJAppGroup=UAV -classpath $CLASSPATH com.creditease.mscp.boot.MSCPBoot -p $2 & +$executeJava $javaAgent $3 $javaOpts -XX:OnOutOfMemoryError='kill -9 %p' -DNetCardIndex=0 -DJAppID=$1 -DJAppGroup=UAV -Dsun.net.httpserver.maxReqTime=300 -Dsun.net.httpserver.maxRspTime=300 -classpath $CLASSPATH com.creditease.mscp.boot.MSCPBoot -p $2 & # add crontab process watcher if [ "$proc_watcher" == "yes" ]; then diff --git a/com.creditease.uav.healthmanager.buildComponent/config/agent.properties b/com.creditease.uav.healthmanager.buildComponent/config/agent.properties index 15f2b836..aa797753 100644 --- a/com.creditease.uav.healthmanager.buildComponent/config/agent.properties +++ b/com.creditease.uav.healthmanager.buildComponent/config/agent.properties @@ -271,7 +271,7 @@ feature.apphubmanager.http.port=8011 feature.apphubmanager.http.backlog=10 feature.apphubmanager.http.core=10 feature.apphubmanager.http.max=50 -feature.apphubmanager.http.bqsize=10 +feature.apphubmanager.http.bqsize=100 #feature.DBSource.AppHubMgt feature.apphubmanager.ds.enable=true feature.apphubmanager.ds.servers=127.0.0.1:27017 diff --git a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/AppHubManager.java b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/AppHubManager.java index a421dd8a..d045973a 100644 --- a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/AppHubManager.java +++ b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/AppHubManager.java @@ -60,6 +60,8 @@ public void start() { @SuppressWarnings({ "rawtypes", "unchecked" }) ThreadPoolExecutor exe = new ThreadPoolExecutor(core, max, 30000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(bqsize)); + // 调用线程执行多余任务 + exe.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); apphubManagerServerListenWorker.start(exe, port, backlog); if (log.isTraceEnable()) { From d20dc379ff7353e7b33103efa8d8f4acc2dc882e Mon Sep 17 00:00:00 2001 From: wenqiangzhu Date: Fri, 13 Jul 2018 11:24:05 +0800 Subject: [PATCH 02/17] #339 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/uavorg/uavstack/issues/339 日志归集优化,对于没有开启归集的日志文件不进行读取 --- .../creditease/agent/feature/LogAgent.java | 11 +++++++ .../logagent/ReliableTaildirEventReader.java | 29 +++++++++++++++++-- .../feature/logagent/TaildirLogComponent.java | 12 +++++++- .../logagent/far/DefaultLogFilterAndRule.java | 17 +++++++++++ .../ReliableTaildirEventReader.java | 6 +++- .../handlers/NewLogDataMessageHandler.java | 5 ++-- 6 files changed, 73 insertions(+), 7 deletions(-) diff --git a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/LogAgent.java b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/LogAgent.java index 5405f0a7..e9ac29bf 100644 --- a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/LogAgent.java +++ b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/LogAgent.java @@ -28,11 +28,13 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import com.alibaba.fastjson.JSON; @@ -76,6 +78,9 @@ public class LogAgent extends AgentFeatureComponent { @SuppressWarnings("rawtypes") private Map logCfgMapping = new ConcurrentHashMap<>(); + // 存储刚刚开启归集的日志文件绝对路径,用于调整文件读取开始位置 + private Set newTailFiles = Collections.synchronizedSet(new HashSet()); + private int spantime = 100; /** @@ -728,6 +733,11 @@ public AppLogPatternInfoCollection getLatestLogProfileDataMap() { return LatestLogProfileDataMap; } + public Set getNewTailFileSet() { + + return newTailFiles; + } + public AppLogPatternInfoCollection getIssueLogProfileDataMap() { return IssueLogProfileDataMap; @@ -807,6 +817,7 @@ private void updateAllStrategy(String stragetyJson) { mapping.put("absPath", logPath); logCfgMapping.put(lcfg.getUUID(), mapping); + newTailFiles.add(new File(logPath).getAbsolutePath()); LogFilterAndRule lfar = new DefaultLogFilterAndRule(filter, separator, JSON.parseObject(fields), 0, 0); RuleFilterFactory.getInstance().pubLogFilterAndRule(logPath, lfar); } diff --git a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/ReliableTaildirEventReader.java b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/ReliableTaildirEventReader.java index 44987c64..ed6dbf45 100644 --- a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/ReliableTaildirEventReader.java +++ b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/ReliableTaildirEventReader.java @@ -38,6 +38,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Random; +import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -401,6 +402,24 @@ else if (logPatternInfo2.getFlag() == StateFlag.EXIST) { long inode = getInode(f); removeInvalidTFInode(f, inode); TailFile tf = tailFiles.get(inode); + + /** + * 如果是刚刚开启日志归集那么跳到文件尾部进行归集 + */ + Set newTailFileSet = logagent.getNewTailFileSet(); + if (newTailFileSet.contains(f.getAbsolutePath())) { + newTailFileSet.remove(f.getAbsolutePath()); + if (tf != null && tf.getRaf() != null) { + tf.getRaf().seek(f.length()); + } + else if (tf != null) { + tf.setPos(f.length()); + } + else { + skipToEnd = true; + } + } + if (tf == null || !tf.getPath().equals(f.getAbsolutePath())) { long startPos = skipToEnd ? f.length() : 0;// 第一次读取从头开始读 // how to get line's number ? @@ -414,7 +433,7 @@ else if (logPatternInfo2.getFlag() == StateFlag.EXIST) { tf.setAppUrl(appurl); } else { - boolean updated = tf.getLastUpdated() < f.lastModified(); + boolean updated = tf.getLastUpdated() < f.lastModified() || tf.getPos() < f.length(); if (updated) { if (tf.getRaf() == null) {// 获取文件的读取手柄 tf = openFile(serverid, appid, logid, f, headers, inode, tf.getPos(), tf.getNum()); @@ -423,7 +442,7 @@ else if (logPatternInfo2.getFlag() == StateFlag.EXIST) { if (f.length() < tf.getPos()) { // 文件的长度小于上次读取的指针说明文件内容被删除了,改成从0读取 logger.info(this, "Pos " + tf.getPos() + " is larger than file size! " + "Restarting from pos 0, file: " + tf.getPath() + ", inode: " + inode); - tf.updatePos(tf.getPath(), inode, 0, 0); + tf.updatePos(tf.getPath(), inode, 0, tf.getNum()); } } tf.setNeedTail(updated);// 设置是否需要监控指标 @@ -442,12 +461,16 @@ else if (logPatternInfo2.getFlag() == StateFlag.EXIST) { /** * @param f * @param inodeCurrent + * @throws IOException */ - private void removeInvalidTFInode(File f, long inodeCurrent) { + private void removeInvalidTFInode(File f, long inodeCurrent) throws IOException { for (Long inodeKey : tailFiles.keySet()) { TailFile tf = tailFiles.get(inodeKey); if (tf.getPath().equals(f.getAbsolutePath()) && inodeKey != inodeCurrent) { tailFiles.remove(inodeKey); + if (tf.getRaf() != null) { + tf.getRaf().close(); + } } } } diff --git a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/TaildirLogComponent.java b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/TaildirLogComponent.java index c81ba5e6..fc46433d 100644 --- a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/TaildirLogComponent.java +++ b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/TaildirLogComponent.java @@ -54,10 +54,12 @@ import com.creditease.agent.feature.LogAgent; import com.creditease.agent.feature.logagent.api.LogFilterAndRule; import com.creditease.agent.feature.logagent.event.Event; +import com.creditease.agent.feature.logagent.far.DefaultLogFilterAndRule; import com.creditease.agent.feature.logagent.objects.LogDataElement; import com.creditease.agent.feature.logagent.objects.LogDataFrame; import com.creditease.agent.feature.logagent.objects.LogPatternInfo; import com.creditease.agent.helpers.NetworkHelper; +import com.creditease.agent.helpers.StringHelper; import com.creditease.agent.log.api.ISystemLogger; import com.creditease.agent.monitor.api.MonitorDataFrame; import com.creditease.agent.monitor.api.NotificationEvent; @@ -374,6 +376,15 @@ public Map> tailFileProcessSeprate(TailFile tf, boolean back public void tailFileCommon(TailFile tf, boolean backoffWithoutNL, Map> serverlogs) throws IOException, InterruptedException { + LogFilterAndRule main = RuleFilterFactory.getInstance().getLogFilterAndRule(tf.getPath()); + + if (main instanceof DefaultLogFilterAndRule) { + DefaultLogFilterAndRule defaultMain = (DefaultLogFilterAndRule) main; + if (StringHelper.isEmpty(defaultMain.getFilterPattern().pattern())) { + log.info(this, tf.getPath() + " collection not enable!"); + return; + } + } long current = System.currentTimeMillis(); boolean isEvents = false; // while (true) { @@ -385,7 +396,6 @@ public void tailFileCommon(TailFile tf, boolean backoffWithoutNL, Map aids = RuleFilterFactory.getInstance().getAidLogFilterAndRuleList(tf.getPath()); List datalog = RuleFilterFactory.getInstance().createChain(reader, batchSize) .setMainLogFilterAndRule(main).setAidLogFilterAndRuleList(aids).doProcess(events, backoffWithoutNL); diff --git a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/far/DefaultLogFilterAndRule.java b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/far/DefaultLogFilterAndRule.java index 391d5ac1..d0d19fd4 100644 --- a/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/far/DefaultLogFilterAndRule.java +++ b/com.creditease.uav.agent/src/main/java/com/creditease/agent/feature/logagent/far/DefaultLogFilterAndRule.java @@ -184,4 +184,21 @@ public int getVersion() { return version; } + /** + * @return the filterPattern + */ + public Pattern getFilterPattern() { + + return filterPattern; + } + + /** + * @param filterPattern + * the filterPattern to set + */ + public void setFilterPattern(Pattern filterPattern) { + + this.filterPattern = filterPattern; + } + } diff --git a/com.creditease.uav.collect/src/main/java/com/creditease/uav/collect/client/copylogagent/ReliableTaildirEventReader.java b/com.creditease.uav.collect/src/main/java/com/creditease/uav/collect/client/copylogagent/ReliableTaildirEventReader.java index 252e6b7a..72fc41f5 100644 --- a/com.creditease.uav.collect/src/main/java/com/creditease/uav/collect/client/copylogagent/ReliableTaildirEventReader.java +++ b/com.creditease.uav.collect/src/main/java/com/creditease/uav/collect/client/copylogagent/ReliableTaildirEventReader.java @@ -219,12 +219,16 @@ else if (logPatternInfo2.getFlag() == StateFlag.EXIST) { /** * @param f * @param inodeCurrent + * @throws IOException */ - private void removeInvalidTFInode(File f, long inodeCurrent) { + private void removeInvalidTFInode(File f, long inodeCurrent) throws IOException { for (Long inodeKey : tailFiles.keySet()) { TailFile tf = tailFiles.get(inodeKey); if (tf.getPath().equals(f.getAbsolutePath()) && inodeKey != inodeCurrent) { tailFiles.remove(inodeKey); + if (tf.getRaf() != null) { + tf.getRaf().close(); + } } } } diff --git a/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/handlers/NewLogDataMessageHandler.java b/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/handlers/NewLogDataMessageHandler.java index 3a620b0f..4a6facd8 100644 --- a/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/handlers/NewLogDataMessageHandler.java +++ b/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/handlers/NewLogDataMessageHandler.java @@ -202,7 +202,8 @@ private void pushLogLineToBulkRequest(MonitorDataFrame mdf, String appid, String */ String logFileType = logFileName; StringBuilder uuidStr = new StringBuilder(); - uuidStr.append(ipport).append(mdf.getServerId()).append("-").append(appid).append("-").append(logid); + uuidStr.append(ipport).append(mdf.getServerId()).append("-").append(appid).append("-").append(logid) + .append("-").append(lnum); if (line.containsKey("content")) { logFileType += "_def"; uuidStr.append("-").append(line.get("content")); @@ -215,7 +216,7 @@ private void pushLogLineToBulkRequest(MonitorDataFrame mdf, String appid, String } /** - * 保证不重复:IP+SvrID+AppID+LogFileName+日志内容(def下为content) + * 保证不重复:IP+SvrID+AppID+LogFileName+lineNum+日志内容(def下为content) */ String uuid = EncodeHelper.encodeMD5(uuidStr.toString()); From 8de2edfced6ab668b1a5aa731eac76e4e1d62271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E6=B0=B8=E5=BD=AA?= Date: Mon, 16 Jul 2018 17:50:48 +0800 Subject: [PATCH 03/17] =?UTF-8?q?https://github.com/uavorg/uavstack/issues?= =?UTF-8?q?/342=20=E6=94=AF=E6=8C=81TomcatJdbc=207.0.19-9.0.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- com.creditease.uav.hook.jdbc/pom.xml | 7 ++ .../uav/hook/jdbc/JdbcHookProxy.java | 96 ++++++++++++++--- .../hook/jdbc/interceptors/JdbcDriverIT.java | 48 ++++++++- .../pools/tomcatjdbc/TomcatJdbcHookProxy.java | 100 ++++++++++++++++++ .../tomcatjdbc/interceptors/TomcatJdbcIT.java | 48 +++++++++ .../config/uav.properties | 2 +- 6 files changed, 278 insertions(+), 23 deletions(-) create mode 100644 com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/TomcatJdbcHookProxy.java create mode 100644 com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/interceptors/TomcatJdbcIT.java diff --git a/com.creditease.uav.hook.jdbc/pom.xml b/com.creditease.uav.hook.jdbc/pom.xml index 2ee284e1..80d4f832 100644 --- a/com.creditease.uav.hook.jdbc/pom.xml +++ b/com.creditease.uav.hook.jdbc/pom.xml @@ -46,6 +46,13 @@ 1.0.0 provided + + + org.apache.tomcat + tomcat-jdbc + 7.0.19 + provided + diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java index 38963dc2..93ee4f83 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/JdbcHookProxy.java @@ -45,6 +45,7 @@ public class JdbcHookProxy extends HookProxy { @SuppressWarnings("rawtypes") public JdbcHookProxy(String id, Map config) { + super(id, config); dpInstall = new DynamicProxyInstaller(); } @@ -60,6 +61,7 @@ public void start(HookContext context, ClassLoader webapploader) { this.injectDriverManager(webapploader, ic); this.injectDBCP2(webapploader, ic); this.injectTomcatDBCP2(webapploader, ic); + this.injectTomcatJdbc(webapploader, ic); this.injectHikari(webapploader, ic); this.injectDruid(webapploader, ic); break; @@ -70,6 +72,7 @@ public void start(HookContext context, ClassLoader webapploader) { this.injectDriverManager(webapploader, ic); this.injectDBCP2(webapploader, ic); this.injectTomcatDBCP2(webapploader, ic); + this.injectTomcatJdbc(webapploader, ic); this.injectHikari(webapploader, ic); this.injectDruid(webapploader, ic); break; @@ -139,7 +142,7 @@ private void injectDataSource(InterceptContext ic) { return; } - if (isHookEventDone("isInjectDataSource")) { + if (isHookEventDone("isInjectDataSource" + resObj.hashCode())) { return; } @@ -169,6 +172,10 @@ private void injectDataSource(InterceptContext ic) { */ private void injectTomcatDBCP2(ClassLoader webapploader, InterceptContext ic) { + if (isHookEventDone("isInjectTomcatDBCP2")) { + return; + } + try { webapploader.loadClass("org.apache.tomcat.dbcp.dbcp2.Constants"); } @@ -176,10 +183,6 @@ private void injectTomcatDBCP2(ClassLoader webapploader, InterceptContext ic) { return; } - if (isHookEventDone("isInjectTomcatDBCP2")) { - return; - } - final String appid = this.getAppID(ic); /** @@ -221,6 +224,10 @@ public void process(DPMethod m) throws Exception { */ private void injectDBCP2(ClassLoader webapploader, InterceptContext ic) { + if (isHookEventDone("isInjectDBCP2")) { + return; + } + try { webapploader.loadClass("org.apache.commons.dbcp2.Constants"); } @@ -228,10 +235,6 @@ private void injectDBCP2(ClassLoader webapploader, InterceptContext ic) { return; } - if (isHookEventDone("isInjectDBCP2")) { - return; - } - final String appid = this.getAppID(ic); /** @@ -264,24 +267,83 @@ public void process(DPMethod m) throws Exception { } /** - * inject Hikari + * inject TomcatJdbc, 支持7.0.19-9.0.10 * * @param webapploader * @param ic */ - private void injectHikari(ClassLoader webapploader, InterceptContext ic) { + private void injectTomcatJdbc(ClassLoader webapploader, InterceptContext ic) { + + if (isHookEventDone("isInjecTomcatJdbc")) { + return; + } try { - webapploader.loadClass("com.zaxxer.hikari.HikariConfigMXBean"); + webapploader.loadClass("org.apache.tomcat.jdbc.pool.jmx.ConnectionPoolMBean"); } catch (ClassNotFoundException e) { return; } + final String appid = this.getAppID(ic); + + final String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); + + dpInstall.setTargetClassLoader(webapploader); + + dpInstall + .installProxy("org.apache.tomcat.jdbc.pool.DataSourceProxy", + new String[] { "com.creditease.uav.hook.jdbc.interceptors", + "com.creditease.uav.hook.jdbc.pools.tomcatjdbc.interceptors" }, + new DynamicProxyProcessor() { + + @Override + public void process(DPMethod m) throws Exception { + + if ("getConnection".equals(m.getName())) { + + dpInstall.defineLocalVal(m, "mObj", JdbcDriverIT.class); + m.insertBefore("{mObj=new JdbcDriverIT(\"" + appid + + "\");mObj.setJDBCUrl(this.getUrl());new TomcatJdbcIT(\"" + contextPath + + "\",this);}"); + m.insertAfter("{$_=mObj.doProxyConnection($_);}"); + + } + else if ("getConnectionAsync".equals(m.getName())) { + + dpInstall.defineLocalVal(m, "mObj", JdbcDriverIT.class); + m.insertBefore("{mObj=new JdbcDriverIT(\"" + appid + + "\");mObj.setJDBCUrl(this.getUrl());new TomcatJdbcIT(\"" + contextPath + + "\",this);}"); + m.insertAfter("{$_=mObj.doAsyncProxyConnection($_);}"); + + } + } + }, false); + + // release loader + dpInstall.releaseTargetClassLoader(); + } + + /** + * inject Hikari + * + * @param webapploader + * @param ic + */ + private void injectHikari(ClassLoader webapploader, InterceptContext ic) { + if (isHookEventDone("isInjectHikari")) { return; } + try { + webapploader.loadClass("com.zaxxer.hikari.HikariConfigMXBean"); + } + catch (ClassNotFoundException e) { + return; + } + final String appid = this.getAppID(ic); final String contextPath = (String) ic.get(InterceptConstants.CONTEXTPATH); @@ -292,7 +354,7 @@ private void injectHikari(ClassLoader webapploader, InterceptContext ic) { dpInstall.setTargetClassLoader(webapploader); /** - * inject DBCP2 BasicDataSource + * inject HikariDataSource */ dpInstall .installProxy("com.zaxxer.hikari.HikariDataSource", @@ -329,6 +391,10 @@ public void process(DPMethod m) throws Exception { */ private void injectDruid(ClassLoader webapploader, InterceptContext ic) { + if (isHookEventDone("isInjectDruid")) { + return; + } + /** * check if there is druid, god, so sad we are in china, we have to support alibaba druid */ @@ -339,10 +405,6 @@ private void injectDruid(ClassLoader webapploader, InterceptContext ic) { return; } - if (isHookEventDone("isInjectDruid")) { - return; - } - final String appid = this.getAppID(ic); /** diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/interceptors/JdbcDriverIT.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/interceptors/JdbcDriverIT.java index 7030db83..4702ec86 100644 --- a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/interceptors/JdbcDriverIT.java +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/interceptors/JdbcDriverIT.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.Future; import javax.naming.RefAddr; import javax.naming.Reference; @@ -137,6 +138,31 @@ public Object postProcess(Object res, Driver t, Object proxy, Method method, Obj } + @SuppressWarnings("rawtypes") + private class FutureProxyInvokeProcessor extends JDKProxyInvokeProcessor { + + @Override + public void preProcess(Future t, Object proxy, Method method, Object[] args) { + + // ignore + } + + @Override + public void catchInvokeException(Future t, Object proxy, Method method, Object[] args, Throwable e) { + + // ignore + } + + @Override + public Object postProcess(Object res, Future t, Object proxy, Method method, Object[] args) { + + if (method.getName().equals("get")) { + return doProxyConnection(res); + } + return res; + } + } + /** * * ConnectionProxy description: to install Statement Proxy @@ -213,6 +239,7 @@ public StatementProxy() { } public StatementProxy(String action, String sql) { + this.sql = sql; this.action = action; } @@ -392,6 +419,7 @@ private void doCap(T t, int rc, Throwable throwable, Method method, Object res) private String targetServer = "unknown"; public JdbcDriverIT(String appid) { + this.appid = appid; } @@ -549,15 +577,15 @@ else if (startsWithIgnoreCase(sql, "delete")) { } return action; } - + private boolean startsWithIgnoreCase(String str, String prefix) { - str=str.trim(); - if(str.length() -1) { return p; } + @SuppressWarnings("rawtypes") + public Future doAsyncProxyConnection(Object res) { + + Future f = (Future) res; + + f = JDKProxyInvokeUtil.newProxyInstance(this.getClass().getClassLoader(), new Class[] { Future.class }, + new JDKProxyInvokeHandler(f, new FutureProxyInvokeProcessor())); + return f; + } + private void findSqlConnectionClass(String clsName, ClassLoader cl, Set> connectionInterfaces) { try { diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/TomcatJdbcHookProxy.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/TomcatJdbcHookProxy.java new file mode 100644 index 00000000..1f61fe15 --- /dev/null +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/TomcatJdbcHookProxy.java @@ -0,0 +1,100 @@ +/*- + * << + * UAVStack + * == + * Copyright (C) 2016 - 2017 UAVStack + * == + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * >> + */ + +package com.creditease.uav.hook.jdbc.pools.tomcatjdbc; + +import java.util.Map; + +import javax.sql.DataSource; + +import com.creditease.agent.helpers.ReflectionHelper; +import com.creditease.monitor.captureframework.spi.MonitorElement; +import com.creditease.monitor.captureframework.spi.MonitorElementInstance; +import com.creditease.uav.hook.jdbc.pools.AbsDBPoolHookProxy; + +/** + * + * TomcatJdbcHookProxy description: 支持TomcatJdbc 7.0.19-9.0.10 + * + */ +public class TomcatJdbcHookProxy extends AbsDBPoolHookProxy { + + private static final String MTRX_PREFIX = "EXT_tomcatjdbc_"; + + @SuppressWarnings("rawtypes") + public TomcatJdbcHookProxy(String id, Map config) { + + super(id, config); + } + + @Override + protected void collectDBPoolMetrics(MonitorElement clientElem) { + + if (this.datasources.size() == 0) { + return; + } + + for (DataSource ds : this.datasources) { + + String jdbcURL = (String) ReflectionHelper.invoke(ds.getClass().getName(), ds, "getUrl", null, null, + ds.getClass().getClassLoader()); + + /** + * 匹配客户端应用 + */ + MonitorElementInstance inst = this.matchElemInstance(clientElem, jdbcURL); + + if (inst == null) { + continue; + } + + collectDataSourceStat(inst, ds); + } + } + + /** + * collectDataSourceStat + * + * @param inst + * @param ds + */ + private void collectDataSourceStat(MonitorElementInstance inst, DataSource ds) { + + String[] collectMtrx = new String[] { "NumActive", "NumIdle", "MaxActive", "MaxIdle", "MinIdle", "MaxWait", + "InitialSize", "NumTestsPerEvictionRun", "NumTestsPerEvictionRun", "TimeBetweenEvictionRunsMillis", + "RemoveAbandonedTimeout", "MinEvictableIdleTimeMillis" }; + + String prefix = "get"; + String className = ds.getClass().getName(); + + for (int i = 0; i < collectMtrx.length; i++) { + + Object val = ReflectionHelper.invoke(className, ds, prefix + collectMtrx[i], null, null, + this.getClass().getClassLoader()); + + if (val == null) { + continue; + } + + inst.setValue(MTRX_PREFIX + collectMtrx[i], val); + } + } + +} diff --git a/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/interceptors/TomcatJdbcIT.java b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/interceptors/TomcatJdbcIT.java new file mode 100644 index 00000000..81a12784 --- /dev/null +++ b/com.creditease.uav.hook.jdbc/src/main/java/com/creditease/uav/hook/jdbc/pools/tomcatjdbc/interceptors/TomcatJdbcIT.java @@ -0,0 +1,48 @@ +/*- + * << + * UAVStack + * == + * Copyright (C) 2016 - 2017 UAVStack + * == + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * >> + */ + +package com.creditease.uav.hook.jdbc.pools.tomcatjdbc.interceptors; + +import javax.sql.DataSource; + +import com.creditease.monitor.appfra.hook.spi.HookFactory; +import com.creditease.monitor.interceptframework.InterceptSupport; +import com.creditease.uav.appserver.listeners.AppFrkHookFactoryListener; +import com.creditease.uav.hook.jdbc.pools.AbsDBPoolHookProxy; + +public class TomcatJdbcIT { + + public TomcatJdbcIT(String contextPath, Object ds) { + + if (!DataSource.class.isAssignableFrom(ds.getClass())) { + return; + } + + AppFrkHookFactoryListener listener = (AppFrkHookFactoryListener) InterceptSupport.instance() + .getEventListener(AppFrkHookFactoryListener.class); + HookFactory hf = listener.getHookFactory(); + // 依赖HookFactory.getHookProxyKey的实现 + String proxyId = "com.creditease.uav.hook.jdbc.pools.tomcatjdbc.TomcatJdbcHookProxy@" + contextPath; + AbsDBPoolHookProxy hookProxy = (AbsDBPoolHookProxy) hf.getHook(proxyId); + + hookProxy.registerDataSource((DataSource) ds); + + } +} diff --git a/com.creditease.uav.monitorframework.buildComponent/config/uav.properties b/com.creditease.uav.monitorframework.buildComponent/config/uav.properties index e5bf7a18..9f85a9e8 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\:"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\:"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",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\:"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"}] #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 #com.creditease.uav..hookfactory is the class extends HooKFactory, is the application server vendor name such as tomcat From 97b45b663a7fcc86a0d51520d2d3434bc50a2448 Mon Sep 17 00:00:00 2001 From: duandehua Date: Thu, 19 Jul 2018 15:41:48 +0800 Subject: [PATCH 04/17] https://github.com/uavorg/uavstack/issues/344 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、应用监控中应用集群性能下的每个应用实例性能可链接到各自性能页面 https://github.com/uavorg/uavstack/issues/345 非admin账户的windows流量采集,无法获取网卡设备列表出现数组越界 --- .../procdetectagent/NetworkIoDetector.java | 9 ++++++--- .../uavapp_godeye/appmonitor/js/uav.appmonitor.js | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/com.creditease.uav.agent.heartbeat/src/main/java/com/creditease/agent/feature/procdetectagent/NetworkIoDetector.java b/com.creditease.uav.agent.heartbeat/src/main/java/com/creditease/agent/feature/procdetectagent/NetworkIoDetector.java index dd90c00b..23a87ca1 100644 --- a/com.creditease.uav.agent.heartbeat/src/main/java/com/creditease/agent/feature/procdetectagent/NetworkIoDetector.java +++ b/com.creditease.uav.agent.heartbeat/src/main/java/com/creditease/agent/feature/procdetectagent/NetworkIoDetector.java @@ -60,8 +60,8 @@ public void run() { // windows if (JVMToolHelper.isWindows()) { - - JpcapCaptor jpcap =null; + + JpcapCaptor jpcap = null; try { String Local_ip = "/" + ip; // 存端口流量 @@ -73,6 +73,9 @@ public void run() { } // 获取网卡设备列表 NetworkInterface[] devices = JpcapCaptor.getDeviceList(); + if (devices == null || devices.length == 0) { + return; + } // 确定网卡设备接口 boolean true_devices = false; int i = 0; @@ -101,7 +104,7 @@ public void run() { log.err(this, "NetworkIo Monitor runs FAIL.", e); } finally { - if(jpcap!=null) { + if (jpcap != null) { // 关闭 jpcap.close(); } diff --git a/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.appmonitor.js b/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.appmonitor.js index 5cb68794..ddd96e45 100644 --- a/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.appmonitor.js +++ b/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.appmonitor.js @@ -3672,8 +3672,21 @@ var mvcObj={ var appInstMO=app.mdata("monitor.app")[appInstId]; + var id=appInstMO["appgroup"]+"@"+appInstId; + if(id.indexOf("---")>0){ + + id=id.substring(0,id.indexOf("---")); + if(id.lastIndexOf("/")"); - sb.append("
"+appInstPO["name"]+""+appInstPO["instid"]+"
"); + sb.append("
"+appInstPO["name"]+""+appInstPO["instid"]+"
"); sb.append("
"); // JSE From b6f716e3b3ed4418fe1748fbdfa3567f58c62cc3 Mon Sep 17 00:00:00 2001 From: xiaolong Date: Fri, 20 Jul 2018 14:26:54 +0800 Subject: [PATCH 05/17] =?UTF-8?q?https://github.com/uavorg/uavstack/issues?= =?UTF-8?q?/347=201.=E4=BC=98=E5=8C=96getInfoFromSliceCache=E7=9A=84redis?= =?UTF-8?q?=20lpop=E6=93=8D=E4=BD=9C,=E5=90=88=E7=90=86=E7=9A=84=E5=87=8F?= =?UTF-8?q?=E5=B0=91lpop=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runtimenotify/task/JudgeNotifyTaskForTimer.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/task/JudgeNotifyTaskForTimer.java b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/task/JudgeNotifyTaskForTimer.java index f8de278d..19df9328 100644 --- a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/task/JudgeNotifyTaskForTimer.java +++ b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/runtimenotify/task/JudgeNotifyTaskForTimer.java @@ -21,11 +21,13 @@ package com.creditease.uav.feature.runtimenotify.task; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import com.creditease.agent.helpers.DateTimeHelper; import com.creditease.agent.helpers.JSONHelper; import com.creditease.agent.helpers.NetworkHelper; import com.creditease.agent.helpers.StringHelper; @@ -224,10 +226,14 @@ private String formatInstance(String instance) { } private Map getInfoFromSliceCache(String instance) { + + int min = Integer.parseInt(DateTimeHelper.dateFormat(new Date(), "m")); + min = min > 0 ? min - 1 : 0; + String cacheKey = "SLICE_" + instance + "_"; - for (int index = 0; index < 60; index++) { - String result = cm.lpop(RuntimeNotifyStrategyMgr.UAV_CACHE_REGION, cacheKey + index); + for (; min < 60; min++) { + String result = cm.lpop(RuntimeNotifyStrategyMgr.UAV_CACHE_REGION, cacheKey + min); if (result != null) { Slice s = new Slice(result); return s.getArgs(); From e18c656b366b1aebb41efa296a0e25d0d26ea10a Mon Sep 17 00:00:00 2001 From: duandehua Date: Tue, 24 Jul 2018 19:28:35 +0800 Subject: [PATCH 06/17] https://github.com/uavorg/uavstack/issues/349 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、The tmax and tmin reset cycles are shortened to the default 1 hour https://github.com/uavorg/uavstack/issues/350 2、The initial time the mof gets tmax is empty, and NullPointerException is thrown --- .../spi/CaptureConstants.java | 4 +-- .../handlers/AbsServerRespTimeCapHandler.java | 26 ++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/captureframework/spi/CaptureConstants.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/captureframework/spi/CaptureConstants.java index d6f78125..51030169 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/captureframework/spi/CaptureConstants.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/captureframework/spi/CaptureConstants.java @@ -25,8 +25,8 @@ */ public class CaptureConstants { - // 1 day ttl for tmax, tmin - public final static long MEI_INST_TTL = 24 * 3600 * 1000; + // 1 hour ttl for tmax, tmin + public final static long MEI_INST_TTL = 1 * 3600 * 1000; // default monitor id public final static String MONITOR_SERVER = "server"; diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/handlers/AbsServerRespTimeCapHandler.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/handlers/AbsServerRespTimeCapHandler.java index b2c7b249..0964cd30 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/handlers/AbsServerRespTimeCapHandler.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/monitor/handlers/AbsServerRespTimeCapHandler.java @@ -65,14 +65,14 @@ protected void recordCounters(CaptureContext context, MonitorElementInstance ins /** * NOTE: for no-http */ - if (rtCode==-1) { + if (rtCode == -1) { inst.increValue(CaptureConstants.MEI_ERROR); - respCode="Err"; + respCode = "Err"; } - else if (rtCode==1) { - respCode="OK"; + else if (rtCode == 1) { + respCode = "OK"; } - + inst.increValue(CaptureConstants.MEI_RC + respCode); } } @@ -103,14 +103,18 @@ protected void doCommonCounters(CaptureContext context, MonitorElementInstance i MonitorElementInstance.CompareSetOperation.MAX); /** - * NOTE: tmax, tmin, 每24小时会自动RESET,避免一个巨大的tmax或一个很小的tmin + * NOTE: tmax, tmin, 每1小时会自动RESET,避免一个巨大的tmax或一个很小的tmin */ if (isMax == true) { inst.setValue(CaptureConstants.MEI_RESP_MAXTIME_ST, end); } else { - long tmax_st = (Long) inst.getValue(CaptureConstants.MEI_RESP_MAXTIME_ST); + Object tmaxSt = inst.getValue(CaptureConstants.MEI_RESP_MAXTIME_ST); + if (tmaxSt == null) { + return; + } + long tmax_st = (Long) tmaxSt; if (end - tmax_st > CaptureConstants.MEI_INST_TTL) { inst.setValue(CaptureConstants.MEI_RESP_MAXTIME, new AtomicLong(respTime)); @@ -126,9 +130,13 @@ protected void doCommonCounters(CaptureContext context, MonitorElementInstance i inst.setValue(CaptureConstants.MEI_RESP_MINTIME_ST, end); } else { - long tmax_st = (Long) inst.getValue(CaptureConstants.MEI_RESP_MINTIME_ST); + Object tminSt = inst.getValue(CaptureConstants.MEI_RESP_MINTIME_ST); + if (tminSt == null) { + return; + } + long tmin_st = (Long) tminSt; - if (end - tmax_st > CaptureConstants.MEI_INST_TTL) { + if (end - tmin_st > CaptureConstants.MEI_INST_TTL) { inst.setValue(CaptureConstants.MEI_RESP_MINTIME, new AtomicLong(respTime)); inst.setValue(CaptureConstants.MEI_RESP_MINTIME_ST, end); } From 62c88cf5f6de18a1182b40e515be976553beebdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E6=B0=B8=E5=BD=AA?= Date: Fri, 27 Jul 2018 11:22:00 +0800 Subject: [PATCH 07/17] =?UTF-8?q?https://github.com/uavorg/uavstack/issues?= =?UTF-8?q?/353=20org.springframework.boot.loader.PropertiesLauncher?= =?UTF-8?q?=E7=BB=A7=E6=89=BF=E8=87=AALauncher=EF=BC=8C=E9=87=8D=E5=86=99?= =?UTF-8?q?=E4=BA=86createClassLoader=EF=BC=8C=20UAV=E7=9A=84=E5=8A=AB?= =?UTF-8?q?=E6=8C=81=E7=82=B9=E4=B9=8B=E5=89=8D=E5=9C=A8Launcher.createCla?= =?UTF-8?q?ssLoader=E5=90=8E=EF=BC=8C=E6=89=80=E4=BB=A5=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E5=9C=A8PropertiesLauncher.createClassLoader=E5=90=8E=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=9F=8B=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adaptors/SpringBootTomcatAdaptor.java | 59 ++++++++++++------- .../agent/trans/MOFClsTransformer.java | 3 + 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java index 1f4ce7e1..2fa14742 100644 --- a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java +++ b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java @@ -58,6 +58,26 @@ public String getMethodName() { }); } + else if ("org.springframework.boot.loader.PropertiesLauncher".equals(className)) { + return this.inject("org.springframework.boot.loader.PropertiesLauncher", + new String[] { "com.creditease.uav.monitorframework.agent.interceptor" }, new AdaptorProcessor() { + + @Override + public void process(CtMethod m) throws Exception { + + aa.addLocalVar(m, "mObj", + "com.creditease.uav.monitorframework.agent.interceptor.SpringBootTomcatIT"); + m.insertAfter("{mObj=new SpringBootTomcatIT(\"" + mofRoot + "\"); mObj.installMOF($_);}"); + } + + @Override + public String getMethodName() { + + return "createClassLoader"; + } + + }); + } else if ("org.springframework.boot.SpringApplication".equals(className)) { return this.inject("org.springframework.boot.SpringApplication", new String[] { "com.creditease.uav.monitorframework.agent.interceptor" }, new AdaptorProcessor() { @@ -124,7 +144,7 @@ public String getMethodName() { }); } - // 进行log4j2的劫持 + // 进行log4j2的劫持 else if (className.equals("org.apache.logging.log4j.core.layout.PatternLayout")) { try { String logJarPath = uavMofRoot + "/com.creditease.uav.appfrk/com.creditease.uav.loghook-1.0.jar"; @@ -155,24 +175,23 @@ public String getMethodName() { return "toText"; } - }, - new AdaptorProcessor() { + }, new AdaptorProcessor() { - @Override - public void process(CtMethod m) throws Exception { - - if("String".equals(m.getReturnType().getSimpleName())) { - m.insertAfter("{$_=uavLogHook.formatLog($_);}"); + @Override + public void process(CtMethod m) throws Exception { + + if ("String".equals(m.getReturnType().getSimpleName())) { + m.insertAfter("{$_=uavLogHook.formatLog($_);}"); + } } - } - @Override - public String getMethodName() { + @Override + public String getMethodName() { - return "toSerializable"; - } + return "toSerializable"; + } - }); + }); } // 进行logback的劫持 @@ -217,7 +236,8 @@ else if (className.equals("org.springframework.context.support.AbstractApplicati /** * we need startServer before ApplicationContext's refresh cause some hook operation could - * happen when refresh. the hook is done after startServer before refresh, and profiling will be done after refresh + * happen when refresh. the hook is done after startServer before refresh, and profiling will be + * done after refresh */ @Override public void process(CtMethod m) throws Exception { @@ -226,7 +246,7 @@ public void process(CtMethod m) throws Exception { m.insertBefore( "{mObj=new SpringBootTomcatPlusIT();mObj.startServer(this.getEnvironment().getProperty(\"server.port\"),this.getEnvironment().getProperty(\"server.context-path\"),this.getEnvironment().getProperty(\"spring.application.name\"),this);mObj.onSpringBeanRegist(new Object[]{this,this.getEnvironment().getProperty(\"server.context-path\")});}"); m.insertAfter("{mObj.onSpringFinishRefresh(this);}"); - + } @Override @@ -407,7 +427,7 @@ public void process(CtMethod m) throws Exception { } }); } - // onDeployUAVApp + // onDeployUAVApp else if (className.equals("org.apache.catalina.startup.Tomcat")) { return this.inject(className, new String[] { "com.creditease.tomcat.plus.interceptor" }, @@ -423,9 +443,8 @@ public String getMethodName() { public void process(CtMethod m) throws Exception { aa.addLocalVar(m, "mObj", "com.creditease.tomcat.plus.interceptor.SpringBootTomcatPlusIT"); - m.insertBefore( - "{mObj=new SpringBootTomcatPlusIT();mObj.onDeployUAVApp(new Object[]{this,\"" - + uavMofRoot + "\"});}"); + m.insertBefore("{mObj=new SpringBootTomcatPlusIT();mObj.onDeployUAVApp(new Object[]{this,\"" + + uavMofRoot + "\"});}"); } } }); diff --git a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/agent/trans/MOFClsTransformer.java b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/agent/trans/MOFClsTransformer.java index 2e67f40e..3100e3f3 100644 --- a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/agent/trans/MOFClsTransformer.java +++ b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/agent/trans/MOFClsTransformer.java @@ -42,6 +42,8 @@ public class MOFClsTransformer implements ClassFileTransformer { // SpringBoot adaptors.put("org/springframework/boot/loader/Launcher", "com.creditease.uav.monitorframework.adaptors.SpringBootTomcatAdaptor"); + adaptors.put("org/springframework/boot/loader/PropertiesLauncher", + "com.creditease.uav.monitorframework.adaptors.SpringBootTomcatAdaptor"); adaptors.put("org/springframework/boot/SpringApplication", "com.creditease.uav.monitorframework.adaptors.SpringBootTomcatAdaptor"); @@ -58,6 +60,7 @@ public class MOFClsTransformer implements ClassFileTransformer { // private Method generalOnLoadClassMethod; public MOFClsTransformer(ClassLoader mofLoader, String uavMORoot, String agentArgs) { + System.out.println("<------------MOF Agent------------->"); System.out.println("MOF.AgentArgs=" + agentArgs); System.out.println("MOF.Root=" + uavMORoot); From c6411bf5874b129ff0237710ba760a9e5aef8af0 Mon Sep 17 00:00:00 2001 From: wenqiangzhu Date: Fri, 27 Jul 2018 11:27:06 +0800 Subject: [PATCH 08/17] #352 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调用链span在线程间进行传递时使用的ttl为浅拷贝,故线程池中各个线程操作的为同一个map,而线程池中执行的任务以及spanid都有可能相同,生成的mapkey相同,导致线程结束时移除自身线程的span时同时移除其他线程的span,导致空指针异常。 fix:mapkey中添加threadName --- .../invokechain/handlers/ClientSpanInvokeChainHandler.java | 2 +- .../com/creditease/uav/apm/invokechain/span/SpanFactory.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/ClientSpanInvokeChainHandler.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/ClientSpanInvokeChainHandler.java index a97f524c..60fd1fd1 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/ClientSpanInvokeChainHandler.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/ClientSpanInvokeChainHandler.java @@ -73,7 +73,7 @@ public void preCap(InvokeChainContext context) { /** * store span in thread local for DoCap */ - String storeKey = url + "@" + span.getSpanId(); + String storeKey = url + "@" + span.getSpanId() + "@" + Thread.currentThread().getName(); this.spanFactory.setSpanToContext(storeKey, span); diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/SpanFactory.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/SpanFactory.java index 1552a347..4bd32292 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/SpanFactory.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/SpanFactory.java @@ -20,8 +20,8 @@ package com.creditease.uav.apm.invokechain.span; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import com.alibaba.ttl.TransmittableThreadLocal; @@ -99,7 +99,7 @@ public String id() { @Override protected Map initialValue() { - return new HashMap(); + return new ConcurrentHashMap(); } }; From e654d3c986a90291e0186581ac11299442fd6e87 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 2 Aug 2018 12:06:22 +0800 Subject: [PATCH 09/17] fix bug: when URI has special char, ClientProfileHandler.class return wrong URI string with 'null' substring in it. --- .../handlers/ClientProfileHandler.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ClientProfileHandler.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ClientProfileHandler.java index 27ac4a89..51decdb7 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ClientProfileHandler.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ClientProfileHandler.java @@ -134,7 +134,7 @@ else if (rc == -1) { if (clientURL.startsWith("http")) { String rs = (String) context.get(ProfileConstants.PC_ARG_CLIENT_RS); - if(StringHelper.isNaturalNumber(rs)) { + if (StringHelper.isNaturalNumber(rs)) { urlAttrs.put(MonitorServerUtil.getActionTag(rs), curTime); } } @@ -147,8 +147,29 @@ else if (rc == -1) { */ private ProfileElementInstance getTargetURIInst(URI clientTargetURI, ProfileElement elem) { + String uri = clientTargetURI.getScheme() + "://"; String host = clientTargetURI.getHost(); - int port = clientTargetURI.getPort(); + + // According the analysis function in Java.Net.URI, char '_' is treated as Illegal character in host name. + // It makes a URISyntaxException when parse URI string. + if (host == null){ + String authority = clientTargetURI.getAuthority(); + // if the authority part contains user info + int index = authority.indexOf("@"); + if (index >= 0){ + uri += authority.substring(index + 1); + }else{ + uri += authority; + } + } + else{ + uri += host; + int port = clientTargetURI.getPort(); + if (port > 0){ + uri += ":" + port; + } + } + // String dnsName = null; // // if (!NetworkHelper.isIPV4(host)) { @@ -158,12 +179,6 @@ private ProfileElementInstance getTargetURIInst(URI clientTargetURI, ProfileElem // host = tmp; // } // } - - String uri = clientTargetURI.getScheme() + "://" + host; - if (port > 0) { - uri += ":" + port; - } - // http://xxxxx/yyyyy@client type ProfileElementInstance pei = elem.getInstance(uri); From 71a800c99b7244de78b7eeb46041e018a5074b26 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 2 Aug 2018 13:20:56 +0800 Subject: [PATCH 10/17] remove excrescent path in appid for springboot web app --- .../uav/util/MonitorServerUtil.java | 38 ++++++++++++------- .../interceptor/SpringBootTomcatPlusIT.java | 11 +++++- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/util/MonitorServerUtil.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/util/MonitorServerUtil.java index 085a6493..a4804f9f 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/util/MonitorServerUtil.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/util/MonitorServerUtil.java @@ -624,28 +624,23 @@ private static String getDefaultApplicationId(String contextroot, String basePat if ("".equals(contextroot)) { /* * NOTE: springboot's basePath is a random temp directory,so we use main(usually the jar name) as the appid + * */ if (UAVServer.instance().getServerInfo(CaptureConstants.INFO_APPSERVER_VENDOR) .equals(UAVServer.ServerVendor.SPRINGBOOT)) { String javaCommand = System.getProperty("sun.java.command"); appid = javaCommand.split(" ")[0]; + }else { + appid = basePath; } - else { - String tmp = basePath.replace("\\", "/"); - int index = tmp.lastIndexOf("/"); - - /** - * "/app/xxxxx/" remove the last "/" to get the appid - */ - if (index == tmp.length() - 1) { - tmp = tmp.substring(0, tmp.length() - 1); - index = tmp.lastIndexOf("/"); - } - appid = tmp.substring(index + 1); - } + appid = getReducedPath(appid); } else { appid = contextroot; + if (UAVServer.instance().getServerInfo(CaptureConstants.INFO_APPSERVER_VENDOR) + .equals(UAVServer.ServerVendor.SPRINGBOOT)) { + appid = getReducedPath(appid); + } } // 去除最开始的"/" @@ -661,4 +656,21 @@ private static String getDefaultApplicationId(String contextroot, String basePat return appid; } + + /* + * 获取给定路径的最后以层目录 + 例如:给定目录 abc/def/ + 输出:def + */ + private static String getReducedPath(String path) { + if (path == null || path.equals("")) + return ""; + String reducedPath = path.replace("\\", "/"); + int index = reducedPath.lastIndexOf("/"); + if (index == reducedPath.length() - 1) { + reducedPath = reducedPath.substring(0, reducedPath.length() - 1); + index = reducedPath.lastIndexOf("/"); + } + return reducedPath.substring(index + 1); + } } diff --git a/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java b/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java index f1b80e85..dc9d7230 100644 --- a/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java +++ b/com.creditease.uav.tomcat.plus.core/src/main/java/com/creditease/tomcat/plus/interceptor/SpringBootTomcatPlusIT.java @@ -58,7 +58,7 @@ public void startServer(String port, String contextPath, String appName, Object // start Monitor Server when server starts UAVServer.instance().start(new Object[] { UAVServer.ServerVendor.SPRINGBOOT }); // set appid - setAppid(contextPath); + //setAppid(contextPath); // set the connector port UAVServer.instance().putServerInfo(CaptureConstants.INFO_APPSERVER_LISTEN_PORT, DataConvertHelper.toInt(port, 8080)); @@ -73,10 +73,19 @@ public void startServer(String port, String contextPath, String appName, Object * * @param contextPath */ + @Deprecated public void setAppid(String contextPath) { if (contextPath == null || "/".equals(contextPath)) { contextPath = ""; + }else{ + contextPath = contextPath.replace("\\", "/"); + int index = contextPath.lastIndexOf("/"); + if (index == contextPath.length() - 1){ + contextPath = contextPath.substring(0, contextPath.length() - 1); + index = contextPath.lastIndexOf("/"); + } + contextPath = contextPath.substring(index + 1); } System.setProperty("com.creditease.uav.appid", MonitorServerUtil.getApplicationId(contextPath, "")); From 3560e79b9a0fcd629751fc8d8b83850c517bd32b Mon Sep 17 00:00:00 2001 From: wenqiangzhu Date: Fri, 3 Aug 2018 12:57:03 +0800 Subject: [PATCH 11/17] #359 #360 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 说明: 1,tomcat6.0.4系列使用servlet2.5的api,其中response接口中没有getStatus和getHeader方法,会导致异常. 2,rabbitmq调用链在produce未安装uav时, 此处的mqheader中不含有span的信息,但是该请求的url是存在的,应该在if外进行记录 fix : 1,从tomcat返回的reponsefacade中获取其持有的response对象,该对象含有getstatus和getHeader方法,同时对于开启重调用链对response加的壳进行脱壳处理. 2,将url移动到span是否存在判断的if语句外面进行获取 --- .../rabbitmq/interceptors/RabbitmqIT.java | 2 +- .../jee/JEEServiceRunGlobalFilterHandler.java | 30 ++++++++++--- .../slowoper/adapter/ServerSpanAdapter.java | 43 ++++++++++++++++++- 3 files changed, 66 insertions(+), 9 deletions(-) diff --git a/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/interceptors/RabbitmqIT.java b/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/interceptors/RabbitmqIT.java index f9b937be..38bdb993 100644 --- a/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/interceptors/RabbitmqIT.java +++ b/com.creditease.uav.hook.mq/src/main/java/com/creditease/uav/hook/rabbitmq/interceptors/RabbitmqIT.java @@ -292,8 +292,8 @@ public void preProcess(Consumer t, Object proxy, Method method, Object[] args) { && props.getHeaders().containsKey(InvokeChainConstants.PARAM_MQHEAD_SPANINFO)) { params.put(InvokeChainConstants.PARAM_MQHEAD_SPANINFO, props.getHeaders().get(InvokeChainConstants.PARAM_MQHEAD_SPANINFO) + ""); - params.put(CaptureConstants.INFO_APPSERVER_CONNECTOR_REQUEST_URL, url); } + params.put(CaptureConstants.INFO_APPSERVER_CONNECTOR_REQUEST_URL, url); // register adapter UAVServer.instance().runSupporter("com.creditease.uav.apm.supporters.InvokeChainSupporter", diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/jee/JEEServiceRunGlobalFilterHandler.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/jee/JEEServiceRunGlobalFilterHandler.java index a0f73bf4..e28fb69e 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/jee/JEEServiceRunGlobalFilterHandler.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/jee/JEEServiceRunGlobalFilterHandler.java @@ -170,16 +170,34 @@ private int getRespRetStatus(HttpServletResponse response) { return response.getStatus(); } catch (Error e) { - Object resp = ReflectionHelper.getField(response.getClass(), response, "response"); - if (resp != null) { - Object result = ReflectionHelper.invoke("org.apache.catalina.connector.Response", resp, "getStatus", - null, null, response.getClass().getClassLoader()); + Object resp = response; + // 重调用链开启后这里的response是RewriteIvcResponseWrapper + if ("com.creditease.uav.apm.RewriteIvcResponseWrapper".equals(response.getClass().getName())) { + resp = ReflectionHelper.getField(response.getClass(), response, "response"); + if (resp == null) { + return 0; + } + } + + if (resp == null) { + return 0; + } + Object result = null; + // for tomcat 6.0.4x + if ("org.apache.catalina.connector.ResponseFacade".equals(resp.getClass().getName())) { + resp = ReflectionHelper.getField(resp.getClass(), resp, "response"); + if (resp != null) { + result = ReflectionHelper.invoke(resp.getClass().getName(), resp, "getStatus", null, null, + response.getClass().getClassLoader()); + } + } - return (Integer) result; + if (result == null) { + return 0; } - return 0; + return (Integer) result; } } diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/slowoper/adapter/ServerSpanAdapter.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/slowoper/adapter/ServerSpanAdapter.java index 99308f2d..b507259c 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/slowoper/adapter/ServerSpanAdapter.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/slowoper/adapter/ServerSpanAdapter.java @@ -30,6 +30,7 @@ import javax.servlet.http.HttpServletResponse; import com.creditease.agent.helpers.JSONHelper; +import com.creditease.agent.helpers.ReflectionHelper; import com.creditease.monitor.UAVServer; import com.creditease.monitor.captureframework.spi.CaptureConstants; import com.creditease.uav.apm.RewriteIvcRequestWrapper; @@ -147,8 +148,46 @@ private String getRequestHeaders(HttpServletRequest request) { private String getResponHeaders(HttpServletResponse response) { Map result = new HashMap(); - for (String key : response.getHeaderNames()) { - result.put(key, response.getHeader(key)); + + try { + for (String key : response.getHeaderNames()) { + result.put(key, response.getHeader(key)); + } + } + catch (Error e) { + Object resp = response; + // 重调用链开启后这里的response是RewriteIvcResponseWrapper + if ("com.creditease.uav.apm.RewriteIvcResponseWrapper".equals(response.getClass().getName())) { + resp = ReflectionHelper.getField(response.getClass(), response, "response"); + if (resp == null) { + return JSONHelper.toString(result); + } + } + if (resp == null) { + return JSONHelper.toString(result); + } + // for tomcat 6.0.4x + if ("org.apache.catalina.connector.ResponseFacade".equals(resp.getClass().getName())) { + resp = ReflectionHelper.getField(resp.getClass(), resp, "response"); + if (resp == null) { + return JSONHelper.toString(result); + } + + String[] headerNames = (String[]) ReflectionHelper.invoke(resp.getClass().getName(), resp, + "getHeaderNames", null, null, response.getClass().getClassLoader()); + if (headerNames == null) { + return JSONHelper.toString(result); + } + + for (String headerName : headerNames) { + String headerValue = (String) ReflectionHelper.invoke(resp.getClass().getName(), resp, "getHeader", + new Class[] { String.class }, new Object[] { headerName }, + response.getClass().getClassLoader()); + if (headerValue != null) { + result.put(headerName, headerValue); + } + } + } } return JSONHelper.toString(result); } From bde4992ae145296c8b8aba072d40124cedd699a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E6=B0=B8=E5=BD=AA?= Date: Fri, 3 Aug 2018 13:11:52 +0800 Subject: [PATCH 12/17] =?UTF-8?q?https://github.com/uavorg/uavstack/issues?= =?UTF-8?q?/362=201.apphub=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E4=BD=BF=E7=94=A8=E5=90=8E=E7=AB=AF=E9=87=87?= =?UTF-8?q?=E7=94=A8find=E6=9F=A5=E8=AF=A2=EF=BC=8Ccount=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=202.HM=E7=AB=AF=E5=AF=B9=E5=BA=94=E9=80=BB=E8=BE=91=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E5=8C=96=EF=BC=8Cfind=E5=92=8Ccount=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E4=B8=AAor=E4=BB=A5=E4=B8=94=EF=BC=88and=EF=BC=89?= =?UTF-8?q?=E7=9A=84=E5=BD=A2=E5=BC=8F=E5=AD=98=E5=9C=A8=203.=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E8=AE=B0=E5=BD=95=E6=9F=A5=E8=AF=A2=E6=97=B6=E6=94=B9?= =?UTF-8?q?=E4=B8=BAlatestrecord=5Fts=EF=BC=88=E6=9C=80=E8=BF=91=E9=A2=84?= =?UTF-8?q?=E8=AD=A6=E6=97=B6=E9=97=B4=E6=8E=92=E5=BA=8F=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E5=87=8F=E5=B0=91=E6=97=B6=E9=97=B4=E6=B6=88=E8=80=97=E5=B9=B6?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B1=95=E7=A4=BA=E9=80=BB=E8=BE=91=204.DSfi?= =?UTF-8?q?nd.json=E7=A4=BA=E4=BE=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uav/godeye/rest/GodEyeRestService.java | 403 +++++------------- .../uav/datastore/core/MongoDBDataStore.java | 10 +- .../datastore/mongo/MongodbImplStrategy.java | 20 +- .../java/testData/MongoDBQuery/DSfind.json | 41 +- 4 files changed, 156 insertions(+), 318 deletions(-) diff --git a/com.creditease.uav.console/src/main/java/com/creditease/uav/godeye/rest/GodEyeRestService.java b/com.creditease.uav.console/src/main/java/com/creditease/uav/godeye/rest/GodEyeRestService.java index 3f3fedd8..eae9a656 100644 --- a/com.creditease.uav.console/src/main/java/com/creditease/uav/godeye/rest/GodEyeRestService.java +++ b/com.creditease.uav.console/src/main/java/com/creditease/uav/godeye/rest/GodEyeRestService.java @@ -1395,9 +1395,9 @@ public void noitifyQuery(String data, @Suspended AsyncResponse response) { // 数据权限begin String groups = getUserGroupsByFilter(request); - List groupList = Collections.emptyList(); boolean checkAuthor = true; + if ("NOMAPPING".equals(groups)) { checkAuthor = false; } @@ -1408,83 +1408,51 @@ else if ("ALL".equals(groups)) { } else { String[] gs = groups.split(","); - StringBuilder sBuilder = new StringBuilder(); - sBuilder.append("["); + groupList = new ArrayList>(); + for (String group : gs) { - sBuilder.append("{"); - sBuilder.append("\"regex\":{\"appgroup\":\"" + group + "\"}"); - sBuilder.append("}"); + Map temp = new HashMap<>(1); + temp.put("appgroup", group); + groupList.add(temp); } - sBuilder.append("]"); - - HashMap or = new HashMap(); - or.put("or", JSONHelper.toObjectArray(sBuilder.toString(), Map.class)); - HashMap match = new HashMap(); - match.put("match", or); - groupList = new ArrayList>(); - groupList.add(match); } // 数据权限end if (checkAuthor) { // mongodb .为关键字,封装时替换为#交由后台处理 data = data.replaceAll("\\.", "#"); - HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); - - List> list = new ArrayList>(); - - // 过滤数据,只查询最近的指定数据 begin - HashMap sortMap = new HashMap(); - HashMap sort = new HashMap(); - sort.put("values", "time"); - sort.put("sortorder", "-1"); - sortMap.put("sort", sort); - list.add(sortMap); - - HashMap firstRecord = new HashMap(); - firstRecord.put("firstrecord", "true"); - HashMap firstRecordMatch = new HashMap(); - firstRecordMatch.put("match", firstRecord); - list.add(firstRecordMatch); + Map whereMap = new HashMap<>(); + whereMap.put("firstrecord", "true"); // 封装组合查询条件 + HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); if (jsonParam.containsKey("search")) { String whereStr = "[{\"regex\":{\"ip\":\"searchValue\"}},{\"regex\":{\"eventid\":\"searchValue\"}},{\"regex\":{\"title\":\"searchValue\"}},{\"regex\":{\"host\":\"searchValue\"}}]"; // mongodb .为关键字,封装时替换为#交由后台处理 String inputSearchStr = jsonParam.get("search").replaceAll("\\.", "#"); whereStr = whereStr.replaceAll("searchValue", inputSearchStr); - - HashMap or = new HashMap(); - or.put("or", JSONHelper.toObjectArray(whereStr, Map.class)); - HashMap match = new HashMap(); - match.put("match", or); - list.add(match); + whereMap.put("or1", JSONHelper.toObjectArray(whereStr, Map.class)); } - // and if (!groupList.isEmpty()) { - list.addAll(groupList); + whereMap.put("or2", groupList); } - HashMap skipMap = new HashMap(); - skipMap.put("skip", mongodbQueryRangeMap.get("skip")); - list.add(skipMap); - - HashMap limitMap = new HashMap(); - limitMap.put("limit", mongodbQueryRangeMap.get("limit")); - list.add(limitMap); - // 过滤数据,只查询最近的指定数据 end - - HashMap pageIndex = new HashMap(); - HashMap pageSize = new HashMap(); - pageIndex.put("pageindex", String.valueOf(jsonParam.get("pageindex"))); - pageSize.put("pagesize", String.valueOf(jsonParam.get("pagesize"))); - list.add(pageIndex); - list.add(pageSize); + // 以最近触发预警记录的时间排序 + Map sortMap = new HashMap<>(); + sortMap.put("values", "latestrecord_ts"); + sortMap.put("sortorder", "-1"); + + Map map = new HashMap(); + map.put("sort", sortMap); + map.put("limit", mongodbQueryRangeMap.get("limit")); + map.put("pageindex", String.valueOf(jsonParam.get("pageindex"))); + map.put("pagesize", String.valueOf(jsonParam.get("pagesize"))); + map.put("where", whereMap); // 封装http请求数据 UAVHttpMessage message = new UAVHttpMessage(); - message.putRequest("mgo.sql", JSONHelper.toString(list)); + message.putRequest("mgo.sql", JSONHelper.toString(map)); message.putRequest("datastore.name", "MT_Notify"); message.putRequest("mgo.coll.name", "uav_notify"); @@ -1507,9 +1475,9 @@ public void noitifyCountQuery(String data, @Suspended AsyncResponse response) { // 数据权限begin String groups = getUserGroupsByFilter(request); - List groupList = Collections.emptyList(); boolean checkAuthor = true; + if ("NOMAPPING".equals(groups)) { checkAuthor = false; } @@ -1520,81 +1488,44 @@ else if ("ALL".equals(groups)) { } else { String[] gs = groups.split(","); - StringBuilder sBuilder = new StringBuilder(); - sBuilder.append("["); + groupList = new ArrayList>(); + for (String group : gs) { - sBuilder.append("{"); - sBuilder.append("\"regex\":{\"appgroup\":\"" + group + "\"}"); - sBuilder.append("}"); + Map temp = new HashMap<>(1); + temp.put("appgroup", group); + groupList.add(temp); } - sBuilder.append("]"); - - HashMap or = new HashMap(); - or.put("or", JSONHelper.toObjectArray(sBuilder.toString(), Map.class)); - HashMap match = new HashMap(); - match.put("match", or); - groupList = new ArrayList>(); - groupList.add(match); } // 数据权限end if (checkAuthor) { // mongodb .为关键字,封装时替换为#交由后台处理 data = data.replaceAll("\\.", "#"); - HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); - - List> list = new ArrayList>(); - - // 过滤数据,只查询最近的指定数据 begin - HashMap sortMap = new HashMap(); - HashMap sort = new HashMap(); - sort.put("values", "time"); - sort.put("sortorder", "-1"); - sortMap.put("sort", sort); - list.add(sortMap); - - HashMap requestParam = new HashMap(); - HashMap firstRecord = new HashMap(); - HashMap firstRecordMatch = new HashMap(); - firstRecord.put("firstrecord", "true"); - firstRecordMatch.put("match", firstRecord); - list.add(firstRecordMatch); - - // 过滤数据,只查询最近的指定数据 end + Map whereMap = new HashMap<>(); + whereMap.put("firstrecord", "true"); // 封装组合查询条件 + HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); if (jsonParam.containsKey("search")) { String whereStr = "[{\"regex\":{\"ip\":\"searchValue\"}},{\"regex\":{\"eventid\":\"searchValue\"}},{\"regex\":{\"title\":\"searchValue\"}},{\"regex\":{\"host\":\"searchValue\"}}]"; // mongodb .为关键字,封装时替换为#交由后台处理 String inputSearchStr = jsonParam.get("search").replaceAll("\\.", "#"); whereStr = whereStr.replaceAll("searchValue", inputSearchStr); - - HashMap or = new HashMap(); - or.put("or", JSONHelper.toObjectArray(whereStr, Map.class)); - HashMap match = new HashMap(); - match.put("match", or); - list.add(match); + whereMap.put("or1", JSONHelper.toObjectArray(whereStr, Map.class)); } - // and if (!groupList.isEmpty()) { - list.addAll(groupList); + whereMap.put("or2", groupList); } - HashMap skipMap = new HashMap(); - skipMap.put("skip", mongodbQueryRangeMap.get("skip")); - list.add(skipMap); - - HashMap limitMap = new HashMap(); - limitMap.put("limit", mongodbQueryRangeMap.get("limit")); - list.add(limitMap); - - requestParam.put("count", "true"); - list.add(requestParam); + Map map = new HashMap(); + map.put("limit", mongodbQueryRangeMap.get("limit")); + map.put("where", whereMap); + map.put("count", "true"); // 封装http请求数据 UAVHttpMessage message = new UAVHttpMessage(); - message.putRequest("mgo.sql", JSONHelper.toString(list)); + message.putRequest("mgo.sql", JSONHelper.toString(map)); message.putRequest("datastore.name", "MT_Notify"); message.putRequest("mgo.coll.name", "uav_notify"); @@ -1669,7 +1600,7 @@ public void noitifyEvent(@Suspended AsyncResponse response) throws Exception { sort.put("sortorder", "-1"); sortMap.put("sort", sort); list.add(sortMap); - + // modify start : 只返回firstrecord为true的事件id HashMap firstRecord = new HashMap(); HashMap firstRecordMatch = new HashMap(); @@ -1709,9 +1640,9 @@ public void noitifyQueryBest(String data, @Suspended AsyncResponse response) { // 数据权限begin String groups = getUserGroupsByFilter(request); - List groupList = Collections.emptyList(); boolean checkAuthor = true; + if ("NOMAPPING".equals(groups)) { checkAuthor = false; } @@ -1722,134 +1653,72 @@ else if ("ALL".equals(groups)) { } else { String[] gs = groups.split(","); - StringBuilder sBuilder = new StringBuilder(); - sBuilder.append("["); + groupList = new ArrayList>(); + for (String group : gs) { - sBuilder.append("{"); - sBuilder.append("\"regex\":{\"appgroup\":\"" + group + "\"}"); - sBuilder.append("}"); + Map temp = new HashMap<>(1); + temp.put("appgroup", group); + groupList.add(temp); } - sBuilder.append("]"); - - HashMap or = new HashMap(); - or.put("or", JSONHelper.toObjectArray(sBuilder.toString(), Map.class)); - HashMap match = new HashMap(); - match.put("match", or); - groupList = new ArrayList>(); - groupList.add(match); } // 数据权限end if (checkAuthor) { // mongodb .为关键字,封装时替换为#交由后台处理 data = data.replaceAll("\\.", "#"); - HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); - - List> list = new ArrayList>(); - - // 过滤数据,只查询最近的指定数据 begin - HashMap sortMap = new HashMap(); - HashMap sort = new HashMap(); - sort.put("values", "time"); - sort.put("sortorder", "-1"); - sortMap.put("sort", sort); - list.add(sortMap); - - HashMap firstRecord = new HashMap(); - HashMap firstRecordMatch = new HashMap(); - firstRecord.put("firstrecord", "true"); - firstRecordMatch.put("match", firstRecord); - list.add(firstRecordMatch); - - // 过滤数据,只查询最近的指定数据 end + Map whereMap = new HashMap<>(); + Map regexMap = new HashMap<>(); - // 封装组合查询条件 list.add = and - if (jsonParam.containsKey("event")) { - HashMap eventMap = new HashMap(); - HashMap eventMatch = new HashMap(); - eventMap.put("eventid", jsonParam.get("event")); - eventMatch.put("match", eventMap); - list.add(eventMatch); - } + // 封装组合查询条件 + HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); if (jsonParam.containsKey("ip")) { - HashMap ipMap = new HashMap(); - HashMap ipRegex = new HashMap(); - HashMap ipMatch = new HashMap(); - ipMap.put("ip", jsonParam.get("ip")); - ipRegex.put("regex", ipMap); - ipMatch.put("match", ipRegex); - list.add(ipMatch); + regexMap.put("ip", jsonParam.get("ip")); } if (jsonParam.containsKey("host")) { - HashMap hostMap = new HashMap(); - HashMap hostRegex = new HashMap(); - HashMap hostMatch = new HashMap(); - hostMap.put("host", jsonParam.get("host")); - hostRegex.put("regex", hostMap); - hostMatch.put("match", hostRegex); - list.add(hostMatch); + regexMap.put("host", jsonParam.get("host")); } if (jsonParam.containsKey("description")) { - HashMap descriptionMap = new HashMap(); - HashMap descriptionRegex = new HashMap(); - HashMap descriptionMatch = new HashMap(); - descriptionMap.put("description", jsonParam.get("description")); - descriptionRegex.put("regex", descriptionMap); - descriptionMatch.put("match", descriptionRegex); - list.add(descriptionMatch); + regexMap.put("description", jsonParam.get("description")); } if (jsonParam.containsKey("abstract")) { - HashMap abstractMap = new HashMap(); - HashMap abstractRegex = new HashMap(); - HashMap abstractMatch = new HashMap(); - abstractMap.put("title", jsonParam.get("abstract")); - abstractRegex.put("regex", abstractMap); - abstractMatch.put("match", abstractRegex); - list.add(abstractMatch); + regexMap.put("title", jsonParam.get("abstract")); + } + if (jsonParam.containsKey("event")) { + whereMap.put("eventid", jsonParam.get("event")); } if (jsonParam.containsKey("startTime")) { - HashMap startTime = new HashMap(); - HashMap startTimeRegex = new HashMap(); - HashMap startTimeMatch = new HashMap(); + Map startTime = new HashMap<>(1); startTime.put("latestrecord_ts", jsonParam.get("startTime")); - startTimeRegex.put(">", startTime); - startTimeMatch.put("match", startTimeRegex); - list.add(startTimeMatch); + whereMap.put(">", startTime); } if (jsonParam.containsKey("endTime")) { - HashMap endTime = new HashMap(); - HashMap endTimeRegex = new HashMap(); - HashMap endTimeMatch = new HashMap(); + Map endTime = new HashMap<>(1); endTime.put("latestrecord_ts", jsonParam.get("endTime")); - endTimeRegex.put("<", endTime); - endTimeMatch.put("match", endTimeRegex); - list.add(endTimeMatch); + whereMap.put("<", endTime); } if (!groupList.isEmpty()) { - list.addAll(groupList); + whereMap.put("or", groupList); } - HashMap skipMap = new HashMap(); - skipMap.put("skip", mongodbQueryRangeMap.get("skip")); - list.add(skipMap); + whereMap.put("firstrecord", "true"); + whereMap.put("regex", regexMap); - HashMap limitMap = new HashMap(); - limitMap.put("limit", mongodbQueryRangeMap.get("limit")); - list.add(limitMap); + // 以最近触发预警记录的时间排序 + Map sortMap = new HashMap<>(); + sortMap.put("values", "latestrecord_ts"); + sortMap.put("sortorder", "-1"); - HashMap pageIndex = new HashMap(); - HashMap pageSize = new HashMap(); - HashMap pageSortOrder = new HashMap(); - pageIndex.put("pageindex", String.valueOf(jsonParam.get("pageindex"))); - pageSize.put("pagesize", String.valueOf(jsonParam.get("pagesize"))); - list.add(pageIndex); - list.add(pageSize); - list.add(pageSortOrder); + Map map = new HashMap(); + map.put("sort", sortMap); + map.put("limit", mongodbQueryRangeMap.get("limit")); + map.put("pageindex", String.valueOf(jsonParam.get("pageindex"))); + map.put("pagesize", String.valueOf(jsonParam.get("pagesize"))); + map.put("where", whereMap); // 封装http请求数据 UAVHttpMessage message = new UAVHttpMessage(); - message.putRequest("mgo.sql", JSONHelper.toString(list)); + message.putRequest("mgo.sql", JSONHelper.toString(map)); message.putRequest("datastore.name", "MT_Notify"); message.putRequest("mgo.coll.name", "uav_notify"); @@ -1868,9 +1737,9 @@ public void noitifyCountQueryBest(String data, @Suspended AsyncResponse response // 数据权限begin String groups = getUserGroupsByFilter(request); - List groupList = Collections.emptyList(); boolean checkAuthor = true; + if ("NOMAPPING".equals(groups)) { checkAuthor = false; } @@ -1881,129 +1750,65 @@ else if ("ALL".equals(groups)) { } else { String[] gs = groups.split(","); - StringBuilder sBuilder = new StringBuilder(); - sBuilder.append("["); + groupList = new ArrayList>(); + for (String group : gs) { - sBuilder.append("{"); - sBuilder.append("\"regex\":{\"appgroup\":\"" + group + "\"}"); - sBuilder.append("}"); + Map temp = new HashMap<>(1); + temp.put("appgroup", group); + groupList.add(temp); } - sBuilder.append("]"); - - HashMap or = new HashMap(); - or.put("or", JSONHelper.toObjectArray(sBuilder.toString(), Map.class)); - HashMap match = new HashMap(); - match.put("match", or); - groupList = new ArrayList>(); - groupList.add(match); } // 数据权限end if (checkAuthor) { // mongodb .为关键字,封装时替换为#交由后台处理 data = data.replaceAll("\\.", "#"); - HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); + Map whereMap = new HashMap<>(); + Map regexMap = new HashMap<>(); - List> list = new ArrayList>(); - - // 过滤数据,只查询最近的指定数据 begin - HashMap sortMap = new HashMap(); - HashMap sort = new HashMap(); - sort.put("values", "time"); - sort.put("sortorder", "-1"); - sortMap.put("sort", sort); - list.add(sortMap); - - HashMap requestParam = new HashMap(); - HashMap firstRecord = new HashMap(); - HashMap firstRecordMatch = new HashMap(); - firstRecord.put("firstrecord", "true"); - firstRecordMatch.put("match", firstRecord); - list.add(firstRecordMatch); - - // 过滤数据,只查询最近的指定数据 end - - // 封装组合查询条件 list.add = and - if (jsonParam.containsKey("event")) { - HashMap eventMap = new HashMap(); - HashMap eventMatch = new HashMap(); - eventMap.put("eventid", jsonParam.get("event")); - eventMatch.put("match", eventMap); - list.add(eventMatch); - } + // 封装组合查询条件 + HashMap jsonParam = JSONHelper.toObject(data, HashMap.class); if (jsonParam.containsKey("ip")) { - HashMap ipMap = new HashMap(); - HashMap ipRegex = new HashMap(); - HashMap ipMatch = new HashMap(); - ipMap.put("ip", jsonParam.get("ip")); - ipRegex.put("regex", ipMap); - ipMatch.put("match", ipRegex); - list.add(ipMatch); + regexMap.put("ip", jsonParam.get("ip")); } if (jsonParam.containsKey("host")) { - HashMap hostMap = new HashMap(); - HashMap hostRegex = new HashMap(); - HashMap hostMatch = new HashMap(); - hostMap.put("host", jsonParam.get("host")); - hostRegex.put("regex", hostMap); - hostMatch.put("match", hostRegex); - list.add(hostMatch); + regexMap.put("host", jsonParam.get("host")); } if (jsonParam.containsKey("description")) { - HashMap descriptionMap = new HashMap(); - HashMap descriptionRegex = new HashMap(); - HashMap descriptionMatch = new HashMap(); - descriptionMap.put("description", jsonParam.get("description")); - descriptionRegex.put("regex", descriptionMap); - descriptionMatch.put("match", descriptionRegex); - list.add(descriptionMatch); + regexMap.put("description", jsonParam.get("description")); } if (jsonParam.containsKey("abstract")) { - HashMap abstractMap = new HashMap(); - HashMap abstractRegex = new HashMap(); - HashMap abstractMatch = new HashMap(); - abstractMap.put("title", jsonParam.get("abstract")); - abstractRegex.put("regex", abstractMap); - abstractMatch.put("match", abstractRegex); - list.add(abstractMatch); + regexMap.put("title", jsonParam.get("abstract")); + } + if (jsonParam.containsKey("event")) { + whereMap.put("eventid", jsonParam.get("event")); } if (jsonParam.containsKey("startTime")) { - HashMap startTime = new HashMap(); - HashMap startTimeRegex = new HashMap(); - HashMap startTimeMatch = new HashMap(); + Map startTime = new HashMap<>(1); startTime.put("latestrecord_ts", jsonParam.get("startTime")); - startTimeRegex.put(">", startTime); - startTimeMatch.put("match", startTimeRegex); - list.add(startTimeMatch); + whereMap.put(">", startTime); } if (jsonParam.containsKey("endTime")) { - HashMap endTime = new HashMap(); - HashMap endTimeRegex = new HashMap(); - HashMap endTimeMatch = new HashMap(); + Map endTime = new HashMap<>(1); endTime.put("latestrecord_ts", jsonParam.get("endTime")); - endTimeRegex.put("<", endTime); - endTimeMatch.put("match", endTimeRegex); - list.add(endTimeMatch); + whereMap.put("<", endTime); } if (!groupList.isEmpty()) { - list.addAll(groupList); + whereMap.put("or", groupList); } - HashMap skipMap = new HashMap(); - skipMap.put("skip", mongodbQueryRangeMap.get("skip")); - list.add(skipMap); + whereMap.put("firstrecord", "true"); + whereMap.put("regex", regexMap); - HashMap limitMap = new HashMap(); - limitMap.put("limit", mongodbQueryRangeMap.get("limit")); - list.add(limitMap); - - requestParam.put("count", "true"); - list.add(requestParam); + Map map = new HashMap(); + map.put("limit", mongodbQueryRangeMap.get("limit")); + map.put("where", whereMap); + map.put("count", "true"); // 封装http请求数据 UAVHttpMessage message = new UAVHttpMessage(); - message.putRequest("mgo.sql", JSONHelper.toString(list)); + message.putRequest("mgo.sql", JSONHelper.toString(map)); message.putRequest("datastore.name", "MT_Notify"); message.putRequest("mgo.coll.name", "uav_notify"); diff --git a/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/core/MongoDBDataStore.java b/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/core/MongoDBDataStore.java index 68a7ec44..458fb537 100644 --- a/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/core/MongoDBDataStore.java +++ b/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/core/MongoDBDataStore.java @@ -60,6 +60,7 @@ public class MongoDBDataStore extends AbstractDataStore { public MongoDBDataStore(DataStoreConnection connectObj, DataStoreAdapter adaptor, String feature) { + super(connectObj, adaptor, feature); } @@ -242,6 +243,7 @@ private List countAction(DataStoreMsg msg, Map queryparmes, MongoCollection BasicDBObject query = new BasicDBObject();// output Map findparmes = (Map) queryparmes.get(DataStoreProtocol.WHERE); + String strLimit = String.valueOf(queryparmes.get(DataStoreProtocol.LIMIT)); QueryStrategy qry = new QueryStrategy(); Map express = new LinkedHashMap(); express.put(DataStoreProtocol.FIND, findparmes); @@ -254,6 +256,9 @@ private List countAction(DataStoreMsg msg, Map queryparmes, MongoCollection log.info(this, "MongoDBDataStore countAction toJson : " + query.toJson()); long countN = collection.count(query); + if (!StringHelper.isEmpty(strLimit) && countN > Long.parseLong(strLimit)) { + countN = Long.parseLong(strLimit); + } Map item = new LinkedHashMap(); item.put(DataStoreProtocol.COUNT, countN); List res = new ArrayList(); @@ -395,7 +400,7 @@ private List findAction(Map queryObj, MongoCollection collection) Document sorts = new Document(); Document filterBson = new Document(); - // filterBson.append("_id", 0); //代码含义:查询返回结果中,不包含mongodb的_id字段 + // filterBson.append("_id", 0); //代码含义:查询返回结果中,不包含mongodb的_id字段 if (!StringHelper.isEmpty(fileds)) { String[] filters = fileds.split(";"); @@ -418,7 +423,6 @@ private List findAction(Map queryObj, MongoCollection collection) if (!StringHelper.isEmpty(pageindex)) { pageIndex = Integer.parseInt(pageindex); } - if (!StringHelper.isEmpty(pagesize)) { pageSize = Integer.parseInt(pagesize); } @@ -448,7 +452,6 @@ private List findAction(Map queryObj, MongoCollection collection) } return queryResultFormat(cursor, false); - } @SuppressWarnings("rawtypes") @@ -470,6 +473,7 @@ private List queryResultFormat(MongoCursor cursor, boolean checkC } results.add(docInfo); } + cursor.close(); /* * 在做计数时,如果没有数据,find会返回{count=0},而aggregate什么都不返回 为了保证输出结果统一,做了一下适配 diff --git a/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/mongo/MongodbImplStrategy.java b/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/mongo/MongodbImplStrategy.java index 961f77ff..45f79197 100644 --- a/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/mongo/MongodbImplStrategy.java +++ b/com.creditease.uav.dbaccess/src/main/java/com/creditease/uav/datastore/mongo/MongodbImplStrategy.java @@ -20,7 +20,6 @@ package com.creditease.uav.datastore.mongo; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -30,8 +29,8 @@ import com.creditease.agent.log.SystemLogger; import com.creditease.agent.log.api.ISystemLogger; +import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; -import com.mongodb.DBObject; /** * @author pengfei @@ -61,21 +60,21 @@ public void concretProcessor(Object expKey, Map expValue, BasicDBObject set) { while (iter.hasNext()) { String key = (String) iter.next(); Object value = expressions.get(key); - + if ("_id".equals(key)) { /** * 使用api 按id查询格式必须是: _id:string */ value = new ObjectId(value.toString()); } - + if (value instanceof Map) { RGLStrategy rgl = new RGLStrategy(); rgl.concretProcessor(key, expressions, set); } else if (value instanceof List) { - if ("or".equals(key)) { + if (key.startsWith("or")) { ORStrategy or = new ORStrategy(); or.concretProcessor(key, expressions, set); @@ -133,7 +132,7 @@ public class ORStrategy implements MongodbImplStrategy { @Override public void concretProcessor(Object expKey, Map expValue, BasicDBObject set) { - List orList = new ArrayList(); + BasicDBList orList = new BasicDBList(); List orListMap = (List) expValue.get(expKey); for (int i = 0; i < orListMap.size(); i++) { Map expression = orListMap.get(i); @@ -155,7 +154,14 @@ public void concretProcessor(Object expKey, Map expValue, BasicDBObject set) { } orList.add(sub); } - set.append("$or", orList); + + // 多个or之间为and关系 + BasicDBList andList = (BasicDBList) set.get("$and"); + if (andList == null) { + andList = new BasicDBList(); + } + andList.add(new BasicDBObject("$or", orList)); + set.append("$and", andList); } } diff --git a/com.creditease.uav.healthmanager/src/test/java/testData/MongoDBQuery/DSfind.json b/com.creditease.uav.healthmanager/src/test/java/testData/MongoDBQuery/DSfind.json index cbbac657..b906f1a2 100644 --- a/com.creditease.uav.healthmanager/src/test/java/testData/MongoDBQuery/DSfind.json +++ b/com.creditease.uav.healthmanager/src/test/java/testData/MongoDBQuery/DSfind.json @@ -19,13 +19,36 @@ */ { - "where":{ - "inst#id":"webapp", - "inst#values#value":"Tomcat Documentation" - }, - "fields":"appid;ip", - "pageindex":"1", - "pagesize":"10", - "sort":"_id", - "sortorder":"1" + "where":{ + "fields":"appid;ip", + "pageindex":"1", + "pagesize":"10", + "sort":{ + "values":"_id", + "sortorder":"1" + }, + "regex":{ + "title":"github" + }, + "or1":[ + { + "regex":{ + "ip":"127.0.0*" + } + }, + { + "regex":{ + "description":"master" + } + } + ], + "or2":[ + { + "appgroup":"UAV" + }, + { + "appgroup":"SMS" + } + ] + } } From 69450d96288e88661aa83ac72a9b95028f917228 Mon Sep 17 00:00:00 2001 From: xingShengLi Date: Fri, 3 Aug 2018 15:17:34 +0800 Subject: [PATCH 13/17] =?UTF-8?q?ComponentProfileHandler.addJAXWSServiceMa?= =?UTF-8?q?pBinding()=20NPE=20=E5=BD=93anno=E4=B8=BA=E7=A9=BA=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=AF=B9annoWebService=E6=98=AF?= =?UTF-8?q?=E5=90=A6=E4=B8=BAnull=E7=9A=84=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../profile/api/StandardProfileModeler.java | 6 ++- .../handlers/ComponentProfileHandler.java | 53 ++++++++++--------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/com.creditease.uav.base/src/main/java/com/creditease/agent/profile/api/StandardProfileModeler.java b/com.creditease.uav.base/src/main/java/com/creditease/agent/profile/api/StandardProfileModeler.java index 04523219..0f6069f7 100644 --- a/com.creditease.uav.base/src/main/java/com/creditease/agent/profile/api/StandardProfileModeler.java +++ b/com.creditease.uav.base/src/main/java/com/creditease/agent/profile/api/StandardProfileModeler.java @@ -1138,7 +1138,11 @@ else if (compInfo.containsKey("anno")) { Map annoWebService = (Map) compDesInfo.get("javax.jws.WebService"); - String serviceName = (String) annoWebService.get("serviceName"); + String serviceName = null; + + if (null != annoWebService) { + serviceName = (String) annoWebService.get("serviceName"); + } if (StringHelper.isEmpty(serviceName)) { diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java index cfc08c2d..e7a83b4f 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java @@ -911,10 +911,10 @@ private String getImplClassAsKey(String key, Node jaxws, ClassLoader cl, String Node beanClazz = processor .selectXMLNode("/beans/bean[@id='" + impl.getNodeValue() + "']/@class"); - - if(beanClazz!=null) { + + if (beanClazz != null) { return beanClazz.getNodeValue(); - } + } } // step 2.3 load serviceBean|implementor/@ref @@ -925,9 +925,9 @@ private String getImplClassAsKey(String key, Node jaxws, ClassLoader cl, String Node beanClazz = processor .selectXMLNode("/beans/bean[@id='" + impl.getNodeValue() + "']/@class"); - if(beanClazz!=null) { + if (beanClazz != null) { return beanClazz.getNodeValue(); - } + } } return key; @@ -946,7 +946,7 @@ private String getImplClassAsKey(String key, Node jaxws, ClassLoader cl, String * @return */ @SuppressWarnings({ "unchecked", "rawtypes" }) - private List getFileLocation(String webAppRoot, String path, String importFilePathPart2) { + private List getFileLocation(String webAppRoot, String path, String importFilePathPart2) { List absPaths = new ArrayList(); ClassLoader webappclsLoader = (ClassLoader) this.getContext().get(InterceptContext.class) @@ -980,20 +980,22 @@ private List getFileLocation(String webAppRoot, String path, String impo File location = null; if (resources != null) { - if (importFilePathPart2 != null) { - try { - // spring: if resource belongs to ClassPathResource or its subclass, try loading "org.springframework.core.io.ClassPathResource" and get resources again, - // in case that files cannot be found in relative path "path". - Class cpRes = webappclsLoader.loadClass("org.springframework.core.io.ClassPathResource"); - if(cpRes != null && cpRes.isAssignableFrom(resources[0].getClass())) { - resources = (Object[]) ReflectionHelper.invoke(SPRING_ResourcePatternResolver_CLASSNAME, resourceloader, - "getResources", new Class[] { String.class }, new String[] { importFilePathPart2 }, webappclsLoader); - } - } - catch (ClassNotFoundException e1) { - // ignore - } - } + if (importFilePathPart2 != null) { + try { + // spring: if resource belongs to ClassPathResource or its subclass, try loading + // "org.springframework.core.io.ClassPathResource" and get resources again, + // in case that files cannot be found in relative path "path". + Class cpRes = webappclsLoader.loadClass("org.springframework.core.io.ClassPathResource"); + if (cpRes != null && cpRes.isAssignableFrom(resources[0].getClass())) { + resources = (Object[]) ReflectionHelper.invoke(SPRING_ResourcePatternResolver_CLASSNAME, + resourceloader, "getResources", new Class[] { String.class }, + new String[] { importFilePathPart2 }, webappclsLoader); + } + } + catch (ClassNotFoundException e1) { + // ignore + } + } for (Object resource : resources) { try { location = (File) ReflectionHelper.invoke(SPRING_RESOURCE_CLASSNAME, resource, "getFile", null, @@ -2737,7 +2739,11 @@ else if (classInfo.containsKey("anno")) { Map annoWebService = (Map) classAnnoInfo.get("javax.jws.WebService"); - classPath = (String) annoWebService.get("serviceName"); + if (null != annoWebService) { + + classPath = (String) annoWebService.get("serviceName"); + + } if (StringHelper.isEmpty(classPath)) { @@ -2926,8 +2932,8 @@ private void getDynInfoForWebService(String componentClassName, ProfileElementIn Class annoClass = annoAvailableClasses.get(componentClassName); if (null == annoClass) { return; - } - + } + List coms = fcs.getNamesOfClassesWithAnnotation(annoClass); if (null == coms || coms.isEmpty()) { @@ -3021,7 +3027,6 @@ private void getAppGroup(ProfileElementInstance inst) { inst.setValue("appgroup", JAppGroup); } - private String getServiceURI(String contextpath) { String serviceURL = null; From 0743beb9099ed3cd70a29f37448e34a74db66bc3 Mon Sep 17 00:00:00 2001 From: xingShengLi Date: Fri, 3 Aug 2018 15:28:53 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E8=A7=84=E8=8C=83=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../handlers/ComponentProfileHandler.java | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java index e7a83b4f..e0432b91 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java @@ -911,10 +911,10 @@ private String getImplClassAsKey(String key, Node jaxws, ClassLoader cl, String Node beanClazz = processor .selectXMLNode("/beans/bean[@id='" + impl.getNodeValue() + "']/@class"); - - if (beanClazz != null) { + + if(beanClazz!=null) { return beanClazz.getNodeValue(); - } + } } // step 2.3 load serviceBean|implementor/@ref @@ -925,9 +925,9 @@ private String getImplClassAsKey(String key, Node jaxws, ClassLoader cl, String Node beanClazz = processor .selectXMLNode("/beans/bean[@id='" + impl.getNodeValue() + "']/@class"); - if (beanClazz != null) { + if(beanClazz!=null) { return beanClazz.getNodeValue(); - } + } } return key; @@ -946,7 +946,7 @@ private String getImplClassAsKey(String key, Node jaxws, ClassLoader cl, String * @return */ @SuppressWarnings({ "unchecked", "rawtypes" }) - private List getFileLocation(String webAppRoot, String path, String importFilePathPart2) { + private List getFileLocation(String webAppRoot, String path, String importFilePathPart2) { List absPaths = new ArrayList(); ClassLoader webappclsLoader = (ClassLoader) this.getContext().get(InterceptContext.class) @@ -980,22 +980,20 @@ private List getFileLocation(String webAppRoot, String path, String impo File location = null; if (resources != null) { - if (importFilePathPart2 != null) { - try { - // spring: if resource belongs to ClassPathResource or its subclass, try loading - // "org.springframework.core.io.ClassPathResource" and get resources again, - // in case that files cannot be found in relative path "path". - Class cpRes = webappclsLoader.loadClass("org.springframework.core.io.ClassPathResource"); - if (cpRes != null && cpRes.isAssignableFrom(resources[0].getClass())) { - resources = (Object[]) ReflectionHelper.invoke(SPRING_ResourcePatternResolver_CLASSNAME, - resourceloader, "getResources", new Class[] { String.class }, - new String[] { importFilePathPart2 }, webappclsLoader); - } - } - catch (ClassNotFoundException e1) { - // ignore - } - } + if (importFilePathPart2 != null) { + try { + // spring: if resource belongs to ClassPathResource or its subclass, try loading "org.springframework.core.io.ClassPathResource" and get resources again, + // in case that files cannot be found in relative path "path". + Class cpRes = webappclsLoader.loadClass("org.springframework.core.io.ClassPathResource"); + if(cpRes != null && cpRes.isAssignableFrom(resources[0].getClass())) { + resources = (Object[]) ReflectionHelper.invoke(SPRING_ResourcePatternResolver_CLASSNAME, resourceloader, + "getResources", new Class[] { String.class }, new String[] { importFilePathPart2 }, webappclsLoader); + } + } + catch (ClassNotFoundException e1) { + // ignore + } + } for (Object resource : resources) { try { location = (File) ReflectionHelper.invoke(SPRING_RESOURCE_CLASSNAME, resource, "getFile", null, @@ -2932,8 +2930,8 @@ private void getDynInfoForWebService(String componentClassName, ProfileElementIn Class annoClass = annoAvailableClasses.get(componentClassName); if (null == annoClass) { return; - } - + } + List coms = fcs.getNamesOfClassesWithAnnotation(annoClass); if (null == coms || coms.isEmpty()) { @@ -3027,6 +3025,7 @@ private void getAppGroup(ProfileElementInstance inst) { inst.setValue("appgroup", JAppGroup); } + private String getServiceURI(String contextpath) { String serviceURL = null; From 181cfe3bc65315627e5b23954d7622585fdeb085 Mon Sep 17 00:00:00 2001 From: xingShengLi Date: Fri, 3 Aug 2018 15:31:31 +0800 Subject: [PATCH 15/17] =?UTF-8?q?format=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uav/profiling/handlers/ComponentProfileHandler.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java index e0432b91..5254c34d 100644 --- a/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java +++ b/com.creditease.uav.monitorframework/src/main/java/com/creditease/uav/profiling/handlers/ComponentProfileHandler.java @@ -2738,9 +2738,7 @@ else if (classInfo.containsKey("anno")) { Map annoWebService = (Map) classAnnoInfo.get("javax.jws.WebService"); if (null != annoWebService) { - classPath = (String) annoWebService.get("serviceName"); - } if (StringHelper.isEmpty(classPath)) { From b4a36f0d1aec9cf70e210ecd7d663a537d6a7b72 Mon Sep 17 00:00:00 2001 From: xingShengLi Date: Fri, 3 Aug 2018 15:41:11 +0800 Subject: [PATCH 16/17] =?UTF-8?q?springboot1.3=EF=BC=88=E5=8C=85=E5=90=AB?= =?UTF-8?q?=EF=BC=89=E4=BB=A5=E4=B8=8B=E7=89=88=E6=9C=AC=E6=94=AF=E6=8C=81?= =?UTF-8?q?SpringApplication=E4=BD=9C=E4=B8=BAMain-Class=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitorframework/adaptors/SpringBootTomcatAdaptor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java index 2fa14742..a0d31239 100644 --- a/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java +++ b/com.creditease.uav.monitorframework.agent/src/main/java/com/creditease/uav/monitorframework/adaptors/SpringBootTomcatAdaptor.java @@ -87,14 +87,14 @@ public void process(CtMethod m) throws Exception { aa.addLocalVar(m, "mObj", "com.creditease.uav.monitorframework.agent.interceptor.SpringBootTomcatIT"); - m.insertAfter("{mObj=new SpringBootTomcatIT(\"" + mofRoot + m.insertBefore("{mObj=new SpringBootTomcatIT(\"" + mofRoot + "\"); mObj.installMOF(getClassLoader());}"); } @Override public String getMethodName() { - return "prepareEnvironment"; + return "createApplicationContext"; } }); From dc34a3ce5c408e7843b26fd5d4bedc297cc8d7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E6=B0=B8=E5=BD=AA?= Date: Fri, 10 Aug 2018 12:26:16 +0800 Subject: [PATCH 17/17] =?UTF-8?q?https://github.com/uavorg/uavstack/issues?= =?UTF-8?q?/367=20http=E8=AF=B7=E6=B1=82=E4=B8=ADHttpRequest=E4=B8=AD?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=B8=8D=E5=8C=85=E5=90=ABip:port=E5=AF=BC?= =?UTF-8?q?=E8=87=B4httpclient=E7=94=BB=E5=83=8F=E6=B2=A1=E6=9C=89http://i?= =?UTF-8?q?p:port=EF=BC=8C=20=E5=A6=82=E6=8B=BF=E5=88=B0=E7=9A=84url?= =?UTF-8?q?=E4=B8=8D=E5=90=AB"http"=E5=88=99=E8=8E=B7=E5=8F=96HttpHost?= =?UTF-8?q?=E4=B8=8E=E5=85=B6=E6=8B=BC=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../async/interceptors/ApacheAsyncHttpClientIT.java | 5 +++++ .../httpclients/sync/interceptors/ApacheHttpClientIT.java | 5 +++++ .../httpclients3/sync/interceptors/ApacheHttpClient3IT.java | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/interceptors/ApacheAsyncHttpClientIT.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/interceptors/ApacheAsyncHttpClientIT.java index b56be996..a034ca34 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/interceptors/ApacheAsyncHttpClientIT.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/async/interceptors/ApacheAsyncHttpClientIT.java @@ -376,6 +376,11 @@ else if (args.length == 5) { RequestLine rl = hr.getRequestLine(); httpAction = rl.getMethod(); targetURL = rl.getUri(); + + // 部分HttpRequest中没有ip:port,需要从httpHost中拿到再拼接 + if (!targetURL.startsWith("http")) { + targetURL = requestProducer.getTarget().toURI() + targetURL; + } } catch (IOException e) { // ignore thie exception diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/interceptors/ApacheHttpClientIT.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/interceptors/ApacheHttpClientIT.java index 80adc3b3..118c8cec 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/interceptors/ApacheHttpClientIT.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients/sync/interceptors/ApacheHttpClientIT.java @@ -117,6 +117,11 @@ public void doStart(Object[] args) { httpAction = rl.getMethod(); targetURl = rl.getUri(); + // 部分HttpRequest中没有ip:port,需要从httpHost中拿到再拼接 + if (!targetURl.startsWith("http")) { + targetURl = target.toURI() + targetURl; + } + Map params = new HashMap(); params.put(CaptureConstants.INFO_CLIENT_REQUEST_URL, targetURl); diff --git a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/interceptors/ApacheHttpClient3IT.java b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/interceptors/ApacheHttpClient3IT.java index d7313393..b6fe9400 100644 --- a/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/interceptors/ApacheHttpClient3IT.java +++ b/com.creditease.uav.hook.httpclients/src/main/java/com/creditease/uav/hook/httpclients3/sync/interceptors/ApacheHttpClient3IT.java @@ -101,6 +101,11 @@ public void doStart(Object[] args) { try { httpAction = method.getName(); targetURL = method.getURI().toString(); + + // HttpMethod中可能不包含ip:port,需要从httpHost中拿到再拼接 + if (!targetURL.startsWith("http")) { + targetURL = hostconfig.getHostURL() + targetURL; + } } catch (URIException e) { // ignore