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 f3f1ae06..0872595c 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 @@ -989,21 +989,28 @@ public void loadAppProfileDetail(String data, @Suspended AsyncResponse response) @GET @Path("profile/q/cache") @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8") - public void loadAppProfileList(@Suspended AsyncResponse response) { + public void loadAppProfileList(@QueryParam("fkey") String fkey, @QueryParam("fvalue") String fvalue, + @Suspended AsyncResponse response) { UAVHttpMessage message = new UAVHttpMessage(); message.setIntent("profile"); - - String groups = getUserGroupsByFilter(request); - if ("NOMAPPING".equals(groups)) { - response.resume("{\"rs\":\"{}\"}"); - } - else if ("ALL".equals(groups)) { - loadAppProfileListFromHttp(message, response); + if (StringHelper.isEmpty(fkey) || StringHelper.isEmpty(fvalue)) { + String groups = getUserGroupsByFilter(request); + if ("NOMAPPING".equals(groups)) { + response.resume("{\"rs\":\"{}\"}"); + } + else if ("ALL".equals(groups)) { + loadAppProfileListFromHttp(message, response); + } + else { + message.putRequest("fkey", "appgroup"); + message.putRequest("fvalue", groups); + loadAppProfileListFromHttp(message, response); + } } else { - message.putRequest("fkey", "appgroup"); - message.putRequest("fvalue", groups); + message.putRequest("fkey", fkey); + message.putRequest("fvalue", fvalue); loadAppProfileListFromHttp(message, response); } diff --git a/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.apm.js b/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.apm.js index 1f65df7f..6c53f9f2 100644 --- a/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.apm.js +++ b/com.creditease.uav.console/src/main/webapp/uavapp_godeye/appmonitor/js/uav.apm.js @@ -8,108 +8,12 @@ function APMTool(app) { var apmLoader=new AppHubMVCLoader("APM_Loader"); - /** - * TODO: 监控工具箱UI - */ - this.buildMonitorToolPanel=function(sObj) { - - var id="MonitorConfigDialog_Tool"; - - //invokechain - var sb=new StringBuffer(); - sb.append('
'); - sb.append('调用链跟踪 '); - sb.append(''); - sb.append(' '); - sb.append(' '); - sb.append(''); - sb.append('
'); - - //重调用链 - sb.append('
'); - sb.append('重调用链跟踪 '); - sb.append(""); - sb.append(" "); - sb.append(''); - sb.append('
'); - - //TODO Web浏览器跟踪 -// sb.append('
'); -// sb.append('浏览器跟踪 '); -// sb.append(""); -// sb.append(" "); -// sb.append(''); -// sb.append('
'); - - var toolView=HtmlHelper.id(id); - toolView.innerHTML=sb.toString(); - - //build what need Object - var ctrlObj={ - nodeURL:"", - serverURL:"", - file:"", - appUUID:"", - toolTag:"", - mqTopic:"", - collectAct:"" - }; - var instID=sObj["instid"]; - ctrlObj["appUUID"]=instID; - var appInfo=instID.split("---"); - var urlInfo=instID.split("/"); - ctrlObj["serverURL"]=urlInfo[0]+"//"+urlInfo[2]; - var ipport=urlInfo[2].split(":"); - ctrlObj["nodeURL"]="http://"+ipport[0]+":10101/node/ctrl"; - ctrlObj["file"]=appInfo[1]+"_"+ipport[1]+"_"; - - //invokechain button setup - var ivcStartBtn=HtmlHelper.id(id+"_ivc_startbtn"); - var ivcStopBtn=HtmlHelper.id(id+"_ivc_stopbtn"); - var ivcCfgBtn=HtmlHelper.id(id+"_ivc_cfgbtn"); - - ivcStartBtn.onclick=function() { - ctrlObj["toolTag"]="ivc"; - ctrlObj["mqTopic"]="JQ_IVC"; - ctrlObj["collectAct"]="collectdata.add"; - ctrlObj["collectRoot"]="com.creditease.uav.invokechain.logroot"; - _this.callMOFTool("调用链", "start",ctrlObj,"startSupporter","[\"com.creditease.uav.apm.supporters.InvokeChainSupporter\"]"); - }; - - ivcStopBtn.onclick=function() { - ctrlObj["toolTag"]="ivc"; - ctrlObj["mqTopic"]="JQ_IVC"; - ctrlObj["collectAct"]="collectdata.del"; - ctrlObj["collectRoot"]="com.creditease.uav.invokechain.logroot"; - _this.callMOFTool("调用链", "stop",ctrlObj,"stopSupporter","[\"com.creditease.uav.apm.supporters.InvokeChainSupporter\"]"); - }; - - ivcCfgBtn.onclick=function() { - $("#MonitorConfigDialog").modal('hide'); - app.controller.showWindow({winmode:"embed",func:"ivc",appuuid:instID,appurl:appInfo[0],appid:appInfo[1]},"AppAPMCfgWnd","buildAppAPMCfgWnd","runAppAPMCfgWnd"); - }; - - //重调用链 button setup - var ivcDataStartBtn=HtmlHelper.id(id+"_ivcdata_startbtn"); - var ivcDataStopBtn=HtmlHelper.id(id+"_ivcdata_stopbtn"); - - ivcDataStartBtn.onclick=function() { - ctrlObj["toolTag"]="ivcdat"; - ctrlObj["mqTopic"]="JQ_SLW"; - ctrlObj["collectAct"]="collectdata.add"; - ctrlObj["collectRoot"]="com.creditease.uav.ivcdat.logroot"; - _this.callMOFTool("重调用链", "start",ctrlObj,"startSupporter","[\"com.creditease.uav.apm.supporters.SlowOperSupporter\"]"); - }; - - ivcDataStopBtn.onclick=function() { - ctrlObj["toolTag"]="ivcdat"; - ctrlObj["mqTopic"]="JQ_SLW"; - ctrlObj["collectAct"]="collectdata.del"; - ctrlObj["collectRoot"]="com.creditease.uav.ivcdat.logroot"; - _this.callMOFTool("重调用链", "stop",ctrlObj,"stopSupporter","[\"com.creditease.uav.apm.supporters.SlowOperSupporter\"]"); - }; - - }; + /** + * 页面点击跳转过程中用于传递信息的全局参数 + */ + this.ivcInfo = { + comeFrom:"" + } /** * 调用MA启动/停止MOF上的功能 @@ -188,6 +92,57 @@ function APMTool(app) { this.destroyAppAPMCfgWnd=function() { }; + + + // TODO -------------------------------调用链配置窗口--------------------------------------------------- + /** + * 创建日志配置窗口GUI + */ + this.buildAppIVCCfgWnd=function(sObj) { + + this.IVCfgInfo={}; + + if (sObj!=undefined) { + this.IVCfgInfo=sObj; + } + + html="
" + + "
" + + "调用链配置
"+ + ""+this.IVCfgInfo["appurl"]+"" + + "
" + + "
"; + + html+="
" + +" " + +" " + +"
"; + html+="
" + +" " + +" " + +"
"; + html+="
" + +" " + +" " + +"
"; + + return html; + }; + + /** + * 初始化调用链配置窗口 + */ + this.runAppIVCCfgWnd=function(sObj) { + + }; + + /** + * + */ + this.destroyAppIVCCfgWnd=function() { + + }; + //TODO -----------------------------------------------------------调用链----------------------------------------------------------------- /** * 当前应用的信息 @@ -276,12 +231,13 @@ function APMTool(app) { appid:['应用标识','10%'], state : [ '状态', '50px' ], cost : [ '耗时ms', '70px' ], - traceid : [ '', '1px' ] + traceid : [ '', '1px' ], + logLink : [ '日志关联', '50px' ] }, cloHideStrategy : { - 1000 : [ 0, 1, 2, 3, 4, 5, 6, 7, 8,9,10 ], - 800 : [ 0, 1, 2, 3, 4, 5, 6, 7, 8,9,10 ], - 500 : [ 0,1, 2,9,10 ], + 1000 : [ 0, 1, 2, 3, 4, 5, 6, 7, 8,9,10,11 ], + 800 : [ 0, 1, 2, 3, 4, 5, 6, 7, 8,9,10,11 ], + 500 : [ 0,1, 2,9,10,11 ], 300:[0,1,2], }, columnStyle :{ @@ -326,6 +282,8 @@ function APMTool(app) { return _this.UI_list_state(value,true); case 10: return _this.UI_list_cost(value); + case 12: + return "
"; } return value; @@ -333,6 +291,55 @@ function APMTool(app) { } }; + + this.showLogSelect = function(sObj){ + + var params = {}; + params.comeFrom = this.ivcInfo["comeFrom"]; + var pNode = sObj.parentNode.parentNode; + params.ctn = "\"uav_" + pNode.id + "\""; + params.ipport = pNode.getElementsByTagName("td")[7].id; + params.appid = pNode.getElementsByTagName("td")[8].id; + var appurl = "http://"+params.ipport+"/"+params.appid+"/"; + AjaxHelper.call({ + url: '../../rs/godeye/profile/q/cache', + data: {"fkey":"appurl","fvalue":appurl}, + cache: false, + type: 'GET', + dataType: 'html', + timeout: 30000, + success: function(result){ + var obj = StringHelper.str2obj(result); + var res = obj["rs"]; + var datas = StringHelper.str2obj(res); + var data; + for(var key in datas){ + data = datas[key]; + } + var logdata = StringHelper.str2obj(data)["logs.log4j"]; + var logObj = StringHelper.str2obj(logdata); + for(var key in logObj){ + if(key.lastIndexOf("/") > 0){ + key = key.substring(key.lastIndexOf("/") + 1); + } + $("#logSelector").append(""); + } + if($("#logSelector option").size()>0){ + $("#selectLogWinfooter").append( ''); + }else{ + $("#logSelector").append(""); + } + $("#selectLogWinfooter").append( ''); + }, + error: function(result){ + $("#logSelector").append(""); + $("#selectLogWinfooter").append( ''); + } + }); + + $("#selectLogWin").modal({backdrop:false}); + } + /** * 根据value展示state的不同UI */ @@ -459,11 +466,13 @@ function APMTool(app) { var winmode=this.appInfo["winmode"]; //App模式 if (winmode!="standalone") { + var sObjStr=JSON.stringify(sObj); html="
" + "
" + ""+this.appInfo["appname"]+"
"+ ""+this.appInfo["appurl"]+"" + "
" + + "
"+ "
"; html+="
"; @@ -527,7 +536,7 @@ function APMTool(app) { this.appSelector.init(); this.appInstSelector.init(); - this.callAppProfile(); + this.callAppProfile(sObj); } //mainlist @@ -536,7 +545,8 @@ function APMTool(app) { this.mainList.initTable(); this.mainList.cellClickUser = function(id,pNode) { - app.controller.showWindow({traceid:id},"AppIVCTraceWnd","buildAppIVCTraceWnd","runAppIVCTraceWnd"); + //comeFrom表示该请求的来源位置,用于后面的返回定位 + app.controller.showWindow({traceid:id,comeFrom:"IVC"},"AppIVCTraceWnd","buildAppIVCTraceWnd","runAppIVCTraceWnd"); }; //init datetime picker @@ -579,17 +589,68 @@ function APMTool(app) { * 调用链Trace窗口UI */ this.buildAppIVCTraceWnd=function(sObj) { - var html="
" + - "
" + - "调用链跟踪
"+ - ""+sObj["traceid"]+"" + - "
" + - "
"; - html+="
"; + if(this.appInfo==undefined){ + //设置当前应用信息 + this.appInfo={ + appuuid:"", + appid:"", + appurl:"", + appname:"" + }; + } + var html= + "
" + + "
" + + "调用链跟踪
"+ + ""+sObj["traceid"]+""; + if(sObj!=undefined && "comeFrom" in sObj){ + this.ivcInfo["comeFrom"] = sObj["comeFrom"]; + if(sObj["comeFrom"]=="NewLog"){ + html += + "
" + + "
"; + }else{ + html += + "
"; + } + }else{ + html += + "
"; + } + html+= + "
"+ + "
"+ + "
" + + "
"; + + var sb=new StringBuffer(); + + sb.append('
"; html+="向前滚动日志 
"; //日志内容 html+="
"; @@ -865,12 +912,12 @@ function NewLogTool(app) { /** * Step 2: 记录这次成功的日志的开始和结束 */ - if(this.logRollInfo["curSLine"]>=lineRange.sline) { + if(lineRange.sline==undefined||this.logRollInfo["curSLine"]>=lineRange.sline) { this.logRollInfo["curSLine"]=datas[0]["l_num"]; HtmlHelper.id("AppNewLogRollWnd_CurSLine").innerHTML=this.logRollInfo["curSLine"]; } - if (this.logRollInfo["curELine"]<=lineRange.eline) { + if (lineRange.eline==undefined||this.logRollInfo["curELine"]<=lineRange.eline) { this.logRollInfo["curELine"]=datas[datas.length-1]["l_num"]; HtmlHelper.id("AppNewLogRollWnd_CurELine").innerHTML=this.logRollInfo["curELine"]; } @@ -898,7 +945,11 @@ function NewLogTool(app) { var podSLine=this.logRollInfo.pods.get(0); this.logRollInfo.pods.remove(0); HtmlHelper.del("NewLogPod_"+podSLine); - this.logRollInfo["curSLine"]=podSLine+this.logRollInfo["rollsize"]+1; + if(this.logRollInfo["fromIVC"] == true){ + this.logRollInfo["curSLine"] = this.logRollInfo.pods.get(0); + }else{ + this.logRollInfo["curSLine"]=podSLine+this.logRollInfo["rollsize"]+1; + } HtmlHelper.id("AppNewLogRollWnd_CurSLine").innerHTML=this.logRollInfo["curSLine"]; } else { @@ -950,8 +1001,27 @@ function NewLogTool(app) { */ this.buildLogLine=function(logBuffer,data) { - var keywords=this.getHighlightKeywords(); - var content=this.rendLog(data["content"], keywords); + var content=data["content"]; + //为拥有traceId的日志添加超链接 + if(content.slice(0,4)=='uav_'){ + var traceid = content.split(" ")[0].slice(4); + content = content.substring(traceid.length+4,content.length); + var params = {}; + params.traceid = traceid; + params.appuuid = "http://"+this.logRollInfo["ipport"]+"/"+this.logRollInfo["appid"]+"---"+this.logRollInfo["appid"]; + params.comeFrom = this.LogInfo["comeFrom"]; + params.appname = this.logRollInfo["appid"]; + params.ipport = this.logRollInfo["ipport"]; + params.appid = this.logRollInfo["appid"]; + params = JSON.stringify(params); + var keywords=this.getHighlightKeywords(); + content=this.rendLog(content, keywords); + content = ""+content+""; + }else{ + var keywords=this.getHighlightKeywords(); + content=this.rendLog(content, keywords); + } + var lnum=data["l_num"]; var highlight=""; @@ -1014,11 +1084,19 @@ function NewLogTool(app) { if (action=="up") { eline=this.logRollInfo["curSLine"]; - sline=eline-rollsize-1; + sline=eline-rollsize-1; + //如果从调用链界面进来,则向上翻页的时候不用sline + if(this.logRollInfo["fromIVC"] == true){ + sline = NaN; + } } else if (action=="down") { sline=this.logRollInfo["curELine"]+1; eline=sline+rollsize+1; + //如果从调用链界面进来,则向下翻页的时候不用eline + if(this.logRollInfo["fromIVC"] == true){ + eline = NaN; + } } return {sline:sline,eline:eline}; @@ -1037,7 +1115,6 @@ function NewLogTool(app) { this.logRollInfo["_lock"]=true; var data={intent:"qContent",request:{}}; - /** * Step 1: 默认使用_def, 但是稍后可以允许用户自己选自己的Rule */ @@ -1045,9 +1122,15 @@ function NewLogTool(app) { //取appid和logtype,ipport data["request"]["appid"]=this.logRollInfo["appid"]; - data["request"]["logtype"]=this.logRollInfo["logtype"]+currentLogRuleName; + data["request"]["logtype"]=this.logRollInfo["logtype"]+currentLogRuleName; data["request"]["ipport"]=this.logRollInfo["ipport"]; - + if(this.logRollInfo["ctn"] != undefined && this.logRollInfo["ctn"] != "");{ + data["request"]["ctn"]=this.logRollInfo["ctn"]; + } + //第一次进入页面的line为“ ”说明是从IVC界面进来的 + if(this.logRollInfo["entry"]["line"] == ""){ + this.logRollInfo["fromIVC"] = true; + } /** * Step 2: 定位拉去的行范围,按行号 */ @@ -1059,8 +1142,12 @@ function NewLogTool(app) { lineRange=this.getNextRollRange(undefined,pObj["action"]); } - data["request"]["sline"]=lineRange["sline"]+""; - data["request"]["eline"]=lineRange["eline"]+""; + if(!isNaN(lineRange["sline"])){ + data["request"]["sline"]=lineRange["sline"]+""; + } + if(!isNaN(lineRange["eline"])){ + data["request"]["eline"]=lineRange["eline"]+""; + } /** * Step 3: 时间区段 @@ -1073,10 +1160,24 @@ function NewLogTool(app) { data["request"]["indexdate"]=timeRange["indexdate"]+""; data["request"]["stime"]=timeRange["stime"]+""; data["request"]["etime"]=timeRange["etime"]+""; + }else{ + //如果在日志搜索时没有选择时间区间,则在newLogRoll窗口中将仅通过sline和eline限定,此时会将符合行号范围的历史数据全部加载出来, + //为了避免此种情况这里设定一个时间区间,将日志范围限制到当日0点到现在区间,这里仅是一个workaround + if(this.logRollInfo["fromIVC"] != true){ + data["request"]["stime"]=new Date().setHours(0,0,0,0)+""; + data["request"]["etime"]=new Date().getTime()+""; + } } data["request"]["sort"]="l_timestamp=ASC,l_num=ASC"; data["request"]["from"]=0+""; data["request"]["size"]=1000+""; + //如果当前页面来源于IVC那么通过pagesize控制拉去日志的数量 + if(this.logRollInfo["fromIVC"] == true){ + var traceid = data["request"]["ctn"]; + var indexdate = TimeHelper.getTime(Number(traceid.split('_')[3]),"FD"); + data["request"]["indexdate"] = indexdate; + data["request"]["size"]=100+""; + } break; } @@ -1110,6 +1211,17 @@ function NewLogTool(app) { var datas=eval(res); try { + if (datas.length > 0) { + if(isNaN(lineRange.sline)){ + lineRange.sline = datas[0].l_num; + } + if(isNaN(lineRange.eline)){ + lineRange.eline = datas[datas.length - 1].l_num; + } + if(_this.logRollInfo["entry"]["line"] == ""){ + _this.logRollInfo["entry"]["line"] = datas[0].l_num; + } + } _this.loadRollLog(datas,lineRange,pObj["action"]); }catch(e) { diff --git a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/http/handlers/HMCacheQueryHandler.java b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/http/handlers/HMCacheQueryHandler.java index 161c7942..38aad07e 100644 --- a/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/http/handlers/HMCacheQueryHandler.java +++ b/com.creditease.uav.healthmanager/src/main/java/com/creditease/uav/feature/healthmanager/http/handlers/HMCacheQueryHandler.java @@ -358,7 +358,7 @@ private void queryCache(UAVHttpMessage data, String cacheKey) { else if ("appurl".equals(filterKey)) { for (String key : keys) { - String keyCheck = key.substring(0, key.indexOf("@")); + String keyCheck = key.substring(key.indexOf("@") + 1); for (String vString : fValues) { if (vString.equals(keyCheck)) { targets.add(key); 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 1f92514d..3a620b0f 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 @@ -201,8 +201,11 @@ private void pushLogLineToBulkRequest(MonitorDataFrame mdf, String appid, String * 如果没有规则设置,使用了全行抓取,则索引Type=日志文件名+"_def" */ String logFileType = logFileName; + StringBuilder uuidStr = new StringBuilder(); + uuidStr.append(ipport).append(mdf.getServerId()).append("-").append(appid).append("-").append(logid); if (line.containsKey("content")) { logFileType += "_def"; + uuidStr.append("-").append(line.get("content")); } /** * 如果设置了规则,则应该使用索引Type=日志文件名+"_"+<规则名> @@ -212,10 +215,9 @@ private void pushLogLineToBulkRequest(MonitorDataFrame mdf, String appid, String } /** - * 保证不重复:IP+SvrID+AppID+LogFileName+LogLineNum + * 保证不重复:IP+SvrID+AppID+LogFileName+日志内容(def下为content) */ - String uuid = EncodeHelper.encodeMD5(new StringBuilder().append(ipport).append(mdf.getServerId()) - .append("-").append(appid).append("-").append(logid).append("-").append(lnum).toString()); + String uuid = EncodeHelper.encodeMD5(uuidStr.toString()); // 准备index,如果不存在,就创建 String currentIndex = indexMgr.prepareIndex(appid); diff --git a/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/http/NewLogQueryHandler.java b/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/http/NewLogQueryHandler.java index 65ab6690..4056f089 100644 --- a/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/http/NewLogQueryHandler.java +++ b/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/healthmanager/newlog/http/NewLogQueryHandler.java @@ -21,6 +21,7 @@ package com.creditease.uav.healthmanager.newlog.http; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -40,6 +41,7 @@ import com.creditease.agent.ConfigurationManager; import com.creditease.agent.helpers.DataConvertHelper; import com.creditease.agent.helpers.JSONHelper; +import com.creditease.agent.helpers.StringHelper; import com.creditease.agent.http.api.UAVHttpMessage; import com.creditease.agent.spi.AbstractHttpHandler; import com.creditease.uav.elasticsearch.client.ESClient; @@ -104,7 +106,7 @@ private void queryByLogContent(UAVHttpMessage data) { } /** - * 如果有日志行号 + * 如果有日志行号 有可能只有sline或eline也有可能都有 */ long startLine = DataConvertHelper.toLong(data.getRequest("sline"), -1); long endLine = DataConvertHelper.toLong(data.getRequest("eline"), -1); @@ -112,6 +114,12 @@ private void queryByLogContent(UAVHttpMessage data) { if (startLine > -1 && endLine > -1 && endLine > startLine) { queryBuilder.must(QueryBuilders.rangeQuery("l_num").gte(startLine).lt(endLine)); } + else if (startLine > -1) { + queryBuilder.must(QueryBuilders.rangeQuery("l_num").gte(startLine)); + } + else if (endLine > -1) { + queryBuilder.must(QueryBuilders.rangeQuery("l_num").lt(endLine)); + } /** * 关键字ipport @@ -170,6 +178,13 @@ private void parseSearchCondition(BoolQueryBuilder queryBuilder, UAVHttpMessage if (content == null) { return; } + // 如果查询内容使用""包裹,则使用matchphrase + if (content.startsWith("\"") && content.endsWith("\"")) { + // 去除两端的"" + content = content.substring(1, content.length() - 1); + queryBuilder.must(QueryBuilders.matchPhraseQuery("content", content)); + return; + } boolean hasCompandSearch = (content.indexOf("+") > -1) ? true : false; @@ -275,6 +290,13 @@ private void queryToList(UAVHttpMessage data, QueryBuilder queryBuilder, QueryBu records.add(record); } + // 如果只存在eline则需要把结果逆序,保证其原始顺序 + long startLine = DataConvertHelper.toLong(data.getRequest("sline"), -1); + long endLine = DataConvertHelper.toLong(data.getRequest("eline"), -1); + if (startLine == -1 && endLine > -1) { + Collections.reverse(records); + } + data.putResponse("rs", JSONHelper.toString(records)); // 返回总条数 data.putResponse("count", shits.getTotalHits() + ""); @@ -298,16 +320,32 @@ private SearchResponse query(UAVHttpMessage data, QueryBuilder queryBuilder, Que } // get logtype for search - String logType = data.getRequest("logtype").replace('.', '_'); + SearchRequestBuilder srb = null; + if (StringHelper.isEmpty(data.getRequest("logtype"))) { - SearchRequestBuilder srb = client.getClient().prepareSearch(currentIndex).setTypes(logType) - .setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + srb = client.getClient().prepareSearch(currentIndex).setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + } + else { + String logType = data.getRequest("logtype").replace('.', '_'); + + srb = client.getClient().prepareSearch(currentIndex).setTypes(logType) + .setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + } int from = DataConvertHelper.toInt(data.getRequest("from"), -1); int size = DataConvertHelper.toInt(data.getRequest("size"), -1); if (from != -1 && size != -1) { - srb = srb.setFrom(from).setSize(size); + long startLine = DataConvertHelper.toLong(data.getRequest("sline"), -1); + long endLine = DataConvertHelper.toLong(data.getRequest("eline"), -1); + // 判断如果只有endline则需要将结果倒序,取其前100行,然后在返回响应时再逆序回来,从而取到endline前的100行 + if (startLine == -1 && endLine > -1) { + srb = srb.addSort("l_timestamp", SortOrder.DESC).addSort("l_num", SortOrder.DESC).setFrom(from) + .setSize(size); + } + else { + srb = srb.setFrom(from).setSize(size); + } } srb.setQuery(queryBuilder); diff --git a/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/invokechain/http/InvokeChainQueryHandler.java b/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/invokechain/http/InvokeChainQueryHandler.java index 6f23c782..f9c1c536 100644 --- a/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/invokechain/http/InvokeChainQueryHandler.java +++ b/com.creditease.uav.invokechain/src/main/java/com/creditease/uav/invokechain/http/InvokeChainQueryHandler.java @@ -20,6 +20,8 @@ package com.creditease.uav.invokechain.http; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -110,9 +112,41 @@ private void queryByTrace(UAVHttpMessage data) { SortBuilder[] sorts = buildSort(data); + String indexDate = getIndexDateFromTraceId(traceid); + + data.putRequest("indexdate", indexDate); + queryToList(data, qb, null, sorts); } + /** + * \ 根据traceid获取时间,确定ES的索引 + * + * @param traceid + * @return indexData + */ + private static String getIndexDateFromTraceId(String traceid) { + + int count = 0; + StringBuilder sb = new StringBuilder(); + // 从traceid中获取时间戳,取第二个'_'和第三个'_'之间的字符 + for (int i = 0; i < traceid.length(); i++) { + if (count == 2 && traceid.charAt(i) != '_') { + sb.append(traceid.charAt(i)); + } + else if (count == 2) { + break; + } + if (traceid.charAt(i) == '_') { + count++; + } + } + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + Long timeStamp = DataConvertHelper.toLong(sb.toString(), System.currentTimeMillis()); + String indexdate = dateFormat.format(timeStamp); + return indexdate; + } + /** * 从应用维度对调用链进行查询 * diff --git a/com.creditease.uav.loghook/pom.xml b/com.creditease.uav.loghook/pom.xml index e1a9b7d7..bcc45722 100644 --- a/com.creditease.uav.loghook/pom.xml +++ b/com.creditease.uav.loghook/pom.xml @@ -1,6 +1,6 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 ce-datamonitorsystem @@ -8,53 +8,63 @@ 1.0 ../com.creditease.uav.superpom - - com.creditease.uav.loghook - - - - junit - junit - 3.8.1 - test - - - - log4j - log4j - 1.2.17 - system - ${basedir}/lib/log4j-1.2.17.jar - - - - org.slf4j - slf4j-api - 1.7.21 - system - ${basedir}/lib/slf4j-api-1.7.21.jar - - - - ch.qos.logback - logback-core - 1.1.7 - system - ${basedir}/lib/logback-core-1.1.7.jar - - - - ch.qos.logback - logback-classic - 1.1.7 - system - ${basedir}/lib/logback-classic-1.1.7.jar - - - - com.creditease.moniter - com.creditease.uav.monitorframework - - - + + com.creditease.uav.loghook + + + + junit + junit + 3.8.1 + test + + + + com.creditease.moniter + com.creditease.uav.monitorframework.apm + + + + com.creditease.moniter + com.creditease.uav.monitorframework.dproxy + + + + log4j + log4j + 1.2.17 + system + ${basedir}/lib/log4j-1.2.17.jar + + + + org.slf4j + slf4j-api + 1.7.21 + system + ${basedir}/lib/slf4j-api-1.7.21.jar + + + + ch.qos.logback + logback-core + 1.1.7 + system + ${basedir}/lib/logback-core-1.1.7.jar + + + + ch.qos.logback + logback-classic + 1.1.7 + system + ${basedir}/lib/logback-classic-1.1.7.jar + + + + com.creditease.moniter + com.creditease.uav.monitorframework + + + diff --git a/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/Log4jHookProxy.java b/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/Log4jHookProxy.java index e8c172ce..29d223aa 100644 --- a/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/Log4jHookProxy.java +++ b/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/Log4jHookProxy.java @@ -41,13 +41,21 @@ import com.creditease.monitor.interceptframework.spi.InterceptConstants; import com.creditease.monitor.interceptframework.spi.InterceptContext; import com.creditease.monitor.interceptframework.spi.InterceptContext.Event; +import com.creditease.uav.log.hook.interceptors.LogIT; +import com.creditease.uav.monitorframework.dproxy.DynamicProxyInstaller; +import com.creditease.uav.monitorframework.dproxy.DynamicProxyProcessor; import com.creditease.uav.profiling.handlers.log.LogProfileInfo; +import javassist.CtMethod; + public class Log4jHookProxy extends HookProxy { + private final DynamicProxyInstaller dpInstall; + @SuppressWarnings("rawtypes") public Log4jHookProxy(String id, Map config) { super(id, config); + dpInstall = new DynamicProxyInstaller(); } @Override @@ -58,7 +66,7 @@ public void start(HookContext context, ClassLoader webapploader) { switch (evt) { case WEBCONTAINER_RESOURCE_INIT: case WEBCONTAINER_INIT: - + InsertIntercept(context, webapploader); break; // when servlet init case AFTER_SERVET_INIT: @@ -194,4 +202,34 @@ else if (layout instanceof TTCCLayout) { } } + + private void InsertIntercept(HookContext context, ClassLoader webapploader) { + + /** + * set the webapploader is the target classloader + */ + dpInstall.setTargetClassLoader(webapploader); + + // 定义一个类里面的hook变量并初始化,防止每次拦截write时都初始化对象 + dpInstall.defineField("uavLogHook", LogIT.class, "org.apache.log4j.helpers.QuietWriter", "new LogIT()"); + // 定义换行符变量(与log4j中保持一致) + dpInstall.defineField("uavLogHookLineSep", String.class, "org.apache.log4j.helpers.QuietWriter", + "System.getProperty(\"line.separator\")"); + + dpInstall.installProxy("org.apache.log4j.helpers.QuietWriter", + new String[] { "com.creditease.uav.log.hook.interceptors" }, new DynamicProxyProcessor() { + + @Override + public void process(CtMethod m) throws Exception { + + if ("write".equals(m.getName())) { + m.insertBefore("{if(!$1.equals(uavLogHookLineSep)){$1=uavLogHook.formatLog($1);}}"); + + } + } + }, false); + + // release loader + dpInstall.releaseTargetClassLoader(); + } } diff --git a/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/LogBackHookProxy.java b/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/LogBackHookProxy.java index 53305688..7ae67d1b 100644 --- a/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/LogBackHookProxy.java +++ b/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/LogBackHookProxy.java @@ -34,6 +34,9 @@ import com.creditease.monitor.interceptframework.spi.InterceptConstants; import com.creditease.monitor.interceptframework.spi.InterceptContext; import com.creditease.monitor.interceptframework.spi.InterceptContext.Event; +import com.creditease.uav.log.hook.interceptors.LogIT; +import com.creditease.uav.monitorframework.dproxy.DynamicProxyInstaller; +import com.creditease.uav.monitorframework.dproxy.DynamicProxyProcessor; import com.creditease.uav.profiling.handlers.log.LogProfileInfo; import ch.qos.logback.classic.Logger; @@ -47,12 +50,16 @@ import ch.qos.logback.core.FileAppender; import ch.qos.logback.core.Layout; import ch.qos.logback.core.encoder.LayoutWrappingEncoder; +import javassist.CtMethod; public class LogBackHookProxy extends HookProxy { + private final DynamicProxyInstaller dpInstall; + @SuppressWarnings("rawtypes") public LogBackHookProxy(String id, Map config) { super(id, config); + dpInstall = new DynamicProxyInstaller(); } @Override @@ -61,6 +68,9 @@ public void start(HookContext context, ClassLoader webapploader) { Event evt = context.get(Event.class); switch (evt) { + case WEBCONTAINER_INIT: + InsertIntercept(context, webapploader); + break; // when servlet init case AFTER_SERVET_INIT: break; @@ -174,4 +184,32 @@ else if (layout instanceof TTLLLayout) { } } + + private void InsertIntercept(HookContext context, ClassLoader webapploader) { + + /** + * set the webapploader is the target classloader + */ + dpInstall.setTargetClassLoader(webapploader); + + // 定义一个类里面的hook变量并初始化,防止每次拦截write时都初始化对象 + dpInstall.defineField("uavLogHook", LogIT.class, "ch.qos.logback.core.encoder.LayoutWrappingEncoder", + "new LogIT()"); + + dpInstall.installProxy("ch.qos.logback.core.encoder.LayoutWrappingEncoder", + new String[] { "com.creditease.uav.log.hook.interceptors" }, new DynamicProxyProcessor() { + + @Override + public void process(CtMethod m) throws Exception { + + if ("convertToBytes".equals(m.getName())) { + m.insertBefore("{$1=uavLogHook.formatLog($1);}"); + + } + } + }, false); + + // release loader + dpInstall.releaseTargetClassLoader(); + } } diff --git a/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/interceptors/LogIT.java b/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/interceptors/LogIT.java new file mode 100644 index 00000000..f1c59619 --- /dev/null +++ b/com.creditease.uav.loghook/src/main/java/com/creditease/uav/log/hook/interceptors/LogIT.java @@ -0,0 +1,44 @@ +/*- + * << + * 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.log.hook.interceptors; + +import com.creditease.monitor.UAVServer; +import com.creditease.uav.apm.invokechain.spi.InvokeChainSpanContext; +import com.creditease.uav.common.BaseComponent; + +public class LogIT extends BaseComponent { + + public String formatLog(String str) { + + if (UAVServer.instance().isExistSupportor("com.creditease.uav.apm.supporters.InvokeChainSupporter")) { + if (UAVServer.instance().isExistSupportor("com.creditease.uav.apm.supporters.LogTraceSupporter")) { + InvokeChainSpanContext context = (InvokeChainSpanContext) UAVServer.instance() + .runSupporter("com.creditease.uav.apm.supporters.InvokeChainSupporter", "getSpanContext"); + if (context != null) { + String traceId = context.getMainSpan().getTraceId(); + return new StringBuilder().append("uav_").append(traceId).append(" ").append(str).toString(); + } + } + } + return str; + } + +} 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 14aef00a..a97f524c 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 @@ -57,10 +57,15 @@ public void preCap(InvokeChainContext context) { /** * Step 3: get client invoke context info: such as Class, Method, URL */ - int level = Integer.parseInt(String.valueOf(context.get(InvokeChainConstants.CLIENT_IT_KEY))); - String clazz = String.valueOf(context.get(InvokeChainConstants.CLIENT_IT_CLASS)); + try { + int level = Integer.parseInt(String.valueOf(context.get(InvokeChainConstants.CLIENT_IT_KEY))); + String clazz = String.valueOf(context.get(InvokeChainConstants.CLIENT_IT_CLASS)); - setCallerThreadInfo(span, level, clazz); + setCallerThreadInfo(span, level, clazz); + } + catch (Exception e) { + // ignore + } String url = (String) context.get(CaptureConstants.INFO_CLIENT_REQUEST_URL); span.setUrl(url); diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/MethodSpanInvokeChainHandler.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/MethodSpanInvokeChainHandler.java index 819219ba..ac73c759 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/MethodSpanInvokeChainHandler.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/MethodSpanInvokeChainHandler.java @@ -52,7 +52,7 @@ public void preCap(InvokeChainContext context) { String sign = (String) context.get(InvokeChainConstants.METHOD_SPAN_MTDSIGN); span.setClassName(cls); span.setMethodName(method + ((StringHelper.isEmpty(sign)) ? "" : "(" + sign + ")")); - span.setEndpointInfo(mSeqCountFormat.format(parentSpan.getSpanMethodSeqCounter())); + span.setEndpointInfo(mSeqCountFormat.format(parentSpan.incrementAndGetSpanMethodSeqCounter())); span.setUrl(""); String storekey = new StringBuilder().append(cls).append(".").append(method).append(".").append(sign) diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/SpanContextHandler.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/SpanContextHandler.java new file mode 100644 index 00000000..1918f15c --- /dev/null +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/handlers/SpanContextHandler.java @@ -0,0 +1,69 @@ +/*- + * << + * 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.apm.invokechain.handlers; + +import java.util.Map; + +import com.creditease.uav.apm.invokechain.span.Span; +import com.creditease.uav.apm.invokechain.spi.InvokeChainCapHandler; +import com.creditease.uav.apm.invokechain.spi.InvokeChainContext; +import com.creditease.uav.apm.invokechain.spi.InvokeChainSpanContext; + +/** + * + * ClientEnd Point InvokeChainHandler usage of client request/response Handler + * + * + */ + +public class SpanContextHandler extends InvokeChainCapHandler { + + @Override + public void preCap(InvokeChainContext context) { + + // do nothing + } + + /** + * Finish Span and Logger the Span Metrics + */ + @Override + public void doCap(InvokeChainContext context) { + + // do nothing + } + + public class SpanContext implements InvokeChainSpanContext { + + @Override + public Map getSpansFromContext() { + + return spanFactory.getSpansFromContext(); + } + + @Override + public Span getMainSpan() { + + return spanFactory.getSpanFromContext("main"); + } + } + +} diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/Span.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/Span.java index 261819d8..1e0a6528 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/Span.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/span/Span.java @@ -107,6 +107,11 @@ public AtomicInteger getSubSpanSeqCounter() { public int getSpanMethodSeqCounter() { + return this.spanMethodSeqCounter.get(); + } + + public int incrementAndGetSpanMethodSeqCounter() { + return this.spanMethodSeqCounter.incrementAndGet(); } 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 59a13f46..1552a347 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 @@ -198,6 +198,16 @@ public String getSpanMeta(Span span) { return b.toString(); } + /** + * 从ThreadLocal中获取spanMap + * + * @return + */ + public Map getSpansFromContext() { + + return threadLocalTracker.get(); + } + /** * 从ThreadLocal中获取span * diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/spi/InvokeChainSpanContext.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/spi/InvokeChainSpanContext.java new file mode 100644 index 00000000..9f9c95ab --- /dev/null +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/invokechain/spi/InvokeChainSpanContext.java @@ -0,0 +1,49 @@ +/*- + * << + * 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.apm.invokechain.spi; + +import java.util.Map; + +import com.creditease.uav.apm.invokechain.span.Span; + +/** + * + * SpanContext description: 调用链span上下文 + * + * 此类提供当前调用链的上下信息 + * + */ +public interface InvokeChainSpanContext { + + /** + * 获取当前调用所有所有span + * + * @return + */ + public Map getSpansFromContext(); + + /** + * 获取当前服务内调用链的根节点 + * + * @return + */ + public Span getMainSpan(); +} diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/InvokeChainSupporter.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/InvokeChainSupporter.java index 27fa9e81..35f18d93 100644 --- a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/InvokeChainSupporter.java +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/InvokeChainSupporter.java @@ -33,12 +33,13 @@ import com.creditease.uav.apm.invokechain.handlers.ClientSpanInvokeChainHandler; import com.creditease.uav.apm.invokechain.handlers.MethodSpanInvokeChainHandler; import com.creditease.uav.apm.invokechain.handlers.ServiceSpanInvokeChainHandler; +import com.creditease.uav.apm.invokechain.handlers.SpanContextHandler; import com.creditease.uav.apm.invokechain.jee.JEEServiceRunGlobalFilterHandler; import com.creditease.uav.apm.invokechain.spi.InvokeChainAdapter; import com.creditease.uav.apm.invokechain.spi.InvokeChainCapHandler; import com.creditease.uav.apm.invokechain.spi.InvokeChainConstants; -import com.creditease.uav.apm.invokechain.spi.InvokeChainContext; import com.creditease.uav.apm.invokechain.spi.InvokeChainConstants.CapturePhase; +import com.creditease.uav.apm.invokechain.spi.InvokeChainContext; import com.creditease.uav.appserver.listeners.GlobalFilterDispatchListener; import com.creditease.uav.common.Supporter; @@ -96,6 +97,7 @@ public void start() { // register MethodSpanInvokeChainHandler handlerMap.put(InvokeChainConstants.CHAIN_APP_METHOD, new MethodSpanInvokeChainHandler()); + } @Override @@ -265,6 +267,15 @@ else if (methodName.equals("registerAdapter")) { return false; } } + else if (methodName.equals("getSpanContext")) { + try { + return new SpanContextHandler().new SpanContext(); + } + catch (Exception e) { + this.logger.error("getSpanContext FAIL. ", e); + return null; + } + } return null; } diff --git a/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/LogTraceSupporter.java b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/LogTraceSupporter.java new file mode 100644 index 00000000..0a7be8fb --- /dev/null +++ b/com.creditease.uav.monitorframework.apm/src/main/java/com/creditease/uav/apm/supporters/LogTraceSupporter.java @@ -0,0 +1,46 @@ +/*- + * << + * 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.apm.supporters; + +import com.creditease.uav.common.Supporter; + +/** + * + * LogTraceSupporter description: 日志追踪supporter + * + * 当前supporter作为一个开关,具体实现依附于调用链,并由调用链提供数据支持 + * + */ +public class LogTraceSupporter extends Supporter { + + @Override + public void start() { + + // do nothing + } + + @Override + public void stop() { + + super.stop(); + } + +}