Skip to content
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

Closed
1 of 4 tasks
haodut opened this issue Sep 17, 2019 · 30 comments
Closed
1 of 4 tasks

Kafka plugin not work on Spring Boot and Spring Kafka #3478

haodut opened this issue Sep 17, 2019 · 30 comments
Labels
agent Language agent related. feature New feature plugin Plugin for agent or collector. Be used to extend the capabilities of default implementor.
Milestone

Comments

@haodut
Copy link

haodut commented Sep 17, 2019

Please answer these questions before submitting your issue.

  • Why do you submit this issue?
  • Question or discussion
  • Bug
  • Requirement
  • Feature or performance improvement

Question

  • What do you want to know?
    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

  • Please describe about your requirements or improvement suggestions.
@wu-sheng
Copy link
Member

Need new support for Spring Kafka.

@wu-sheng wu-sheng added agent Language agent related. feature New feature plugin Plugin for agent or collector. Be used to extend the capabilities of default implementor. labels Sep 17, 2019
@wu-sheng
Copy link
Member

@stalary do you have interest to enhance this part?

@stalary
Copy link
Contributor

stalary commented Sep 17, 2019

@stalary do you have interest to enhance this part?

Ok, I will solve it soon

@stalary
Copy link
Contributor

stalary commented Sep 17, 2019

@wu-sheng When spring-kafka exists, how can I enable spring-kafka-plugin by not launching the kafka plugin,I need a little help.

@wu-sheng
Copy link
Member

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.

@stalary
Copy link
Contributor

stalary commented Sep 17, 2019

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

@wu-sheng
Copy link
Member

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.

@wu-sheng
Copy link
Member

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.

@stalary
Copy link
Contributor

stalary commented Sep 17, 2019

@wu-sheng ok,I got it

@wu-sheng
Copy link
Member

Such as from this error log, we are intercepting KafkaProducer constructor, right?

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)

objInst.setSkyWalkingDynamicField(StringUtil.join(';', ((String) config.get("bootstrap.servers")).split(",")));

We did String cast directly, clearly for Spring Kafka, it is not a String type, right?

@stalary
Copy link
Contributor

stalary commented Sep 17, 2019

Such as from this error log, we are intercepting KafkaProducer constructor, right?

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)

objInst.setSkyWalkingDynamicField(StringUtil.join(';', ((String) config.get("bootstrap.servers")).split(",")));

We did String cast directly, clearly for Spring Kafka, it is not a String type, right?

yes

@wu-sheng
Copy link
Member

@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.

@wu-sheng
Copy link
Member

@stalary Any update?

@stalary
Copy link
Contributor

stalary commented Sep 19, 2019

@wu-sheng I am very sorry that I am busy with my work these days. I will deal with it at the weekend

@stalary
Copy link
Contributor

stalary commented Sep 19, 2019

I have solved the first error, but I can't find the reason for the second one

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

I see lamda appearing, if it is related to the JDK version

@wu-sheng
Copy link
Member

@stalary Could you find the codes of KafkaTemplate$$Lambda$522/515652386? What is the lamda in the source code?

Look like the plugin is assuming this is an enhanced class, but it isn't.

@stalary
Copy link
Contributor

stalary commented Sep 19, 2019

@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.

@wu-sheng
Copy link
Member

OK. Take your time, if you could find the codebase, we could talk about it.

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

@wu-sheng I have a question.
producer.send(producerRecord, buildCallback(producerRecord, producer, future));

private Callback buildCallback(final ProducerRecord<K, V> producerRecord, final Producer<K, V> producer, final SettableListenableFuture<SendResult<K, V>> future) { return (metadata, exception) -> {...};}

Why buildCallback generates Callback that I've been unable to enhance successfully

@wu-sheng
Copy link
Member

What do you mean can't enhance? It looks like just intercepting return value, and change it to our own callback.

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

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 KafkaTemplate$$Lambda$1314/327246707, I don't understand why he wasn't enhanced.

@wu-sheng
Copy link
Member

Isn't it a callback implementor? I am little confused. How could you enhance all callback implementors? It is possible, but not recommended.

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

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?

@wu-sheng
Copy link
Member

I mean, you need to intercept buildCallback method, and create a manual class implementing Callable and EnhancedClass. Make sense?

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

Thank you, I got it.

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

@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?

@wu-sheng
Copy link
Member

Have you enhanced InterceptorCallback? I think the snapshot could propagate through the constructor.

@stalary
Copy link
Contributor

stalary commented Sep 22, 2019

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.

@wu-sheng
Copy link
Member

You should intercept the constructor. Then you could get it at the initialization stage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
agent Language agent related. feature New feature plugin Plugin for agent or collector. Be used to extend the capabilities of default implementor.
Projects
None yet
Development

No branches or pull requests

3 participants