diff --git a/.gitignore b/.gitignore
index db66bd2..614d133 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,3 @@ rebel.xml
target/
.txlcn
*.log
-/.idea/
diff --git a/pom.xml b/pom.xml
index 9056994..ad51eb6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,35 +6,41 @@
cn.langpy
ko-time
- 2.4.4
+ 3.0.0
KoTime
+
A springboot tool for tracking the paths of the methods,which can help you find method's performances easily.
+
GNU Lesser General Public License v2.1
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt
+
https://gitee.com/huoyo/ko-time
+
master
https://gitee.com/huoyo/ko-time.git
scm:git:https://gitee.com/huoyo/ko-time.git
scm:git:https://gitee.com/huoyo/ko-time.git
+
1.9.9.1
- 9.0.43
- 5.3.24
- 5.3.24
- 5.3.24
- 2.7.4
- 2.6.2
- 2.7.3
+ 10.1.12
+ 6.0.11
+ 6.0.11
+ 6.0.11
+ 3.1.3
+ 3.1.3
+ 3.1.3
2.0.9
6.2.2
1.12.13
+
org.springframework
@@ -100,12 +106,14 @@
${oshi-core.version}
+
ZhangChang
1729913829@qq.com
+
@@ -113,8 +121,8 @@
maven-compiler-plugin
3.8.1
- 1.8
- 1.8
+ 17
+ 17
@@ -175,6 +183,7 @@
+
snapshots
diff --git a/src/main/java/cn/langpy/kotime/config/DefaultConfig.java b/src/main/java/cn/langpy/kotime/config/DefaultConfig.java
index 631dad7..abc5ab1 100644
--- a/src/main/java/cn/langpy/kotime/config/DefaultConfig.java
+++ b/src/main/java/cn/langpy/kotime/config/DefaultConfig.java
@@ -2,6 +2,7 @@ package cn.langpy.kotime.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
/**
@@ -9,43 +10,177 @@ import org.springframework.stereotype.Component;
*/
@Component
@ConfigurationProperties(prefix = "ko-time")
+@Lazy(value = false)
public class DefaultConfig {
- private Boolean enable;
- private String language;
+ /**
+ * to enable kotime
+ */
+ private Boolean enable = true;
+
+
+ /**
+ * to select language for viewer, chinese
+ */
+ private String language = "chinese";
@Deprecated
private String logLanguage;
- private Boolean logEnable;
- private Boolean versionNotice;
- private Double threshold;
- private Double discardRate;
- private String pointcut;
- private Boolean exceptionEnable;
- private Boolean paramAnalyse;
- private String saver;
+
+ /**
+ * false
+ * to print log in console
+ */
+ private Boolean logEnable = false;
+
+ /**
+ * "defaultValue": true,
+ * "description": "to enable version-notice",
+ */
+ private Boolean versionNotice = true;
+
+ /**
+ * red will appear if avgRunTime>threshold
+ */
+ private Double threshold = 800.0;
+
+
+ /**
+ * data will be discard if Math.random()loading method listener");
+ AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
+ String cutRange = defaultConfig.getPointcut() == null ? pointcut : defaultConfig.getPointcut();
+ cutRange = cutRange + " && !@annotation(cn.langpy.kotime.annotation.KoListener)";
+ advisor.setExpression(cutRange);
+ advisor.setAdvice(new RunTimeHandler());
+ return advisor;
+ }
+}
diff --git a/src/main/java/cn/langpy/kotime/config/KoTimeRunner.java b/src/main/java/cn/langpy/kotime/config/KoTimeRunner.java
new file mode 100644
index 0000000..4afa678
--- /dev/null
+++ b/src/main/java/cn/langpy/kotime/config/KoTimeRunner.java
@@ -0,0 +1,23 @@
+package cn.langpy.kotime.config;
+
+import jakarta.annotation.Resource;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * @author ccz
+ * @date 2024-7-5 03:17:13
+ */
+@ComponentScan("cn.langpy.kotime")
+@AutoConfiguration
+public class KoTimeRunner implements ApplicationRunner {
+ @Resource
+ private LoadConfig loadConfig;
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ loadConfig.initConfig();
+ }
+}
diff --git a/src/main/java/cn/langpy/kotime/config/LoadConfig.java b/src/main/java/cn/langpy/kotime/config/LoadConfig.java
index 6f41513..a32aab2 100644
--- a/src/main/java/cn/langpy/kotime/config/LoadConfig.java
+++ b/src/main/java/cn/langpy/kotime/config/LoadConfig.java
@@ -1,30 +1,27 @@
package cn.langpy.kotime.config;
import cn.langpy.kotime.annotation.KoListener;
-import cn.langpy.kotime.handler.RunTimeHandler;
import cn.langpy.kotime.handler.InvokedHandler;
import cn.langpy.kotime.service.GraphService;
import cn.langpy.kotime.service.InvokedQueue;
import cn.langpy.kotime.util.Common;
import cn.langpy.kotime.util.Context;
import cn.langpy.kotime.util.DataBaseException;
-import org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor;
+import jakarta.annotation.Resource;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
import javax.sql.DataSource;
-import java.io.*;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -32,8 +29,7 @@ import java.util.stream.Collectors;
/**
* zhangchang
*/
-@ComponentScan("cn.langpy.kotime")
-@Configuration
+@Component
public class LoadConfig {
private static Logger log = Logger.getLogger(LoadConfig.class.toString());
@@ -56,7 +52,6 @@ public class LoadConfig {
@Value("${server.servlet.context-path:}")
private String serverContext;
-
@Value("${ko-time.mail-enable:false}")
private Boolean mailEnable;
@@ -65,8 +60,6 @@ public class LoadConfig {
@Resource
private ApplicationContext applicationContext;
-
- @PostConstruct
public void initConfig() {
DefaultConfig config = improveConfig();
@@ -215,15 +208,4 @@ public class LoadConfig {
}
}
-
- @Bean
- public AspectJExpressionPointcutAdvisor configurabledvisor() {
- log.info("kotime=>loading method listener");
- AspectJExpressionPointcutAdvisor advisor = new AspectJExpressionPointcutAdvisor();
- String cutRange = defaultConfig.getPointcut() == null ? pointcut : defaultConfig.getPointcut();
- cutRange = cutRange + " && !@annotation(cn.langpy.kotime.annotation.KoListener)";
- advisor.setExpression(cutRange);
- advisor.setAdvice(new RunTimeHandler());
- return advisor;
- }
}
diff --git a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java
index 42daedb..15f520f 100644
--- a/src/main/java/cn/langpy/kotime/controller/KoTimeController.java
+++ b/src/main/java/cn/langpy/kotime/controller/KoTimeController.java
@@ -11,6 +11,8 @@ import cn.langpy.kotime.service.ThreadUsageService;
import cn.langpy.kotime.util.Context;
import cn.langpy.kotime.util.InvalidAuthInfoException;
import cn.langpy.kotime.util.KoUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
@@ -18,8 +20,6 @@ import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import java.util.logging.Logger;
@@ -44,6 +44,7 @@ public class KoTimeController {
private final String metricFlowJsText = getResourceText("kostatic/Metricflow.js");
private final String jQueryJsText = getResourceText("kostatic/JQuery.min.js");
private final String uiKitIconsJs = getResourceText("kostatic/uikit-icons.js");
+ private final String KoTimeUtil = getResourceText("kostatic/util.js");
@PostMapping("/login")
@ResponseBody
@@ -81,7 +82,7 @@ public class KoTimeController {
@GetMapping
- public void index(String kotoken, String test,String charset, String language,HttpServletResponse response, HttpServletRequest request) {
+ public void index(String kotoken, String test, String charset, String language, HttpServletResponse response, HttpServletRequest request) {
if (!Context.getConfig().getEnable()) {
return;
}
@@ -95,7 +96,7 @@ public class KoTimeController {
if (!StringUtils.hasText(charset)) {
charset = "utf-8";
}
- response.setContentType("text/html;charset="+charset);
+ response.setContentType("text/html;charset=" + charset);
ClassPathResource classPathResource = new ClassPathResource(KoConstant.getViewName(language));
try (
InputStream inputStream = classPathResource.getInputStream();
@@ -132,6 +133,8 @@ public class KoTimeController {
line = line.replace("staticTokenVisitValue", staticTokenVisit + "");
} else if (line.indexOf("staticTokenValue") > -1) {
line = line.replace("staticTokenValue", "'" + kotoken + "'");
+ } else if (line.indexOf("KoTimeUtil") > -1) {
+ line = line.replace("KoTimeUtil", KoTimeUtil);
}
stringBuilder.append(line + "\n");
}
@@ -377,7 +380,7 @@ public class KoTimeController {
threads = threads.stream().sorted(COMPARATOR).collect(Collectors.toList());
Map stateCounting = threads.stream().collect(Collectors.groupingBy(ThreadInfo::getState, Collectors.counting()));
- stateCounting.put("all",(long)threads.size());
+ stateCounting.put("all", (long) threads.size());
Map map = new HashMap();
map.put("statistics", stateCounting);
@@ -399,17 +402,17 @@ public class KoTimeController {
Properties dynamicProperties = Context.getDynamicProperties();
for (String line : textSplit) {
line = line.trim();
- if (line.length()==0 || line.startsWith("#") || line.startsWith("//")) {
+ if (line.length() == 0 || line.startsWith("#") || line.startsWith("//")) {
continue;
}
int i = line.indexOf("=");
- if (i<1) {
+ if (i < 1) {
continue;
}
String propertyStr = line.substring(0, i).trim();
- String valueStr = line.substring(i+1).trim();
- log.info("updated property: "+propertyStr+"=("+dynamicProperties.get(propertyStr)+"->"+valueStr+")");
- dynamicProperties.setProperty(propertyStr,valueStr);
+ String valueStr = line.substring(i + 1).trim();
+ log.info("updated property: " + propertyStr + "=(" + dynamicProperties.get(propertyStr) + "->" + valueStr + ")");
+ dynamicProperties.setProperty(propertyStr, valueStr);
}
return true;
@@ -426,8 +429,8 @@ public class KoTimeController {
StringBuilder stringBuilder = new StringBuilder();
for (String key : dynamicProperties.stringPropertyNames()) {
String value = dynamicProperties.getProperty(key);
- if (value!=null) {
- stringBuilder.append(key+"="+value+"\n");
+ if (value != null) {
+ stringBuilder.append(key + "=" + value + "\n");
}
}
map.put("data", stringBuilder.toString());
diff --git a/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 0000000..ee12a43
--- /dev/null
+++ b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+cn.langpy.kotime.config.KoTimeRunner
diff --git a/src/main/resources/kostatic/util.js b/src/main/resources/kostatic/util.js
new file mode 100644
index 0000000..865b0bf
--- /dev/null
+++ b/src/main/resources/kostatic/util.js
@@ -0,0 +1,10 @@
+function getSize(size) {
+ let sizes = [' Bytes', ' KB', ' MB', ' GB',
+ ' TB', ' PB', ' EB', ' ZB', ' YB'];
+
+ for (let i = 1; i < sizes.length; i++) {
+ if (size < Math.pow(1024, i))
+ return (Math.round((size / Math.pow(1024, i - 1)) * 100) / 100) + sizes[i - 1];
+ }
+ return size;
+}
diff --git a/src/main/resources/kotime.html b/src/main/resources/kotime.html
index 48892c4..9953f84 100644
--- a/src/main/resources/kotime.html
+++ b/src/main/resources/kotime.html
@@ -1,34 +1,34 @@
-
KoTime
-
+
-
-
+
+
@@ -636,7 +707,9 @@
@@ -648,30 +721,37 @@
线程列表
热更新
配置
- 技术支持
+ 技术支持
+
-
-
-
-
+
正常响应数
0
@@ -679,62 +759,86 @@
-
-
-
-
CPU使用率:0
+
+
CPU使用率:0
-
- - 用户使用率:0
- - 系统使用率:0
- - IO 等待率:0
+
+ - 用户使用率:0
+ - 系统使用率:0
+ - IO 等待率:0
-
-
堆内存:0
+
+
堆内存:0
-
- - 初始值:0
- - 最大值:0
- - 已使用:0
+
-
-
物理内存:0
+
+
物理内存:0
-
- - 总物理内存:0
- - 已使用内存:0
- - 此程序占用:0
+
+ - 总物理内存:0
+
+ - 已使用内存:0
+ - 此程序占用:0
@@ -748,105 +852,136 @@
-
-
+
-
-
-
-