mufiye commented on issue #9999:
URL: https://github.com/apache/skywalking/issues/9999#issuecomment-1396388730

   Hello, @wu-sheng . I have completed the toolkit and pass the unit test part. 
Now I am writing the plugin automatic tests. But I encounter one problem and I 
have no idea to solve it.
   To implement the createExitSpan with inject function, I use the Interceptor 
below. But when I start the automatic tests and run the 
`Tracer.createExitSpan`, it will report the Exception in the 
skywalking-api.log. I think the `ContextCarrier` implement the 
`EnhancedInstance` interface after intercepting, but why it can not cast?
   ```java
   public class Tracer {
       public static SpanRef createExitSpan(String operationName, 
ContextCarrierRef carrierRef, String remotePeer) {
           return new SpanRef();
       }
   }
   ```
   ```java
   public class TracerCreateExitSpanWithContextInterceptor implements 
StaticMethodsAroundInterceptor {
   
       @Override
       public void beforeMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes, MethodInterceptResult result) {
   
       }
   
       @Override
       public Object afterMethod(Class clazz, Method method, Object[] 
allArguments, Class<?>[] parameterTypes, Object ret) {
           ContextCarrier contextCarrier = new ContextCarrier();
           AbstractSpan exitSpan = 
ContextManager.createExitSpan(String.valueOf(allArguments[0]), contextCarrier, 
String.valueOf(allArguments[2]));
           ((EnhancedInstance) 
allArguments[1]).setSkyWalkingDynamicField(contextCarrier);
           ((EnhancedInstance) ret).setSkyWalkingDynamicField(exitSpan);
           return ret;
       }
      
       ...
   }
   ```
   ```java
   public class ContextCarrierRef {
       public CarrierItemRef items() {
           return new CarrierItemRef();
       }
   }
   ```
   ```java
   public class ContextCarrierRefActivation extends 
ClassInstanceMethodsEnhancePluginDefine {
       private static final String ENHANCE_CLASS = 
"org.apache.skywalking.apm.toolkit.trace.ContextCarrier";
       private static final String ITEMS_METHOD_NAME = "items";
       private static final String ITEMS_INTERCEPTOR_CLASS = 
"org.apache.skywalking.apm.toolkit.activation.trace.ContextCarrierRefItemsInterceptor";
   
       @Override
       protected ClassMatch enhanceClass() {
           return NameMatch.byName(ENHANCE_CLASS);
       }
   
       @Override
       public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
           return new ConstructorInterceptPoint[0];
       }
   
       @Override
       public InstanceMethodsInterceptPoint[] 
getInstanceMethodsInterceptPoints() {
           return new InstanceMethodsInterceptPoint[] {
               new InstanceMethodsInterceptPoint() {
                   @Override
                   public ElementMatcher<MethodDescription> getMethodsMatcher() 
{
                       return named(ITEMS_METHOD_NAME);
                   }
   
                   @Override
                   public String getMethodsInterceptor() {
                       return ITEMS_INTERCEPTOR_CLASS;
                   }
   
                   @Override
                   public boolean isOverrideArgs() {
                       return false;
                   }
               }
           };
       }
   }
   ```
   ```
   ERROR 2023-01-19 02:57:58.212 http-nio-8080-exec-2 StaticMethodsInter : 
class[class org.apache.skywalking.apm.toolkit.trace.Tracer] after static 
method[createExitSpan] intercept 
failure:org.apache.skywalking.apm.toolkit.trace.ContextCarrierRef cannot be 
cast to 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance
 
   java.lang.ClassCastException: 
org.apache.skywalking.apm.toolkit.trace.ContextCarrierRef cannot be cast to 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance
        at 
org.apache.skywalking.apm.toolkit.activation.trace.TracerCreateExitSpanWithContextInterceptor.afterMethod(TracerCreateExitSpanWithContextInterceptor.java:41)
        at 
org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsInter.intercept(StaticMethodsInter.java:94)
        at 
org.apache.skywalking.apm.toolkit.trace.Tracer.createExitSpan(Tracer.java)
        at 
test.apache.skywalking.apm.testcase.toolkit.controller.TestService.endServiceWithCarrier(TestService.java:81)
        at 
test.apache.skywalking.apm.testcase.toolkit.controller.CaseController.testcase$original$mL17GHKM(CaseController.java:76)
   ...
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to