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 + 0
      -
      +
      延迟响应数
      0
      -
      +
      正常响应数
      0
      @@ -679,62 +759,86 @@
      -
      +
      平均响应(ms)
      0
      -
      +
      最大响应(ms)
      0
      -
      +
      最小响应(ms)
      0
      -
      - 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
      • +
          +
        • 总物理内存:0 +
        • +
        • 已使用内存:0
        • +
        • 此程序占用:0
      @@ -748,105 +852,136 @@
    • -
        +
        • method 1 1 0
      • -
          +
          • exception 1 1 未开启
        • -
          +
          ALL
          - 0 + 0
          -
          +
          RUNNABLE
          0
          -
          +
          BLOCKED
          0
          -
          +
          WAITING
          0
          -
          +
          TIMED_WAITING
          0
          -
            +
            • thread 1 1 0
          • -
            -
            - - +
            +
            + +


            - +

            - +
            • -
              +
              - +
              - +
              - +
              - +
              - +
              - + +
              - + +

              @@ -858,10 +993,14 @@
            • - +

              - +
            @@ -871,12 +1010,29 @@

            @@ -891,8 +1047,10 @@