This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch v2-api-fix
in repository https://gitbox.apache.org/repos/asf/skywalking-java.git

commit 1a79966091fb7e48d1dab97dd01d3cf04d064874
Author: Wu Sheng <[email protected]>
AuthorDate: Wed Oct 13 20:55:00 2021 +0800

    Fix instrumentation v2 API doesn't work for constructor instrumentation.
---
 CHANGES.md                                         |  1 +
 .../enhance/v2/ClassEnhancePluginDefineV2.java     | 28 +++++++++++++++++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/CHANGES.md b/CHANGES.md
index 28b587b..5e977cd 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -36,6 +36,7 @@ Release Notes.
 * Add plugin to support ClickHouse JDBC driver.
 * Fix version compatibility for JsonRPC4J plugin.
 * Add plugin to support Apache Kylin-jdbc 2.6.x 3.x 4.x
+* Fix instrumentation v2 API doesn't work for constructor instrumentation.
 
 #### Documentation
 
diff --git 
a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java
 
b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java
index 459e150..ff26034 100644
--- 
a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java
+++ 
b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/v2/ClassEnhancePluginDefineV2.java
@@ -22,6 +22,7 @@ import net.bytebuddy.description.type.TypeDescription;
 import net.bytebuddy.dynamic.DynamicType;
 import net.bytebuddy.implementation.FieldAccessor;
 import net.bytebuddy.implementation.MethodDelegation;
+import net.bytebuddy.implementation.SuperMethodCall;
 import net.bytebuddy.implementation.bind.annotation.Morph;
 import net.bytebuddy.matcher.ElementMatcher;
 import net.bytebuddy.matcher.ElementMatchers;
@@ -29,9 +30,11 @@ import 
org.apache.skywalking.apm.agent.core.plugin.AbstractClassEnhancePluginDef
 import org.apache.skywalking.apm.agent.core.plugin.EnhanceContext;
 import org.apache.skywalking.apm.agent.core.plugin.PluginException;
 import 
org.apache.skywalking.apm.agent.core.plugin.bootstrap.BootstrapInstrumentBoost;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.EnhanceException;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.StaticMethodsInterceptPoint;
+import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ConstructorInter;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.OverrideCallable;
 import 
org.apache.skywalking.apm.agent.core.plugin.interceptor.v2.ConstructorInterceptV2Point;
@@ -105,14 +108,20 @@ public abstract class ClassEnhancePluginDefineV2 extends 
AbstractClassEnhancePlu
     protected DynamicType.Builder<?> enhanceInstance(TypeDescription 
typeDescription,
                                                      DynamicType.Builder<?> 
newClassBuilder, ClassLoader classLoader,
                                                      EnhanceContext context) 
throws PluginException {
+        ConstructorInterceptPoint[] constructorInterceptPoints = 
getConstructorsInterceptPoints();
         InstanceMethodsInterceptV2Point[] instanceMethodsInterceptV2Points = 
getInstanceMethodsInterceptV2Points();
         String enhanceOriginClassName = typeDescription.getTypeName();
+
+        boolean existedConstructorInterceptPoint = false;
+        if (constructorInterceptPoints != null && 
constructorInterceptPoints.length > 0) {
+            existedConstructorInterceptPoint = true;
+        }
         boolean existedMethodsInterceptV2Points = false;
         if (instanceMethodsInterceptV2Points != null && 
instanceMethodsInterceptV2Points.length > 0) {
             existedMethodsInterceptV2Points = true;
         }
 
-        if (!existedMethodsInterceptV2Points) {
+        if (!existedConstructorInterceptPoint && 
!existedMethodsInterceptV2Points) {
             return newClassBuilder;
         }
 
@@ -126,6 +135,23 @@ public abstract class ClassEnhancePluginDefineV2 extends 
AbstractClassEnhancePlu
             }
         }
 
+        if (existedConstructorInterceptPoint) {
+            for (ConstructorInterceptPoint constructorInterceptPoint : 
constructorInterceptPoints) {
+                if (isBootstrapInstrumentation()) {
+                    newClassBuilder = 
newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher())
+                                                     
.intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration()
+                                                                               
                                  .to(BootstrapInstrumentBoost
+                                                                               
                                          
.forInternalDelegateClass(constructorInterceptPoint
+                                                                               
                                                                        
.getConstructorInterceptor()))));
+                } else {
+                    newClassBuilder = 
newClassBuilder.constructor(constructorInterceptPoint.getConstructorMatcher())
+                                                     
.intercept(SuperMethodCall.INSTANCE.andThen(MethodDelegation.withDefaultConfiguration()
+                                                                               
                                  .to(new 
ConstructorInter(constructorInterceptPoint
+                                                                               
                                                               
.getConstructorInterceptor(), classLoader))));
+                }
+            }
+        }
+
         if (existedMethodsInterceptV2Points) {
             for (InstanceMethodsInterceptV2Point 
instanceMethodsInterceptV2Point : instanceMethodsInterceptV2Points) {
                 String interceptor = 
instanceMethodsInterceptV2Point.getMethodsInterceptorV2();

Reply via email to