diff --git a/README-EN.md b/README-EN.md index 33c2954..790389f 100644 --- a/README-EN.md +++ b/README-EN.md @@ -9,7 +9,7 @@
- +
@@ -21,7 +21,8 @@ - ✅ Find exceptions occurred in methods - ✅ Email you after finding an overtime method - ✅ Hot update online:you needn't restart it -- ✅ Thread manage:show threads information +- ✅ Thread manage:show threads information,the deadlocks included +- ✅ JVM Space:Eden、Survivor、OldGen and Metaspace - ✅ Easy to use:you needn't additional learning costs - ✅ Enough to add a pom dependency:you needn't additional deployment costs diff --git a/README.md b/README.md index bb485f8..e85088c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@
- +
@@ -30,7 +30,8 @@ - ✅ Find exceptions occurred in methods - ✅ Email you after finding an overtime method - ✅ Hot update online:you needn't restart it -- ✅ Thread manage:show threads information +- ✅ Thread manage:show threads information,the deadlocks included +- ✅ JVM Space:Eden、Survivor、OldGen and Metaspace - ✅ Easy to use:you needn't additional learning costs - ✅ Enough to add a pom dependency:you needn't additional deployment costs @@ -44,7 +45,8 @@ - ✅ 追踪系统异常,精确定位到方法 - ✅ 接口超时邮件通知,无需实时查看 - ✅ 线上热更新:无需重启更新代码 -- ✅ 线程管理:线程实时统计与状态查看 +- ✅ 线程管理:线程实时统计与状态查看以及死锁检测 +- ✅ JVM空间统计:Eden、Survivor、OldGen and Metaspace - ✅ 使用简单,无技术学习成本 - ✅ pom依赖即可,无代码侵入,无多余部署成本 diff --git a/src/main/java/cn/langpy/kotime/config/SaveResourceConfig.java b/src/main/java/cn/langpy/kotime/config/SaveResourceConfig.java index 55b4bb3..c9c29d2 100644 --- a/src/main/java/cn/langpy/kotime/config/SaveResourceConfig.java +++ b/src/main/java/cn/langpy/kotime/config/SaveResourceConfig.java @@ -86,7 +86,7 @@ public class SaveResourceConfig implements CommandLineRunner { classRoute = cvalues[0]; } RequestMapping methodAnnotation = method.getMethodAnnotation(RequestMapping.class); - if (requestMapping == null) { + if (methodAnnotation == null) { return null; } String[] mvalues = methodAnnotation.value(); diff --git a/src/main/java/cn/langpy/kotime/controller/KoClassController.java b/src/main/java/cn/langpy/kotime/controller/KoClassController.java index 6983991..39ad433 100644 --- a/src/main/java/cn/langpy/kotime/controller/KoClassController.java +++ b/src/main/java/cn/langpy/kotime/controller/KoClassController.java @@ -12,8 +12,6 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; import java.util.logging.Logger; diff --git a/src/main/resources/koapp.properties b/src/main/resources/koapp.properties index 9696d4f..c6bdb02 100644 --- a/src/main/resources/koapp.properties +++ b/src/main/resources/koapp.properties @@ -1 +1 @@ -ko-time.version=2.4.9 \ No newline at end of file +ko-time.version=2.5.0 \ No newline at end of file diff --git a/src/main/resources/kostatic/operate-en.js b/src/main/resources/kostatic/operate-en.js deleted file mode 100644 index ee0c528..0000000 --- a/src/main/resources/kostatic/operate-en.js +++ /dev/null @@ -1,343 +0,0 @@ -function checkLogin() { - $.get(contextPath+'/koTime/isLogin?kotoken=' + globalToken+"&project="+globalProject, function (data) { - globalIsLogin = data['isLogin'] == 1 ? true : false; - }); - if (globalNeedLogin == true && globalIsLogin == false) { - UIkit.modal(document.getElementById("modal-login")).show(); - return; - } - ; -} - -function loadConfig(){ - $.get(contextPath+'/koTime/getConfig?kotoken='+globalToken+"&project="+globalProject, function (data) { - // let exceptionEnable = data['exceptionEnable']; - // - // let exceptionEnableDom = document.getElementById('exceptionEnable'); - // exceptionEnableDom.checked = exceptionEnable; - // - - let kotimeEnable = data['enable']; - // let kotimeEnableDom = document.getElementById('kotimeEnable'); - // kotimeEnableDom.checked = kotimeEnable; - - let apiTip = document.getElementById('apiTip'); - apiTip.innerHTML = kotimeEnable==true?"接口根据调用情况统计,未调用的接口无法被统计到,请先调用接口":"方法调用监测已关闭,数据将不会更新,需要开启请到配置面板"; - - let threshold = data['threshold']; - let timeThresholdDom = document.getElementById('timeThreshold'); - timeThresholdDom.value = threshold; - - // let logEnable = data['logEnable']; - // let logEnableDom = document.getElementById('logEnable'); - // logEnableDom.checked = logEnable; - - let language = data['language']; - $("#languageSwitch").val(language) - }); -} - -function addConfigEvent(){ - - - document.getElementById('languageSwitch').onchange = function(){ - let selectedObj = document.getElementById('languageSwitch'); - $.ajax({type:'POST',url:contextPath+'/koTime/updateConfig?kotoken='+globalToken+"&project="+globalProject,data:JSON.stringify({language:selectedObj.options[selectedObj.selectedIndex].value}),dataType:'json', headers: {'Content-Type': 'application/json' }}); - }; - - document.getElementById("timeThresholdYes").onclick = function(){ - $.ajax({type:'POST',url:contextPath+'/koTime/updateConfig?kotoken='+globalToken+"&project="+globalProject,data:JSON.stringify({threshold:document.getElementById('timeThreshold').value}),dataType:'json', headers: {'Content-Type': 'application/json' }}); - }; -} - -function loadStatistic(){ - $.get(contextPath+'/koTime/getStatistic?kotoken='+globalToken+"&project="+globalProject, function (data) { - let totalNum = data['totalNum']; - let systemTotalNum = document.getElementById("systemTotalNum"); - systemTotalNum.innerHTML=totalNum; - - let normalNum = data['normalNum']; - let systemNormalNum = document.getElementById("systemNormalNum"); - systemNormalNum.innerHTML=normalNum; - - let delayNum = data['delayNum']; - let systemDelayNum = document.getElementById("systemDelayNum"); - systemDelayNum.innerHTML=delayNum; - if (delayNum>0) { - document.getElementById("systemDelayNum-div").className+=' uk-label-danger'; - }else { - document.getElementById("systemDelayNum-div").className+=' uk-label-success'; - }; - - let avgRunTime = data['avgRunTime']; - let systemAvgRunTime = document.getElementById("systemAvgRunTime"); - systemAvgRunTime.innerHTML=avgRunTime; - if (avgRunTime>globalThreshold) { - document.getElementById("systemAvgRunTime-div").className+=' uk-label-danger'; - }else { - document.getElementById("systemAvgRunTime-div").className+=' uk-label-success'; - }; - - let maxRunTime = data['maxRunTime']; - let systemMaxRunTime = document.getElementById("systemMaxRunTime"); - systemMaxRunTime.innerHTML=maxRunTime; - if (maxRunTime>globalThreshold) { - document.getElementById("systemMaxRunTime-div").className+=' uk-label-danger'; - }else { - document.getElementById("systemMaxRunTime-div").className+=' uk-label-success'; - }; - - - let minRunTime = data['minRunTime']; - let systemMinRunTime = document.getElementById("systemMinRunTime"); - systemMinRunTime.innerHTML=minRunTime; - if (minRunTime>globalThreshold) { - document.getElementById("systemMinRunTime-div").className+=' uk-label-danger'; - }else { - document.getElementById("systemMinRunTime-div").className+=' uk-label-success'; - }; - - }); -} - -function loadApis(){ - let searchText = $("#searchText").val(); - $.get(contextPath+'/koTime/getApis?question='+searchText+'&kotoken='+globalToken+"&project="+globalProject, function (data) { - let element = document.getElementById('apiList'); - html = ''; - for (let i = 0; i < data.length; i++) { - let id = data[i]['id']; - let className = data[i]['className']; - let methodName = data[i]['methodName']; - let avgRunTime = data[i]['avgRunTime']; - let methodType = data[i]['methodType']; - let routeName = data[i]['routeName']; - - let apiId = className+"."+methodName; - let color = avgRunTime>globalThreshold?'danger':'success'; - if (methodType=='Controller' && routeName!=null && routeName!='') { - html += "
  • "+ className+"#"+methodName+" ("+routeName+")   avg "+avgRunTime+" ms
  • "; - }else{ - html += "
  • "+ className+"#"+methodName+"   avg "+avgRunTime+" ms
  • "; - } - }; - element.innerHTML = html; - }); -} - -function loadExceptions(){ - $.get(contextPath+'/koTime/getExceptions?kotoken='+globalToken+"&project="+globalProject, function (data) { - let element = document.getElementById('exceptionList'); - html = ''; - for (let i = 0; i < data.length; i++) { - let id = data[i]['id']; - let className = data[i]['className']; - let message = data[i]['message']; - html += "
  • "+className+"   "+message+"
  • "; - }; - element.innerHTML = html; - }); -} - -let methodParamMap = new Map(); -function paramGraph(e) { - let clickNode = e.currentTarget; - if (clickNode==null){ - return - }; - let clickNodeId = clickNode.id; - if (methodParamMap.has(clickNodeId+"ana")) { - graph.removeNode(clickNodeId+"ana") - methodParamMap.delete(clickNodeId+"ana") - }else { - $.get(contextPath+'/koTime/getParamGraph?kotoken='+globalToken+"&methodId="+clickNodeId.replace('node','')+"&project="+globalProject, function (data) { - let datas = [] - for(let key in data) { - datas.push( {"name":key+":avg "+data[key]['avgRunTime']+" ms"}) - }; - let paramGraphData = { - "id":clickNodeId+"ana", - "from":clickNodeId, - "title":{'name':"Combination of parameters"}, - "data":datas, - 'style':{ - 'title-color':'#427b72', - 'border-color':'#427b72', - 'data-font-size':'10px', - 'title-font-size':'12px' - } - } - let clickNodeX = Number(clickNode.getAttribute("x")); - let clickNodeY = Number(clickNode.getAttribute("y")); - graph.createNode(paramGraphData,clickNodeX,clickNodeY-100); - // graph.createNode(paramGraphData,e.x+150,e.y-30); - methodParamMap.set(clickNodeId+"ana","") - }); - } -} -function formData(data) { - if (data['avgRunTime']>globalThreshold) { - data['style'] = { - 'title-color':'#c71335', - 'border-color':'#c71335', - 'data-font-size':'10px', - 'title-font-size':'12px' - } - } - else{ - data['style'] = { - 'title-color':'#375d46', - 'border-color':'#375d46', - 'data-font-size':'10px', - 'title-font-size':'12px' - } - }; - data['title'] = {'name':data['name']}; - data['data'] = [ - {'name':'type:'+data['methodType']}, - {'name':'avg time:'+data['avgRunTime']+' ms'}, - {'name':'max time:'+data['maxRunTime']+' ms'}, - {'name':'min time:'+data['minRunTime']+' ms'} - ]; - if (data['exceptionNum']!=null && data['exceptionNum']>0) { - data['data'].push({'name':'number of exception:'+data['exceptionNum']+' 个'}); - } - data["dblclick"]="paramGraph"; - return data; -}; - - -function showMethods(name) { - let exceptionDetailDom = document.getElementById('layerDemo'); - exceptionDetailDom.innerHTML = ""; - let options = { - 'link-start-offsetx':8, - 'link-start-offsety':0, - 'link-end-offsetx':+10, - 'link-end-offsety':0, - 'link-width-offset':0 - }; - graph = new MetricFlow("layerDemo",options); - graph.threshold = globalThreshold; - UIkit.notification.closeAll(); - UIkit.modal(document.getElementById("modal-method")).show(); - - $.get(contextPath+'/koTime/getTree?methodName=' + name+'&kotoken='+globalToken+"&project="+globalProject, function (data) { - let rootX = 100; - let rootY = $(window).get(0).innerHeight / 2-50; - data['x'] = rootX; - data['y'] = rootY; - graph.createNodes(data,formData); - - }); - -}; - -function showExceptions(id,message) { - $.get(contextPath+'/koTime/getMethodsByExceptionId?exceptionId=' + id+'&message='+message+'&kotoken='+globalToken+"&project="+globalProject, function (data) { - let html = ''; - for (let i = 0; i < data.length; i++) { - html += - "" - if (data.length-1>i) { - html +='
    ' - } - }; - - let exceptionDetailDom = document.getElementById('exception-detail'); - exceptionDetailDom.innerHTML = html; - UIkit.notification.closeAll(); - UIkit.modal(document.getElementById("modal-exception")).show(); - }); -}; - -function login() { - let userId = $("#userName").val() - let password = $("#userPassword").val() - if (userId==undefined || userId.length<1 || password==undefined || password.length<1 ) { - UIkit.notification.closeAll() - UIkit.notification("请正确输入用户名和密码",{}); - return - } - $.ajax({ - type:'POST', - url:contextPath+"/koTime/login", - data:JSON.stringify({'userName':userId,'password':password}), - dataType:'json', - headers: {'Content-Type': 'application/json' }, - success:function (re) { - if (re['state']==1) { - UIkit.notification("Login was successful",{}); - UIkit.notification.closeAll() - sessionStorage.setItem("kotimeToken", re["token"]); - location.reload(); - }else { - UIkit.notification("Error user or password",{}); - } - }, - error:function (re) { - console.log(re) - } - }); -} -function searchTip(e){ - let question = $('#searchText').val() - $.get(contextPath+'/koTime/getApiTips?question='+question+'&kotoken='+globalToken+"&project="+globalProject, function (data) { - $("#condidates").html("") - for (let i = 0; i < data.length; i++) { - let name = data[i]; - $("#condidates").append(''); - for (let i = 0; i < data.length; i++) { - let name = data[i]; - $("#projects").append(``); - }; - }); -} - -function searchApis(e) { - if (e.keyCode == 13) { - let question = $('#searchText').val() - $.get(contextPath+'/koTime/getApis?question='+question+'&kotoken='+globalToken+"&project="+globalProject, function (data) { - let element = document.getElementById('apiList'); - html = ''; - for (let i = 0; i < data.length; i++) { - let id = data[i]['id']; - let className = data[i]['className']; - let methodName = data[i]['methodName']; - let avgRunTime = data[i]['avgRunTime']; - let methodType = data[i]['methodType']; - let routeName = data[i]['routeName']; - let apiId = className+"."+methodName; - let color = avgRunTime>globalThreshold?'danger':'success'; - - if (methodType=='Controller' && routeName!=null && routeName!='') { - html += "
  • "+ className+"#"+methodName+" ("+routeName+")   avg "+avgRunTime+" ms
  • "; - }else{ - html += "
  • "+ className+"#"+methodName+"   avg "+avgRunTime+" ms
  • "; - } - }; - element.innerHTML = html; - }); - $('#searchText').val(''); - } -} - -function getProjectName(){ - globalProject = document.querySelector("#projects").value; - loadStatistic(); - loadApis(); - loadExceptions(); -} \ No newline at end of file