Changes by Version ================== Release Notes. 9.0.0 ------------------ ### 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 under `sw$` name trait. They are predictable and unchanged after re-transform. ``` * SWAuxiliaryTypeNamingStrategy Auxiliary type name pattern: $$auxiliary$ * DelegateNamingResolver Interceptor delegate field name pattern: $delegate$$$ * SWMethodNameTransformer Renamed origin method pattern: $original$$ * SWImplementationContextFactory Method cache value field pattern: cachedValue$$$ Accessor method name pattern: $accessor$$ ``` Here is an example of manipulated enhanced class with new naming policies of auxiliary classes, fields, and methods ```java 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 : ```java class HotelController$sw$auxiliary$p257su0 { } ``` Auxiliary type of `selectByCityId` method: ```java 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](https://github.com/apache/skywalking/milestone/178?closed=1)