From fc8834c4c593fd4e8b164a03544f548851ba537a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=99=93=E4=BC=9F?= Date: Fri, 23 Feb 2024 12:10:36 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=96=B9=E6=B3=95=E8=80=97?= =?UTF-8?q?=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 32 +++++++++++++- .../boot/sentinel/BootSentinelAgent.java | 19 ++++++++- .../interceptor/ExecutionTimeInterceptor.java | 42 +++++++++++++++++++ src/main/resources/log4j2.xml | 27 ++++++++++++ 4 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cn/com/xuxiaowei/boot/sentinel/interceptor/ExecutionTimeInterceptor.java create mode 100644 src/main/resources/log4j2.xml diff --git a/pom.xml b/pom.xml index e94f2f4..791b14a 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,12 @@ UTF-8 UTF-8 + + 1.14.12 + + + 2.23.0 + @@ -30,6 +36,18 @@ + + net.bytebuddy + byte-buddy + ${byte-buddy.version} + + + + org.apache.logging.log4j + log4j-core + ${log4j.version} + + @@ -90,9 +108,12 @@ org.apache.maven.plugins - maven-jar-plugin + maven-assembly-plugin 3.3.0 + + jar-with-dependencies + true @@ -104,6 +125,15 @@ + + + make-assembly + package + + single + + + diff --git a/src/main/java/cn/com/xuxiaowei/boot/sentinel/BootSentinelAgent.java b/src/main/java/cn/com/xuxiaowei/boot/sentinel/BootSentinelAgent.java index b424881..cd1c365 100644 --- a/src/main/java/cn/com/xuxiaowei/boot/sentinel/BootSentinelAgent.java +++ b/src/main/java/cn/com/xuxiaowei/boot/sentinel/BootSentinelAgent.java @@ -1,5 +1,12 @@ package cn.com.xuxiaowei.boot.sentinel; +import cn.com.xuxiaowei.boot.sentinel.interceptor.ExecutionTimeInterceptor; +import net.bytebuddy.agent.builder.AgentBuilder; +import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.matcher.ElementMatchers; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import java.lang.instrument.Instrumentation; /** @@ -10,8 +17,18 @@ import java.lang.instrument.Instrumentation; */ public class BootSentinelAgent { + private static final Logger logger = LogManager.getLogger(BootSentinelAgent.class); + public static void premain(String agentArgs, Instrumentation inst) { - System.out.println("BootSentinelAgent is running."); + logger.info("BootSentinelAgent 已启动"); + + AgentBuilder.Transformer transformer = (builder, typeDescription, classLoader, javaModule, + protectionDomain) -> builder.method(ElementMatchers.any()) + .intercept(MethodDelegation.to(ExecutionTimeInterceptor.class)); + + new AgentBuilder.Default().type(ElementMatchers.nameStartsWith("com.example.demo.controller")) + .transform(transformer) + .installOn(inst); } } diff --git a/src/main/java/cn/com/xuxiaowei/boot/sentinel/interceptor/ExecutionTimeInterceptor.java b/src/main/java/cn/com/xuxiaowei/boot/sentinel/interceptor/ExecutionTimeInterceptor.java new file mode 100644 index 0000000..50670ea --- /dev/null +++ b/src/main/java/cn/com/xuxiaowei/boot/sentinel/interceptor/ExecutionTimeInterceptor.java @@ -0,0 +1,42 @@ +package cn.com.xuxiaowei.boot.sentinel.interceptor; + +import net.bytebuddy.implementation.bind.annotation.Origin; +import net.bytebuddy.implementation.bind.annotation.RuntimeType; +import net.bytebuddy.implementation.bind.annotation.SuperCall; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.lang.reflect.Method; +import java.util.concurrent.Callable; + +/** + * @author xuxiaowei + * @since 0.0.1 + */ +public class ExecutionTimeInterceptor { + + private static final Logger logger = LogManager.getLogger(ExecutionTimeInterceptor.class); + + @RuntimeType + public static Object intercept(@Origin Method method, @SuperCall Callable callable) throws Exception { + long start = System.currentTimeMillis(); + Object result = callable.call(); + + Class declaringClass = method.getDeclaringClass(); + String declaringClassName = declaringClass.getName(); + + String methodName = method.getName(); + + StringBuilder parameterTypeNameBuilder = new StringBuilder(); + Class[] parameterTypes = method.getParameterTypes(); + for (Class parameterType : parameterTypes) { + parameterTypeNameBuilder.append(parameterType.getTypeName()); + } + + logger.info("{}#{}({}) 执行耗时 {} ms", declaringClassName, methodName, parameterTypeNameBuilder.toString(), + (System.currentTimeMillis() - start)); + + return result; + } + +} diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml new file mode 100644 index 0000000..b902a50 --- /dev/null +++ b/src/main/resources/log4j2.xml @@ -0,0 +1,27 @@ + + + /logs + + + + + %d - %c - %L [%t] %-5p %x - %m%n + + + + + + + + + + + + + + + + + +