Skip to content

Commit 59794ab

Browse files
committed
调整示例代码
1 parent 105bde2 commit 59794ab

File tree

19 files changed

+749
-23
lines changed

19 files changed

+749
-23
lines changed

spring-cloud-gray-samples/pom.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<module>spring-cloud-gray-server-sample</module>
2020
<module>spring-cloud-gray-service-a1-sample</module>
2121
<module>spring-cloud-gray-stream-sample</module>
22+
<module>spring-cloud-gray-performance-agent</module>
2223
</modules>
2324

2425
<build>
@@ -33,6 +34,25 @@
3334
</plugin>
3435
</plugins>
3536
</pluginManagement>
37+
<!-- <defaultGoal>spring-boot:run</defaultGoal>-->
38+
<!-- <plugins>-->
39+
<!-- <plugin>-->
40+
<!-- <groupId>org.springframework.boot</groupId>-->
41+
<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
42+
<!-- <executions>-->
43+
<!-- <execution>-->
44+
<!-- <goals>-->
45+
<!-- <goal>build-info</goal>-->
46+
<!-- </goals>-->
47+
<!-- </execution>-->
48+
<!-- </executions>-->
49+
<!-- <configuration>-->
50+
<!-- <executable>true</executable>-->
51+
<!-- &lt;!&ndash; 没有该配置,devtools 不生效 &ndash;&gt;-->
52+
<!-- <fork>true</fork>-->
53+
<!-- </configuration>-->
54+
<!-- </plugin>-->
55+
<!-- </plugins>-->
3656
</build>
3757

