9.0.0
Download
https://skywalking.apache.org/downloads/
Notice
Don't download source codes from this page.
Please follow build document, if you want to build source codes by yourself.
Kernel Updates
- Support re-transform/hot-swap classes with other java agents, and remove the obsolete cache enhanced class feature.
- Implement new naming policies for names of auxiliary type, interceptor delegate field, renamed origin method, method
access name, method cache value field. All names are undersw$
name trait. They are predictable and unchanged after
re-transform.
* SWAuxiliaryTypeNamingStrategy
Auxiliary type name pattern: <origin_class_name>$<name_trait>$auxiliary$<auxiliary_type_instance_hash>
* DelegateNamingResolver
Interceptor delegate field name pattern: <name_trait>$delegate$<class_name_hash>$<plugin_define_hash>$<intercept_point_hash>
* SWMethodNameTransformer
Renamed origin method pattern: <name_trait>$original$<method_name>$<method_description_hash>
* SWImplementationContextFactory
Method cache value field pattern: cachedValue$<name_trait>$<origin_class_name_hash>$<field_value_hash>
Accessor method name pattern: <renamed_origin_method>$accessor$<name_trait>$<origin_class_name_hash>
Here is an example of manipulated enhanced class with new naming policies of auxiliary classes, fields, and methods
import sample.mybatis.controller.HotelController$sw$auxiliary$19cja42;
import sample.mybatis.controller.HotelController$sw$auxiliary$p257su0;
import sample.mybatis.domain.Hotel;
import sample.mybatis.service.HotelService;
@RequestMapping(value={"/hotel"})
@RestController
public class HotelController
implements EnhancedInstance {
@Autowired
@lazy
private HotelService hotelService;
private volatile Object _$EnhancedClassField_ws;
// Interceptor delegate fields
public static volatile /* synthetic */ InstMethodsInter sw$delegate$td03673$ain2do0$8im5jm1;
public static volatile /* synthetic */ InstMethodsInter sw$delegate$td03673$ain2do0$edkmf61;
public static volatile /* synthetic */ ConstructorInter sw$delegate$td03673$ain2do0$qs9unv1;
public static volatile /* synthetic */ InstMethodsInter sw$delegate$td03673$fl4lnk1$m3ia3a2;
public static volatile /* synthetic */ InstMethodsInter sw$delegate$td03673$fl4lnk1$sufrvp1;
public static volatile /* synthetic */ ConstructorInter sw$delegate$td03673$fl4lnk1$cteu7s1;
// Origin method cache value field
private static final /* synthetic */ Method cachedValue$sw$td03673$g5sobj1;
public HotelController() {
this(null);
sw$delegate$td03673$ain2do0$qs9unv1.intercept(this, new Object[0]);
}
private /* synthetic */ HotelController(sw.auxiliary.p257su0 p257su02) {
}
@GetMapping(value={"city/{cityId}"})
public Hotel selectByCityId(@PathVariable(value="cityId") int n) {
// call interceptor with auxiliary type and parameters and origin method object
return (Hotel)sw$delegate$td03673$ain2do0$8im5jm1.intercept(this, new Object[]{n}, new HotelController$sw$auxiliary$19cja42(this, n), cachedValue$sw$td03673$g5sobj1);
}
// Renamed origin method
private /* synthetic */ Hotel sw$origin$selectByCityId$a8458p3(int cityId) {
/*22*/ return this.hotelService.selectByCityId(cityId);
}
// Accessor of renamed origin method, calling from auxiliary type
final /* synthetic */ Hotel sw$origin$selectByCityId$a8458p3$accessor$sw$td03673(int n) {
// Calling renamed origin method
return this.sw$origin$selectByCityId$a8458p3(n);
}
@OverRide
public Object getSkyWalkingDynamicField() {
return this._$EnhancedClassField_ws;
}
@OverRide
public void setSkyWalkingDynamicField(Object object) {
this._$EnhancedClassField_ws = object;
}
static {
ClassLoader.getSystemClassLoader().loadClass("org.apache.skywalking.apm.dependencies.net.bytebuddy.dynamic.Nexus").getMethod("initialize", Class.class, Integer.TYPE).invoke(null, HotelController.class, -1072476370);
// Method object
cachedValue$sw$td03673$g5sobj1 = HotelController.class.getMethod("selectByCityId", Integer.TYPE);
}
}
Auxiliary type of Constructor :
class HotelController$sw$auxiliary$p257su0 {
}
Auxiliary type of selectByCityId
method:
class HotelController$sw$auxiliary$19cja42
implements Runnable,
Callable {
private HotelController argument0;
private int argument1;
public Object call() throws Exception {
return this.argument0.sw$origin$selectByCityId$a8458p3$accessor$sw$td03673(this.argument1);
}
@OverRide
public void run() {
this.argument0.sw$origin$selectByCityId$a8458p3$accessor$sw$td03673(this.argument1);
}
HotelController$sw$auxiliary$19cja42(HotelController hotelController, int n) {
this.argument0 = hotelController;
this.argument1 = n;
}
}
Features and Bug Fixes
- Support Jdk17 ZGC metric collect
- Support Jetty 11.x plugin
- Support access to the sky-walking tracer context in spring gateway filter
- Fix the scenario of using the HBase plugin with spring-data-hadoop.
- Add RocketMQ 5.x plugin
- Fix the conflict between the logging kernel and the JDK threadpool plugin.
- Fix the thread safety bug of finishing operation for the span named "SpringCloudGateway/sendRequest"
- Fix NPE in guava-eventbus-plugin.
- Add WebSphere Liberty 23.x plugin
- Add Plugin to support aerospike Java client
- Add ClickHouse parsing to the jdbc-common plugin.
- Support to trace redisson lock
- Upgrade netty-codec-http2 to 4.1.94.Final
- Upgrade guava to 32.0.1
- Fix issue with duplicate enhancement by ThreadPoolExecutor
- Add plugin to support for RESTeasy 6.x.
- Fix the conditions for resetting UUID, avoid the same uuid causing the configuration not to be updated.
- Fix witness class in springmvc-annotation-5.x-plugin to avoid falling into v3 use cases.
- Fix Jedis-2.x plugin bug and add test for Redis cluster scene
- Merge two instrumentation classes to avoid duplicate enhancements in MySQL plugins.
- Support asynchronous invocation in jetty client 9.0 and 9.x plugin
- Add nacos-client 2.x plugin
- Staticize the tags for preventing synchronization in JDK 8
- Add RocketMQ-Client-Java 5.x plugin
- Fix NullPointerException in lettuce-5.x-plugin.
Documentation
All issues and pull requests are here