Skip to content

Commit 18a46a7

Browse files
authored
Merge pull request #350 from megaease/spring_boot
feat: release 2.3.0
2 parents d43ed91 + 1953be0 commit 18a46a7

File tree

208 files changed

+8906
-512
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

208 files changed

+8906
-512
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ jobs:
3232
fail-fast: false
3333
matrix:
3434
os: [ ubuntu-latest, windows-latest ]
35-
java-version: [ 8, 11, 16 ]
35+
java-version: [ 8, 11, 16, 17 ]
3636
java-distribution: [ adopt, adopt-openj9 ]
3737

3838
# Steps represent a sequence of tasks that will be executed as part of the job
@@ -53,4 +53,4 @@ jobs:
5353

5454
# Runs a single command using the runners shell
5555
- name: Build with Maven
56-
run: mvn clean package
56+
run: mvn clean package

build/pom.xml

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<parent>
2222
<artifactId>easeagent</artifactId>
2323
<groupId>com.megaease.easeagent</groupId>
24-
<version>2.2.9</version>
24+
<version>2.3.0</version>
2525
</parent>
2626
<modelVersion>4.0.0</modelVersion>
2727

@@ -38,23 +38,6 @@
3838
<artifactId>javax.servlet-api</artifactId>
3939
<scope>provided</scope>
4040
</dependency>
41-
<dependency>
42-
<groupId>org.springframework.boot</groupId>
43-
<artifactId>spring-boot-starter-web</artifactId>
44-
<version>${version.spring-boot}</version>
45-
<scope>provided</scope>
46-
</dependency>
47-
<dependency>
48-
<groupId>org.springframework.cloud</groupId>
49-
<artifactId>spring-cloud-starter-openfeign</artifactId>
50-
<scope>provided</scope>
51-
</dependency>
52-
<dependency>
53-
<groupId>org.springframework.cloud</groupId>
54-
<artifactId>spring-cloud-starter-gateway</artifactId>
55-
<scope>provided</scope>
56-
</dependency>
57-
5841
<dependency>
5942
<groupId>com.megaease.easeagent</groupId>
6043
<artifactId>metrics</artifactId>
@@ -209,6 +192,7 @@
209192
<Premain-Class>com.megaease.easeagent.Main</Premain-Class>
210193
<Bootstrap-Class>com.megaease.easeagent.StartBootstrap</Bootstrap-Class>
211194
<Logging-Property>log4j.configurationFile</Logging-Property>
195+
<Easeagent-Version>${version}</Easeagent-Version>
212196
</manifestEntries>
213197
</archive>
214198
<archiverConfig>

build/src/main/resources/agent.properties

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ easeagent.server.enabled=true
88
easeagent.server.port=9900
99
# Enable health/readiness
1010
easeagent.health.readiness.enabled=true
11+
plugin.integrability.global.healthReady.enabled=true
1112
# forwarded headers page
1213
# Pass-through headers from the root process all the way to the end
1314
# format: easeagent.progress.forwarded.headers={headerName}
@@ -36,6 +37,7 @@ observability.tracings.tag.response.headers.eg.1=X-EG-Retryer
3637
observability.tracings.tag.response.headers.eg.2=X-EG-Rate-Limiter
3738
observability.tracings.tag.response.headers.eg.3=X-EG-Time-Limiter
3839
# -------------------- plugin global config ---------------------
40+
plugin.observability.global.init.enabled=true
3941
plugin.observability.global.tracing.enabled=true
4042
plugin.observability.global.metric.enabled=true
4143
plugin.observability.global.metric.interval=30
@@ -198,7 +200,7 @@ plugin.observability.redis.metric.url=/platform-metrics
198200
# plugin.observability.springGateway.metric.appendType=kafka
199201
#
200202
# -------------------- request ---------------------
201-
## httpclient tracing:httpclient and httpclient5
203+
## httpclient tracing\uFF1Ahttpclient and httpclient5
202204
# plugin.observability.httpclient.tracing.enabled=true
203205
## okHttp tracing
204206
# plugin.observability.okHttp.tracing.enabled=true
@@ -352,3 +354,6 @@ reporter.tracing.output.messageTimeout=1000
352354
## final output url: http://127.0.0.10:9090/metric
353355
#reporter.metric.sender.url=/metrics
354356

