New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Kafka plugin not work on Spring Boot and Spring Kafka #3478
Comments
Need new support for Spring Kafka. |
@stalary do you have interest to enhance this part? |
Ok, I will solve it soon |
@wu-sheng When spring-kafka exists, how can I enable spring-kafka-plugin by not launching the kafka plugin,I need a little help. |
What is the issue here? If both of them are exit span creators, then the first one should override the second automatically, if there is no across threads happening. |
However, an error is reported when it passes through the kafka-plugin |
Why? If we intercept the right place, then all APIs should be same. no matter who calls it. |
I am not asking there must be a Spring-kafka plugin, but the kafka plugin should work as expected. In some cases, spring-xxx created a new API entrance, then we need a new plugin. |
@wu-sheng ok,I got it |
Such as from this error log, we are intercepting
We did String cast directly, clearly for Spring Kafka, it is not a String type, right? |
yes |
@stalary I think if this is the only issue, we could a good fix, but you need to test whether this is the only issue. |
@stalary Any update? |
@wu-sheng I am very sorry that I am busy with my work these days. I will deal with it at the weekend |
I have solved the first error, but I can't find the reason for the second one
I see lamda appearing, if it is related to the JDK version |
@stalary Could you find the codes of Look like the plugin is assuming this is an enhanced class, but it isn't. |
@wu-sheng yes, I printed all the parameters through the log, but found that the second parameter was empty, so I have no idea for the moment. I will think about it at the weekend. |
OK. Take your time, if you could find the codebase, we could talk about it. |
@wu-sheng I have a question.
Why buildCallback generates Callback that I've been unable to enhance successfully |
What do you mean can't enhance? It looks like just intercepting return value, and change it to our own callback. |
The second parameter I got in the interceptor was |
Isn't it a callback implementor? I am little confused. How could you enhance all callback implementors? It is possible, but not recommended. |
I intercept the doSend method, There is no problem with native kafka-clients |
I haven't changed this piece of code at all. If I need to raise the parameters of the interface, is there a better way? |
I mean, you need to intercept buildCallback method, and create a manual class implementing Callable and EnhancedClass. Make sense? |
Thank you, I got it. |
@wu-sheng I create manual class resolve this problem, but there are new problem. EnhancedInstance callbackInstance = (EnhancedInstance) allArguments[1];
if (null != callbackInstance) {
ContextSnapshot snapshot = ContextManager.capture();
if (null != snapshot) {
callbackInstance.setSkyWalkingDynamicField(snapshot);
}
} In this callbackInstance is my manual class org.apache.skywalking.apm.plugin.kafka.KafkaCallback. Then doSend in kafka executes Callback interceptCallback = new InterceptorCallback<>(callback, this.interceptors, tp); This caused me to lose snapshot in CallbackInterceptor ContextSnapshot contextSnapshot = (ContextSnapshot) objInst.getSkyWalkingDynamicField(); contextSnapshot always is null. Can you give me some help? |
Have you enhanced |
Yes, I enhanced it, but it wrapped my class, so I didn't get the snapshot, I'm going to see now how do I pass it through the constructor,thanks. |
You should intercept the constructor. Then you could get it at the initialization stage. |
Please answer these questions before submitting your issue.
Question
Kafka plugin don't work on Spring Kafka.
Bug
Which version of SkyWalking, OS and JRE?
SkyWalking 6.4.0, Windows 10, java version "1.8.0_172"
Which company or project?
What happen?
If possible, provide a way for reproducing the error. e.g. demo application, component version.
Spring Boot 2.1.4.RELEASE, use KafkaTemplate to send a message, this will cause error:
ERROR 2019-09-17 20:39:14:462 http-nio-9999-exec-5 ConstructorInter : ConstructorInter failure.
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
at org.apache.skywalking.apm.plugin.kafka.ProducerConstructorMapInterceptor.onConstruct(ProducerConstructorMapInterceptor.java:34)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ConstructorInter.intercept(ConstructorInter.java:69)
at org.apache.kafka.clients.producer.KafkaProducer.(KafkaProducer.java)
at org.springframework.kafka.core.DefaultKafkaProducerFactory.createKafkaProducer(DefaultKafkaProducerFactory.java:318)
at org.springframework.kafka.core.DefaultKafkaProducerFactory.createProducer(DefaultKafkaProducerFactory.java:305)
at org.springframework.kafka.core.KafkaTemplate.getTheProducer(KafkaTemplate.java:446)
at org.springframework.kafka.core.KafkaTemplate.doSend(KafkaTemplate.java:376)
at org.springframework.kafka.core.KafkaTemplate.send(KafkaTemplate.java:193)
at com.example.spring.boot.kafka.KafkaSender.send(KafkaSender.java:30)
at com.example.spring.boot.kafka.KafkaProducerApplication.send$original$WkzqqwgP(KafkaProducerApplication.java:24)
at com.example.spring.boot.kafka.KafkaProducerApplication.send$original$WkzqqwgP$accessor$XMwO7qfM(KafkaProducerApplication.java)
at com.example.spring.boot.kafka.KafkaProducerApplication$auxiliary$BXPlMTxs.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at com.example.spring.boot.kafka.KafkaProducerApplication.send(KafkaProducerApplication.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
at org.apache.catalina.core.StandardHostValve.invoke$original$dkpOvFTd(StandardHostValve.java:139)
at org.apache.catalina.core.StandardHostValve.invoke$original$dkpOvFTd$accessor$Fy8VzS77(StandardHostValve.java)
at org.apache.catalina.core.StandardHostValve$auxiliary$1ZRcEHnu.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
ERROR 2019-09-17 20:39:14:468 http-nio-9999-exec-5 InstMethodsInter : class[class org.apache.kafka.clients.producer.KafkaProducer] before method[doSend] intercept failure
java.lang.ClassCastException: org.springframework.kafka.core.KafkaTemplate$$Lambda$522/515652386 cannot be cast to org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance
at org.apache.skywalking.apm.plugin.kafka.KafkaProducerInterceptor.beforeMethod(KafkaProducerInterceptor.java:65)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:82)
at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java)
at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:803)
at org.springframework.kafka.core.DefaultKafkaProducerFactory$CloseSafeProducer.send(DefaultKafkaProducerFactory.java:444)
at org.springframework.kafka.core.KafkaTemplate.doSend(KafkaTemplate.java:381)
at org.springframework.kafka.core.KafkaTemplate.send(KafkaTemplate.java:193)
at com.example.spring.boot.kafka.KafkaSender.send(KafkaSender.java:30)
at com.example.spring.boot.kafka.KafkaProducerApplication.send$original$WkzqqwgP(KafkaProducerApplication.java:24)
at com.example.spring.boot.kafka.KafkaProducerApplication.send$original$WkzqqwgP$accessor$XMwO7qfM(KafkaProducerApplication.java)
at com.example.spring.boot.kafka.KafkaProducerApplication$auxiliary$BXPlMTxs.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at com.example.spring.boot.kafka.KafkaProducerApplication.send(KafkaProducerApplication.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
at org.apache.catalina.core.StandardHostValve.invoke$original$dkpOvFTd(StandardHostValve.java:139)
at org.apache.catalina.core.StandardHostValve.invoke$original$dkpOvFTd$accessor$Fy8VzS77(StandardHostValve.java)
at org.apache.catalina.core.StandardHostValve$auxiliary$1ZRcEHnu.call(Unknown Source)
at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:93)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Requirement or improvement
The text was updated successfully, but these errors were encountered: