You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by GitBox <gi...@apache.org> on 2019/09/02 02:41:38 UTC

[GitHub] [skywalking] zturning opened a new issue #3392: Webflux plugin throw ClassCastException when defining a filter

zturning opened a new issue #3392: Webflux plugin throw ClassCastException when defining a filter
URL: https://github.com/apache/skywalking/issues/3392
 
 
   Please answer these questions before submitting your issue.
   
   - Why do you submit this issue?
   - [ ] Question or discussion
   - [x] Bug
   - [ ] Requirement
   - [ ] Feature or performance improvement
   
   ___
   ### Bug
   - Which version of SkyWalking, OS and JRE?
   apm-webflux-5.x-plugin-6.4.0-SNAPSHOT, centos7, jdk8
   
   - What happen?
   I define a filter:
   ```java
   @Component
   public class MyFilter implements WebFilter {
   
       @Override
       public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
           return chain.filter(new MyServerWebExchangeDecorator(exchange));
       }
   
       public static class MyServerWebExchangeDecorator extends ServerWebExchangeDecorator {
           public MyServerWebExchangeDecorator(ServerWebExchange delegate) {
               super(delegate);
           }
       }
   
   }
   
   @RestController
   public class HelloController {
   
       @GetMapping("/hello")
       public Mono<String> hello() {
           return Mono.just("Hello World");
       }
   
   }
   ```
   and the plugin will throw ClassCastException:
   ```java
   DEBUG 2019-09-02 09:42:53:591 reactor-http-nio-2 AbstractClassEnhancePluginDefine :  prepare to enhance class org.springframework.web.server.adapter.DefaultServerWebExchange by org.apache.skywalking.apm.plugin.spring.webflux.v5.define.DefaultServerWebExchangeInstrumentation.
   DEBUG 2019-09-02 09:42:53:592 reactor-http-nio-2 AbstractClassEnhancePluginDefine :  enhance class org.springframework.web.server.adapter.DefaultServerWebExchange by org.apache.skywalking.apm.plugin.spring.webflux.v5.define.DefaultServerWebExchangeInstrumentation completely.
   DEBUG 2019-09-02 09:42:53:592 reactor-http-nio-2 SkyWalkingAgent :  Finish the prepare stage for org.springframework.web.server.adapter.DefaultServerWebExchange.
   DEBUG 2019-09-02 09:42:53:598 reactor-http-nio-2 SkyWalkingAgent :  On Transformation class org.springframework.web.server.adapter.DefaultServerWebExchange.
   ERROR 2019-09-02 09:42:53:631 reactor-http-nio-2 InstMethodsInter :  class[class org.springframework.web.reactive.DispatcherHandler] before method[handle] intercept failure
   java.lang.ClassCastException: com.example.MyFilter$MyServerWebExchangeDecorator cannot be cast to org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance
   	at org.apache.skywalking.apm.plugin.spring.webflux.v5.DispatcherHandlerHandleMethodInterceptor.beforeMethod(DispatcherHandlerHandleMethodInterceptor.java:51)
   	at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:82)
   	at org.springframework.web.reactive.DispatcherHandler.handle(DispatcherHandler.java)
   	at org.springframework.web.server.handler.DefaultWebFilterChain.lambda$filter$0(DefaultWebFilterChain.java:122)
   	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
   	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
   	at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
   	at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
   	at reactor.core.publisher.MonoPeekTerminal.subscribe(MonoPeekTerminal.java:61)
   	at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
   	at reactor.core.publisher.Mono.subscribe(Mono.java:3848)
   	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172)
   	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)
   	at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:70)
   	at reactor.core.publisher.MonoPeekTerminal.subscribe(MonoPeekTerminal.java:61)
   	at reactor.netty.http.server.HttpServerHandle.onStateChange(HttpServerHandle.java:64)
   	at reactor.netty.tcp.TcpServerBind$ChildObserver.onStateChange(TcpServerBind.java:226)
   	at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:442)
   	at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:91)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
   	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
   	at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:161)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
   	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
   	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)
   	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)
   	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)
   	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
   	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
   	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
   	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
   	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
   	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
   	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:682)
   	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:617)
   	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:534)
   	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
   	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:906)
   	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
   	at java.lang.Thread.run(Thread.java:748)
   ```
   
   and can fix it by HierarchyMatch in DefaultServerWebExchangeInstrumentation:
   ```java
   public class DefaultServerWebExchangeInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
   
       @Override
       protected ClassMatch enhanceClass() {
           return byHierarchyMatch(new String[] {"org.springframework.web.server.ServerWebExchange"});
       }
       ......
   }
   ```
   
   

----------------------------------------------------------------
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.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services