357+
## support spring boot 3.5.3: jdk17+3.5.3
358+
#runtime.code.version.points.jdk=jdk17
359+
#runtime.code.version.points.spring-boot=3.x.x

config/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<parent>
2323
<artifactId>easeagent</artifactId>
2424
<groupId>com.megaease.easeagent</groupId>
25-
<version>2.2.9</version>
25+
<version>2.3.0</version>
2626
</parent>
2727
<modelVersion>4.0.0</modelVersion>
2828

config/src/main/java/com/megaease/easeagent/config/ConfigUtils.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
import static com.megaease.easeagent.plugin.api.config.ConfigConst.*;
3333

3434
public class ConfigUtils {
35-
private ConfigUtils() {}
35+
private ConfigUtils() {
36+
}
3637

3738
public static <R> void bindProp(String name, Config configs, BiFunction<Config, String, R> func, Consumer<R> consumer, R def) {
3839
Runnable process = () -> {
@@ -134,12 +135,16 @@ public static String buildPluginProperty(String domain, String namespace, String
134135
return String.format(PLUGIN_FORMAT, domain, namespace, id, property);
135136
}
136137

138+
public static String buildCodeVersionKey(String key) {
139+
return RUNTIME_CODE_VERSION_POINTS_PREFIX + key;
140+
}
141+
137142
/**
138143
* extract config item with a fromPrefix to and convert the prefix to 'toPrefix' for configuration Compatibility
139144
*
140-
* @param cfg config source map
145+
* @param cfg config source map
141146
* @param fromPrefix from
142-
* @param toPrefix to
147+
* @param toPrefix to
143148
* @return Extracted and converted KV map
144149
*/
145150
public static Map<String, String> extractAndConvertPrefix(Map<String, String> cfg, String fromPrefix, String toPrefix) {
@@ -162,8 +167,9 @@ public static Map<String, String> extractAndConvertPrefix(Map<String, String> cf
162167

163168
/**
164169
* Extract config items from config by prefix
165-
* @param config config
166-
* @param prefix prefix
170+
*
171+
* @param config config
172+
* @param prefix prefix
167173
* @return Extracted KV
168174
*/
169175
public static Map<String, String> extractByPrefix(Config config, String prefix) {

context/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<parent>
2323
<artifactId>easeagent</artifactId>
2424
<groupId>com.megaease.easeagent</groupId>
25-
<version>2.2.9</version>
25+
<version>2.3.0</version>
2626
</parent>
2727
<modelVersion>4.0.0</modelVersion>
2828

core/pom.xml

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<parent>
2222
<artifactId>easeagent</artifactId>
2323
<groupId>com.megaease.easeagent</groupId>
24-
<version>2.2.9</version>
24+
<version>2.3.0</version>
2525
</parent>
2626
<modelVersion>4.0.0</modelVersion>
2727

@@ -105,12 +105,6 @@
105105
<artifactId>reactor-core</artifactId>
106106
<scope>provided</scope>
107107
</dependency>
108-
<dependency>
109-
<groupId>org.springframework</groupId>
110-
<artifactId>spring-web</artifactId>
111-
<version>${version.spring}</version>
112-
<scope>test</scope>
113-
</dependency>
114108
<dependency>
115109
<groupId>net.bytebuddy</groupId>
116110
<artifactId>byte-buddy-agent</artifactId>

core/src/main/java/com/megaease/easeagent/core/Bootstrap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ public static AgentBuilder getAgentBuilder(Configs config, boolean test) {
200200
.with(AgentBuilder.LocationStrategy.ForClassLoader.STRONG
201201
.withFallbackTo(ClassFileLocator.ForClassLoader.ofSystemLoader()));
202202
AgentBuilder.Ignored ignore = builder.ignore(isSynthetic())
203-
.or(nameStartsWith("sun."))
203+
.or(nameStartsWith("sun.").and(not(nameStartsWith("sun.net.www.protocol.http")) ))
204204
.or(nameStartsWith("com.sun."))
205205
.or(nameStartsWith("brave."))
206206
.or(nameStartsWith("zipkin2."))

core/src/main/java/com/megaease/easeagent/core/plugin/PluginLoader.java

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,24 @@
1717

1818
package com.megaease.easeagent.core.plugin;
1919

20+
import com.megaease.easeagent.config.ConfigUtils;
2021
import com.megaease.easeagent.config.Configs;
2122
import com.megaease.easeagent.core.plugin.matcher.ClassTransformation;
2223
import com.megaease.easeagent.core.plugin.matcher.MethodTransformation;
2324
import com.megaease.easeagent.core.plugin.registry.PluginRegistry;
2425
import com.megaease.easeagent.core.plugin.transformer.CompoundPluginTransformer;
2526
import com.megaease.easeagent.core.plugin.transformer.DynamicFieldTransformer;
2627
import com.megaease.easeagent.core.plugin.transformer.ForAdviceTransformer;
28+
import com.megaease.easeagent.core.plugin.transformer.TypeFieldTransformer;
2729
import com.megaease.easeagent.log4j2.Logger;
2830
import com.megaease.easeagent.log4j2.LoggerFactory;
2931
import com.megaease.easeagent.plugin.AgentPlugin;
30-
import com.megaease.easeagent.plugin.interceptor.InterceptorProvider;
32+
import com.megaease.easeagent.plugin.CodeVersion;
3133
import com.megaease.easeagent.plugin.Ordered;
3234
import com.megaease.easeagent.plugin.Points;
3335
import com.megaease.easeagent.plugin.field.AgentDynamicFieldAccessor;
36+
import com.megaease.easeagent.plugin.interceptor.InterceptorProvider;
37+
import com.megaease.easeagent.plugin.utils.common.StringUtils;
3438
import net.bytebuddy.agent.builder.AgentBuilder;
3539

3640
import java.util.*;
@@ -46,19 +50,27 @@ private PluginLoader() {
4650

4751
public static AgentBuilder load(AgentBuilder ab, Configs conf) {
4852
pluginLoad();
53+
pointsLoad(conf);
4954
providerLoad();
50-
Set<ClassTransformation> sortedTransformations = pointsLoad();
55+
Set<ClassTransformation> sortedTransformations = classTransformationLoad();
5156

5257
for (ClassTransformation transformation : sortedTransformations) {
5358
ab = ab.type(transformation.getClassMatcher(), transformation.getClassloaderMatcher())
54-
.transform(compound(transformation.isHasDynamicField(), transformation.getMethodTransformations()));
59+
.transform(compound(transformation.isHasDynamicField(), transformation.getMethodTransformations(), transformation.getTypeFieldAccessor()));
5560
}
5661
return ab;
5762
}
5863

5964
public static void providerLoad() {
6065
for (InterceptorProvider provider : BaseLoader.load(InterceptorProvider.class)) {
61-
log.debug("loading provider:{}", provider.getClass().getName());
66+
String pointsClassName = PluginRegistry.getPointsClassName(provider.getAdviceTo());
67+
Points points = PluginRegistry.getPoints(pointsClassName);
68+
if (points == null) {
69+
log.debug("Unload provider:{}, can not found Points<{}>", provider.getClass().getName(), pointsClassName);
70+
continue;
71+
} else {
72+
log.debug("Loading provider:{}", provider.getClass().getName());
73+
}
6274

6375
try {
6476
log.debug("provider for:{} at {}",
@@ -73,14 +85,14 @@ public static void providerLoad() {
7385
}
7486
}
7587

76-
public static Set<ClassTransformation> pointsLoad() {
77-
List<Points> points = BaseLoader.load(Points.class);
88+
public static Set<ClassTransformation> classTransformationLoad() {
89+
Collection<Points> points = PluginRegistry.getPoints();
7890
return points.stream().map(point -> {
7991
try {
80-
return PluginRegistry.register(point);
92+
return PluginRegistry.registerClassTransformation(point);
8193
} catch (Exception e) {
8294
log.error(
83-
"Unable to load points in [class {}]",
95+
"Unable to load classTransformation in [class {}]",
8496
point.getClass().getName(),
8597
e);
8698
return null;
@@ -111,12 +123,54 @@ public static void pluginLoad() {
111123
}
112124
}
113125

126+
public static void pointsLoad(Configs conf) {
127+
for (Points points : BaseLoader.load(Points.class)) {
128+
if (!isCodeVersion(points, conf)) {
129+
continue;
130+
} else {
131+
log.info("Loading points [class Points<{}>]", points.getClass().getName());
132+
}
133+
134+
try {
135+
PluginRegistry.register(points);
136+
} catch (Exception | LinkageError e) {
137+
log.error(
138+
"Unable to load extension [class {}]",
139+
points.getClass().getName(),
140+
e);
141+
}
142+
}
143+
}
144+
145+
public static boolean isCodeVersion(Points points, Configs conf) {
146+
CodeVersion codeVersion = points.codeVersions();
147+
if (codeVersion.isEmpty()) {
148+
return true;
149+
}
150+
String versionKey = ConfigUtils.buildCodeVersionKey(codeVersion.getKey());
151+
Set<String> versions = new HashSet<>(conf.getStringList(versionKey));
152+
if (versions.isEmpty()) {
153+
versions = Points.DEFAULT_VERSIONS;
154+
}
155+
Set<String> pointVersions = codeVersion.getVersions();
156+
for (String version : versions) {
157+
if (pointVersions.contains(version)) {
158+
return true;
159+
}
160+
}
161+
log.info("Unload points [class Points<{}>], the config [{}={}] is not in Points.codeVersions()=[{}:{}]",
162+
points.getClass().getCanonicalName(), versionKey, String.join(",", versions),
163+
codeVersion.getKey(), String.join(",", codeVersion.getVersions()));
164+
return false;
165+
}
166+
167+
114168
/**
115169
* @param methodTransformations method matchers under a special classMatcher
116170
* @return transform
117171
*/
118172
public static AgentBuilder.Transformer compound(boolean hasDynamicField,
119-
Iterable<MethodTransformation> methodTransformations) {
173+
Iterable<MethodTransformation> methodTransformations, String typeFieldAccessor) {
120174
List<AgentBuilder.Transformer> agentTransformers = StreamSupport
121175
.stream(methodTransformations.spliterator(), false)
122176
.map(ForAdviceTransformer::new)
@@ -126,6 +180,10 @@ public static AgentBuilder.Transformer compound(boolean hasDynamicField,
126180
agentTransformers.add(new DynamicFieldTransformer(AgentDynamicFieldAccessor.DYNAMIC_FIELD_NAME));
127181
}
128182

183+
if (StringUtils.hasText(typeFieldAccessor)) {
184+
agentTransformers.add(new TypeFieldTransformer(typeFieldAccessor));
185+
}
186+
129187
return new CompoundPluginTransformer(agentTransformers);
130188
}
131189
}

core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassTransformation.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,16 @@ public class ClassTransformation implements Ordered {
3232
private int order;
3333
private Junction<TypeDescription> classMatcher;
3434
private ElementMatcher<ClassLoader> classloaderMatcher;
35-
private Set<MethodTransformation> methodTransformations;
35+
private Set<MethodTransformation> methodTransformations;
3636
private boolean hasDynamicField;
37+
private String typeFieldAccessor;
3738

3839
public ClassTransformation(int order,
3940
ElementMatcher<ClassLoader> classloaderMatcher,
4041
Junction<TypeDescription> classMatcher,
4142
Set<MethodTransformation> methodTransformations,
42-
boolean hasDynamicField) {
43+
boolean hasDynamicField,
44+
String typeFieldAccessor) {
4345
this.order = order;
4446
if (classloaderMatcher == null) {
4547
this.classloaderMatcher = any();
@@ -49,6 +51,7 @@ public ClassTransformation(int order,
4951
this.classMatcher = classMatcher;
5052
this.methodTransformations = methodTransformations;
5153
this.hasDynamicField = hasDynamicField;
54+
this.typeFieldAccessor = typeFieldAccessor;
5255
}
5356

5457
public static Builder builder() {
@@ -67,6 +70,8 @@ public static class Builder {
6770
private Set<MethodTransformation> methodTransformations;
6871
private boolean hasDynamicField;
6972

73+
private String typeFieldAccessor;
74+
7075
Builder() {
7176
}
7277

@@ -95,9 +100,14 @@ public Builder hasDynamicField(boolean hasDynamicField) {
95100
return this;
96101
}
97102

103+
public Builder typeFieldAccessor(String typeFieldAccessor) {
104+
this.typeFieldAccessor = typeFieldAccessor;
105+
return this;
106+
}
107+
98108
public ClassTransformation build() {
99109
return new ClassTransformation(order, classloaderMatcher, classMatcher,
100-
methodTransformations, hasDynamicField);
110+
methodTransformations, hasDynamicField, typeFieldAccessor);
101111
}
102112

103113
public String toString() {

0 commit comments

Comments
 (0)