3858
</project>
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>spring-cloud-gray-samples</artifactId>
7+
<groupId>cn.springcloud.gray</groupId>
8+
<version>A.1.0.9</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>spring-cloud-gray-performance-agent</artifactId>
13+
14+
<properties>
15+
<bytebuddy.version>1.9.14</bytebuddy.version>
16+
</properties>
17+
18+
<dependencies>
19+
<dependency>
20+
<groupId>org.javassist</groupId>
21+
<artifactId>javassist</artifactId>
22+
<version>3.22.0-CR1</version>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.apache.commons</groupId>
26+
<artifactId>commons-lang3</artifactId>
27+
</dependency>
28+
<!-- https://mvnrepository.com/artifact/net.bytebuddy/byte-buddy -->
29+
<dependency>
30+
<groupId>net.bytebuddy</groupId>
31+
<artifactId>byte-buddy</artifactId>
32+
<version>${bytebuddy.version}</version>
33+
</dependency>
34+
<dependency>
35+
<groupId>net.bytebuddy</groupId>
36+
<artifactId>byte-buddy-agent</artifactId>
37+
<version>${bytebuddy.version}</version>
38+
</dependency>
39+
<dependency>
40+
<groupId>org.slf4j</groupId>
41+
<artifactId>slf4j-api</artifactId>
42+
<!-- <version>1.7.26</version>-->
43+
</dependency>
44+
</dependencies>
45+
46+
47+
<build>
48+
<plugins>
49+
<!-- <plugin>
50+
<groupId>org.apache.maven.plugins</groupId>
51+
<artifactId>maven-compiler-plugin</artifactId>
52+
<version>2.0.2</version>
53+
<configuration>
54+
<source>1.8</source>
55+
<target>1.8</target>
56+
</configuration>
57+
</plugin> -->
58+
<plugin>
59+
<groupId>org.apache.maven.plugins</groupId>
60+
<artifactId>maven-jar-plugin</artifactId>
61+
<configuration>
62+
<archive>
63+
<!-- <manifestFile>src/main/reources/META-INF/MANIFEST.MF</manifestFile> -->
64+
<manifestEntries>
65+
<Premain-Class>cn.springcloud.gray.performance.agent.GrayPerformanceAgent</Premain-Class>
66+
<Can-Redefine-Classes>true</Can-Redefine-Classes>
67+
<Class-Path>javassist-3.22.0-CR1.jar commons-lang3-3.5.jar slf4j-api-1.7.26.jar</Class-Path>
68+
<!-- <Boot-Class-Path>javassist-3.18.1-GA.jar</Boot-Class-Path> -->
69+
</manifestEntries>
70+
71+
</archive>
72+
</configuration>
73+
</plugin>
74+
<plugin>
75+
<groupId>org.apache.maven.plugins</groupId>
76+
<artifactId>maven-shade-plugin</artifactId>
77+
<executions>
78+
<execution>
79+
<phase>package</phase>
80+
<goals>
81+
<goal>shade</goal>
82+
</goals>
83+
</execution>
84+
</executions>
85+
<configuration>
86+
<artifactSet>
87+
<includes>
88+
<include>javassist:javassist:jar:</include>
89+
<include>javassist:javassist:jar:</include>
90+
<include>net.bytebuddy:byte-buddy:jar:</include>
91+
<include>org.slf4j:slf4j-api:jar:</include>
92+
<include>org.apache.commons:commons-lang3:jar:</include>
93+
</includes>
94+
</artifactSet>
95+
</configuration>
96+
</plugin>
97+
</plugins>
98+
</build>
99+
</project>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package cn.springcloud.gray.performance;
2+
3+
import java.io.File;
4+
import java.io.PrintWriter;
5+
import java.util.concurrent.ArrayBlockingQueue;
6+
import java.util.concurrent.BlockingQueue;
7+
8+
public class PerformanceLogger {
9+
10+
private static BlockingQueue<String> queue = new ArrayBlockingQueue<>(20000);
11+
private static Thread hook_thread;
12+
13+
public static void printMethodUsedTime(String longName, long usedTime) {
14+
queue.add(longName + " " + usedTime);
15+
}
16+
17+
18+
public static void start() {
19+
try {
20+
PrintWriter printWriter = new PrintWriter(new File("gray-agent-" + System.currentTimeMillis() + ".txt"));
21+
Thread t = new Thread(new LogRunnable(printWriter));
22+
t.start();
23+
System.out.println("开启应用...");
24+
hook_thread = new Thread(new Runnable() {
25+
@Override
26+
public void run() {
27+
System.out.println("关闭应用...");
28+
printWriter.flush();
29+
printWriter.close();
30+
}
31+
});
32+
} catch (Exception e) {
33+
e.printStackTrace();
34+
}
35+
}
36+
37+
public static Thread getHookThread() {
38+
return hook_thread;
39+
}
40+
41+
42+
public static class LogRunnable implements Runnable {
43+
44+
private PrintWriter printWriter;
45+
46+
public LogRunnable(PrintWriter printWriter) {
47+
this.printWriter = printWriter;
48+
}
49+
50+
@Override
51+
public void run() {
52+
int count = 0;
53+
while (true) {
54+
try {
55+
count++;
56+
String v = queue.take();
57+
printWriter.println(v);
58+
if (count > 9999) {
59+
printWriter.flush();
60+
count = 0;
61+
}
62+
} catch (Exception e) {
63+
e.printStackTrace();
64+
}
65+
66+
}
67+
}
68+
}
69+
70+
71+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package cn.springcloud.gray.performance.agent;
2+
3+
import javassist.ClassPool;
4+
import javassist.CtClass;
5+
import javassist.LoaderClassPath;
6+
7+
import java.io.ByteArrayInputStream;
8+
import java.io.IOException;
9+
10+
/**
11+
* @author Jerry Lee (oldratlee at gmail dot com)
12+
* @since 2.11.0
13+
*/
14+
public class ClassInfo {
15+
private final String className;
16+
private final byte[] classFileBuffer;
17+
private final ClassLoader loader;
18+
19+
// SuppressFBWarnings for classFileBuffer parameter:
20+
// [ERROR] new com.alibaba.ttl.threadpool.agent.internal.transformlet.ClassInfo(String, byte[], ClassLoader)
21+
// may expose internal representation by storing an externally mutable object
22+
// into ClassInfo.classFileBuffer
23+
public ClassInfo(String className, byte[] classFileBuffer, ClassLoader loader) {
24+
this.className = className;
25+
this.classFileBuffer = classFileBuffer;
26+
this.loader = loader;
27+
}
28+
29+
public String getClassName() {
30+
return className;
31+
}
32+
33+
private CtClass ctClass;
34+
35+
public CtClass getCtClass() throws IOException {
36+
if (ctClass != null) return ctClass;
37+
38+
final ClassPool classPool = new ClassPool(true);
39+
if (loader == null) {
40+
classPool.appendClassPath(new LoaderClassPath(ClassLoader.getSystemClassLoader()));
41+
} else {
42+
classPool.appendClassPath(new LoaderClassPath(loader));
43+
}
44+
45+
final CtClass clazz = classPool.makeClass(new ByteArrayInputStream(classFileBuffer), false);
46+
clazz.defrost();
47+
48+
this.ctClass = clazz;
49+
return clazz;
50+
}
51+
52+
private boolean modified = false;
53+
54+
public boolean isModified() {
55+
return modified;
56+
}
57+
58+
public void setModified() {
59+
this.modified = true;
60+
}
61+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package cn.springcloud.gray.performance.agent;
2+
3+
import cn.springcloud.gray.performance.PerformanceLogger;
4+
import net.bytebuddy.agent.builder.AgentBuilder;
5+
import net.bytebuddy.description.method.MethodDescription;
6+
import net.bytebuddy.description.type.TypeDescription;
7+
import net.bytebuddy.dynamic.DynamicType;
8+
import net.bytebuddy.implementation.MethodDelegation;
9+
import net.bytebuddy.matcher.ElementMatchers;
10+
import net.bytebuddy.utility.JavaModule;
11+
12+
import java.lang.instrument.Instrumentation;
13+
14+
15+
/**
16+
* -javaagent:{dir}/fm-orm-0.0.1-SNAPSHOT.jar={string args}
17+
*/
18+
public class GrayPerformanceAgent {
19+
20+
public static void premain(String agentOps, Instrumentation inst) {
21+
System.out.println("=========premain方法执行========");
22+
PerformanceLogger.start();
23+
// 添加Transformer
24+
// inst.addTransformer(new GrayPerformanceTransformer(agentOps));
25+
26+
27+
AgentBuilder.Listener listener = new AgentBuilder.Listener() {
28+
@Override
29+
public void onDiscovery(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {
30+
31+
}
32+
33+
@Override
34+
public void onTransformation(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded, DynamicType dynamicType) {
35+
36+
}
37+
38+
@Override
39+
public void onIgnored(TypeDescription typeDescription, ClassLoader classLoader, JavaModule module, boolean loaded) {
40+
41+
}
42+
43+
@Override
44+
public void onError(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded, Throwable throwable) {
45+
46+
}
47+
48+
@Override
49+
public void onComplete(String typeName, ClassLoader classLoader, JavaModule module, boolean loaded) {
50+
51+
}
52+
53+
};
54+
55+
AgentBuilder.Transformer transformer = new AgentBuilder.Transformer() {
56+
@Override
57+
public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {
58+
return builder
59+
.method(ElementMatchers.<MethodDescription>any()) // 拦截任意方法
60+
.intercept(MethodDelegation.to(TimeInterceptor.class)); // 委托
61+
}
62+
63+
};
64+
65+
66+
new AgentBuilder
67+
.Default()
68+
.ignore(ElementMatchers.nameStartsWith("cn.springcloud.gray.service.b")
69+
.or(ElementMatchers.nameStartsWith("cn.springcloud.gray.zuul")))
70+
.type(ElementMatchers.nameStartsWith("cn.springcloud.gray")) // 指定需要拦截的类
71+
.transform(transformer)
72+
.with(listener)
73+
.installOn(inst);
74+
75+
Runtime.getRuntime().addShutdownHook(PerformanceLogger.getHookThread());
76+
}
77+
78+
79+
}

0 commit comments

Comments
 (0)