@@ -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 += "