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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+