Skip to content

9.0.0

Compare
Choose a tag to compare
@wu-sheng wu-sheng released this 01 Sep 11:56
· 81 commits to main since this release

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 under sw$ 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