signoz | It helps developers monitor | Monitoring library

Β by Β  SigNoz TypeScript Version: v0.17.0 License: Non-SPDX

kandi X-RAY | signoz Summary

signoz is a TypeScript library typically used in Performance Management, Monitoring, Kafka, Prometheus applications. signoz has no bugs, it has no vulnerabilities and it has medium support. However signoz has a Non-SPDX License. You can download it from GitHub.
Being developers, we found it annoying to rely on closed source SaaS vendors for every small feature we wanted. Closed source vendors often surprise you with huge month end bills without any transparency. We wanted to make a self-hosted & open source version of tools like DataDog, NewRelic for companies that have privacy and security concerns about having customer data going to third party services. Being open source also gives you complete control of your configuration, sampling, uptimes. You can also build modules over SigNoz to extend business specific capabilities.
    Support
      Quality
        Security
          License
            Reuse
            Support
              Quality
                Security
                  License
                    Reuse

                      kandi-support Support

                        summary
                        signoz has a medium active ecosystem.
                        summary
                        It has 12267 star(s) with 674 fork(s). There are 110 watchers for this library.
                        summary
                        There were 10 major release(s) in the last 6 months.
                        summary
                        There are 568 open issues and 647 have been closed. On average issues are closed in 42 days. There are 40 open pull requests and 0 closed requests.
                        summary
                        It has a neutral sentiment in the developer community.
                        summary
                        The latest version of signoz is v0.17.0
                        signoz Support
                          Best in #Monitoring
                            Average in #Monitoring
                            signoz Support
                              Best in #Monitoring
                                Average in #Monitoring

                                  kandi-Quality Quality

                                    summary
                                    signoz has no bugs reported.
                                    signoz Quality
                                      Best in #Monitoring
                                        Average in #Monitoring
                                        signoz Quality
                                          Best in #Monitoring
                                            Average in #Monitoring

                                              kandi-Security Security

                                                summary
                                                signoz has no vulnerabilities reported, and its dependent libraries have no vulnerabilities reported.
                                                signoz Security
                                                  Best in #Monitoring
                                                    Average in #Monitoring
                                                    signoz Security
                                                      Best in #Monitoring
                                                        Average in #Monitoring

                                                          kandi-License License

                                                            summary
                                                            signoz has a Non-SPDX License.
                                                            summary
                                                            Non-SPDX licenses can be open source with a non SPDX compliant license, or non open source licenses, and you need to review them closely before use.
                                                            signoz License
                                                              Best in #Monitoring
                                                                Average in #Monitoring
                                                                signoz License
                                                                  Best in #Monitoring
                                                                    Average in #Monitoring

                                                                      kandi-Reuse Reuse

                                                                        summary
                                                                        signoz releases are available to install and integrate.
                                                                        signoz Reuse
                                                                          Best in #Monitoring
                                                                            Average in #Monitoring
                                                                            signoz Reuse
                                                                              Best in #Monitoring
                                                                                Average in #Monitoring
                                                                                  Top functions reviewed by kandi - BETA
                                                                                  kandi's functional review helps you automatically verify the functionalities of the libraries and avoid rework.
                                                                                  Currently covering the most popular Java, JavaScript and Python libraries. See a Sample Here
                                                                                  Get all kandi verified functions for this library.
                                                                                  Get all kandi verified functions for this library.

                                                                                  signoz Key Features

                                                                                  SigNoz is an open-source APM. It helps developers monitor their applications & troubleshoot problems, an open-source alternative to DataDog, NewRelic, etc. πŸ”₯ πŸ–₯. πŸ‘‰ Open source Application Performance Monitoring (APM) & Observability tool

                                                                                  signoz Examples and Code Snippets

                                                                                  No Code Snippets are available at this moment for signoz.
                                                                                  Community Discussions

                                                                                  Trending Discussions on signoz

                                                                                  Classpath problems while Instrumenting Springboot application
                                                                                  chevron right

                                                                                  QUESTION

                                                                                  Classpath problems while Instrumenting Springboot application
                                                                                  Asked 2020-Feb-17 at 21:43

                                                                                  I have a springboot application which I'm trying to instrument using bytebuddy. I'm running into classpath issues which I'm not able to understand.

                                                                                  Firstly, the following is other literature on this:

                                                                                  https://github.com/raphw/byte-buddy/issues/473

                                                                                  https://github.com/raphw/byte-buddy/issues/87

                                                                                  Unable to instrument apache httpclient using javaagent for spring boot uber jar application

                                                                                  https://github.com/raphw/byte-buddy/issues/109

                                                                                  https://github.com/raphw/byte-buddy/issues/473

                                                                                  https://github.com/raphw/byte-buddy/issues/489

                                                                                  https://github.com/spring-projects/spring-boot/issues/4868

                                                                                  https://github.com/alibaba/transmittable-thread-local/issues/161

                                                                                  Problem is that Spring-boot bundles the application into one uber-jar, which contains other jars inside it

                                                                                  A thing to note here is, that if I run the application using IntelliJ, it doesn't use the uber-jar and runs via main class with a bunch of jars as classpath arguments.

                                                                                  Due to this difference, When running via uber-jar(java -jar target/demo-0.0.1-SNAPSHOT.jar), some classes are not available at the time the Agent runs. The classes are loadable at the time of application main, as spring-boot uses its own classloader, which is created at some time b/w agent and application main methods.

                                                                                  I'll describe the behaviour at various points of time below:

                                                                                  At time of PreMain of Agent
                                                                                  • Thread.currentThread().getContextClassLoader() = Launcher$AppClassLoader
                                                                                  • Agent.class.classLoader = Launcher$AppClassLoader
                                                                                  • Class.forName("org.springframework.web.servlet.HandlerAdapter") => ClassNotFoundException
                                                                                  • Class.forName("javax.servlet.http.HttpServletRequest") => ClassNotFoundException

                                                                                  Both spring and javax classes are not loaded as they are not directly in the classpath as per the App Classloader. It's part of an inner jar, something like app.jar!/BOOT-INF/lib/some.jar App Classloader won't be able to load this.

                                                                                  At time of Main of Application Class
                                                                                  • Thread.currentThread().getContextClassLoader() = org.springframework.boot.loader.LaunchedURLClassLoader
                                                                                  • DemoApplication.class.classloader = same as above
                                                                                  • Class.forName("org.springframework.web.servlet.HandlerAdapter") => loads successfully
                                                                                  • Same for javax class, loads successfully.

                                                                                  After loading, Class.forName("javax.servlet.http.HttpServletRequest").classLoader is also the same LaunchedURLClassLoader.

                                                                                  At the time of builder.visit call (when bytebuddy is modifying the class definitions) Code:

                                                                                  I have two classes, SpringBootInterceptor (which contains the intercept method) and SpringBootInterceptorOne (which contains the entry and exit method)

                                                                                    @Override
                                                                                    public AgentBuilder intercept(AgentBuilder agentBuilder) {
                                                                                      return agentBuilder
                                                                                        .type(isSubTypeOf(HandlerAdapter.class))
                                                                                        .transform((builder, typeDescription, classLoader, module) ->
                                                                                          builder.visit(Advice.to(SpringBootInterceptorOne.class, SpringBootInterceptorOne.class).on(named("handle").and(isMethod())))
                                                                                        );
                                                                                    }
                                                                                  
                                                                                  

                                                                                  The function intercept() is called in the premain path.

                                                                                  The function visit is called when the type is actually attempted to load. At that point bytebuddy tris to intercept those methods and modify bytecode.

                                                                                  In the current version of this code, the function intercept() throws ClassNotFoundException and interception doesn't happen.

                                                                                  Caused by: java.lang.NoClassDefFoundError: org/springframework/web/servlet/HandlerAdapter
                                                                                  

                                                                                  So, I tried to change the code, to the following:

                                                                                    @Override
                                                                                    public AgentBuilder intercept(AgentBuilder agentBuilder) {
                                                                                      return agentBuilder
                                                                                  //      .type(isSubTypeOf(HandlerAdapter.class))
                                                                                        .type(not(isInterface())
                                                                                          .and(safeHasSuperType(named("org.springframework.web.servlet.HandlerAdapter"))))
                                                                                        .transform((builder, typeDescription, classLoader, module) ->
                                                                                          builder.visit(Advice.to(SpringBootInterceptorOne.class, SpringBootInterceptorOne.class).on(named("handle").and(isMethod())))
                                                                                        );
                                                                                    }
                                                                                  

                                                                                  Here, basically loading the class lazily. Helper functions from datadog:

                                                                                  https://github.com/DataDog/dd-trace-java/blob/master/dd-java-agent/agent-tooling/src/main/java/datadog/trace/agent/tooling/ByteBuddyElementMatchers.java

                                                                                  After doing this, the intercept function doesn't fail, but the visit() function behaves strangely:

                                                                                  java.lang.IllegalStateException: Could not locate class file for my.package.name.SpringBootInterceptorOne
                                                                                      at net.bytebuddy.dynamic.ClassFileLocator$Resolution$Illegal.resolve(ClassFileLocator.java:118)
                                                                                      at net.bytebuddy.asm.Advice.to(Advice.java:431)
                                                                                      at net.bytebuddy.asm.Advice.to(Advice.java:400)
                                                                                      at net.bytebuddy.asm.Advice.to(Advice.java:375)
                                                                                      at net.bytebuddy.asm.Advice.to(Advice.java:361)
                                                                                      at my.package.name.SpringBootInterceptor.lambda$intercept$0(SpringBootInterceptor.java:30)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Transformer$Compound.transform(AgentBuilder.java:2612)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$Transformation$Simple$Resolution.apply(AgentBuilder.java:10117)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:10494)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:10457)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1500(AgentBuilder.java:10223)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:10833)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$LegacyVmDispatcher.run(AgentBuilder.java:10780)
                                                                                      at java.security.AccessController.doPrivileged(Native Method)
                                                                                      at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:10380)
                                                                                      at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
                                                                                      at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
                                                                                      at java.lang.ClassLoader.defineClass1(Native Method)
                                                                                      at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
                                                                                      at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
                                                                                      at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
                                                                                      at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
                                                                                      at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
                                                                                      at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
                                                                                      at java.security.AccessController.doPrivileged(Native Method)
                                                                                      at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
                                                                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
                                                                                      at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92)
                                                                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
                                                                                      at java.lang.Class.getDeclaredMethods0(Native Method)
                                                                                      at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
                                                                                      at java.lang.Class.getDeclaredMethods(Class.java:1975)
                                                                                      at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:463)
                                                                                      at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:358)
                                                                                      at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:414)
                                                                                      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$2(AbstractAutowireCapableBeanFactory.java:743)
                                                                                      at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1688)
                                                                                      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:742)
                                                                                      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:681)
                                                                                      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:649)
                                                                                      at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1604)
                                                                                      at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:520)
                                                                                      at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:491)
                                                                                      at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:230)
                                                                                      at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:223)
                                                                                      at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:213)
                                                                                      at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:167)
                                                                                      at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:142)
                                                                                      at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
                                                                                      at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
                                                                                      at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:184)
                                                                                      at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144)
                                                                                      at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
                                                                                      at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)
                                                                                      at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236)
                                                                                      at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
                                                                                      at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
                                                                                      at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706)
                                                                                      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
                                                                                      at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
                                                                                      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
                                                                                      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
                                                                                      at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
                                                                                      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
                                                                                      at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
                                                                                      at com.example.demo.DemoApplication.main(DemoApplication.java:10)
                                                                                      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.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
                                                                                      at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
                                                                                      at org.springframework.boot.loader.Launcher.launch(Launcher.java:51)
                                                                                      at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
                                                                                  
                                                                                  

                                                                                  At this point,

                                                                                  • Thread.currentThread().getContextClassLoader() => LaunchedURLClassLoader
                                                                                  • SpringBootInterceptor.class.getClassLoader() = null
                                                                                  • Typing SpringBootInterceptor.class in the debugger window doesn't fail, but
                                                                                  • Class.forName("my.package.name.SpringBootInterceptorOne") => NoClassDefFound

                                                                                  Next, I tried the following:

                                                                                    @Override
                                                                                    public AgentBuilder intercept(AgentBuilder agentBuilder) {
                                                                                      ClassLoader cl = Thread.currentThread().getContextClassLoader();
                                                                                      return agentBuilder
                                                                                  //      .type(isSubTypeOf(HandlerAdapter.class))
                                                                                        .type(not(isInterface())
                                                                                          .and(safeHasSuperType(named("org.springframework.web.servlet.HandlerAdapter"))))
                                                                                        .transform((builder, typeDescription, classLoader, module) -> {
                                                                                            try {
                                                                                              Class claz = Thread.currentThread().getContextClassLoader().loadClass("my.package.name.SpringBootInterceptorOne");
                                                                                              return builder.visit(Advice.to(claz, claz,
                                                                                                new ClassFileLocator.Compound(ClassFileLocator.ForClassLoader.of(cl),
                                                                                                ClassFileLocator.ForClassLoader.of(Thread.currentThread().getContextClassLoader())
                                                                                                )).on(named("handle").and(isMethod())));
                                                                                            } catch (ClassNotFoundException e) {
                                                                                              e.printStackTrace();
                                                                                              return builder;
                                                                                            }
                                                                                          }
                                                                                        );
                                                                                    }
                                                                                  
                                                                                  

                                                                                  This causes the interceptor to be "installed". The entry and exit methods are called okay. But casting the arguments to proper types gives error for the types of the arguments

                                                                                  exit spring boot
                                                                                  [Ljava.lang.Object;@c83066a
                                                                                  java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
                                                                                      at my.package.name.SpringBootInterceptorOne.getEndpoint(SpringBootInterceptorOne.java:36)
                                                                                      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
                                                                                      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
                                                                                      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
                                                                                      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
                                                                                      at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
                                                                                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
                                                                                      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
                                                                                      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:100)
                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
                                                                                      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:93)
                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
                                                                                      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:201)
                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
                                                                                      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:202)
                                                                                      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
                                                                                      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
                                                                                      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
                                                                                      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:367)
                                                                                      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
                                                                                      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
                                                                                      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
                                                                                      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)
                                                                                  
                                                                                  

                                                                                  Here is SpringBootInterceptorOne for reference:

                                                                                    @Advice.OnMethodExit
                                                                                    static void exit(@Advice.Origin final Executable executable,
                                                                                                     @Advice.This Object handlerAdapter,
                                                                                                     @Advice.AllArguments Object[] arguments,
                                                                                                     @Advice.Enter final TimerContext ctx) {
                                                                                  //      final long duration = ctx.getDuration();
                                                                                      System.out.println("exit spring boot");
                                                                                      String e = getEndpoint(arguments);
                                                                                      System.out.println(e);
                                                                                    }
                                                                                  
                                                                                    public static String getEndpoint(Object[] arguments) {
                                                                                      System.out.println(arguments);
                                                                                      HttpServletRequest request = (HttpServletRequest) arguments[0];
                                                                                      HandlerMethod  handler = (HandlerMethod) arguments[2];
                                                                                      return "ad";
                                                                                    }
                                                                                  

                                                                                  UPDATE:

                                                                                  As per the advice offered in an answer, I tried the following:

                                                                                    @Override
                                                                                    public AgentBuilder intercept(AgentBuilder agentBuilder) {
                                                                                      return agentBuilder
                                                                                  //      .type(isSubTypeOf(HandlerAdapter.class))
                                                                                        .type(not(isInterface())
                                                                                          .and(safeHasSuperType(named("org.springframework.web.servlet.HandlerAdapter"))))
                                                                                        .transform(new AgentBuilder.Transformer.ForAdvice()
                                                                                          .include(SpringBootInterceptorOne.class.getClassLoader())
                                                                                          .include(getClass().getClassLoader())
                                                                                          .advice(named("handle"), SpringBootInterceptorOne.class.getName())
                                                                                        );
                                                                                    }
                                                                                  
                                                                                  

                                                                                  It again throws Error:

                                                                                  java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
                                                                                      at io.signoz.interceptors.http.server.springboot.SpringBootInterceptorOne.getEndpoint(SpringBootInterceptorOne.java:37) ~[na:na]
                                                                                      at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.3.RELEASE.jar!/:5.2.3.RELEASE]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_242]
                                                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_242]
                                                                                      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.30.jar!/:9.0.30]
                                                                                      at java.lang.Thread.run(Thread.java:748) [na:1.8.0_242]
                                                                                  
                                                                                  

                                                                                  ANSWER

                                                                                  Answered 2020-Feb-17 at 21:43

                                                                                  The problem is that the advice class will be loaded on the system class loader as a part of the agent whereas the actual application code is loaded on a sub-class loader that is not visible to the system class loader. This situation does not change if you load your agent on the boot loader either. Therefore, the agent cannot load the HttpServletRequest class which is part of the uber-jar.

                                                                                  This is a typical problem with agents and Byte Buddy has a standard way to circumvent it by using a Transformer.ForAdvice instance instead of using the Advice class directly. Byte Buddy then creates a virtual class loader hierarchy that considers classes represented by both class loaders.

                                                                                  Update: The problem is that you are calling down to your interceptor that is defined in the system class loader where the class in question is not available. The annotated code will be inlined but the invoked method will not. If you copy-pasted the code into the annotated method, the behavior is as you'd expect it. Byte Buddy uses the annotated code as template and reuses a lot of information emitted by javac to guarantee a speedy conversion. Therefore, the library cannot simply copy the method and should rather feed the entire method body to javac.

                                                                                  Source https://stackoverflow.com/questions/60237664

                                                                                  Community Discussions, Code Snippets contain sources that include Stack Exchange Network

                                                                                  Vulnerabilities

                                                                                  No vulnerabilities reported

                                                                                  Install signoz

                                                                                  You can download it from GitHub.

                                                                                  Support

                                                                                  Come say Hi to us on Slack πŸ‘‹.
                                                                                  Find more information at:
                                                                                  Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
                                                                                  Find more libraries
                                                                                  Explore Kits - Develop, implement, customize Projects, Custom Functions and Applications with kandi kits​
                                                                                  Save this library and start creating your kit
                                                                                  CLONE
                                                                                • HTTPS

                                                                                  https://github.com/SigNoz/signoz.git

                                                                                • CLI

                                                                                  gh repo clone SigNoz/signoz

                                                                                • sshUrl

                                                                                  git@github.com:SigNoz/signoz.git

                                                                                • Share this Page

                                                                                  share link

                                                                                  Consider Popular Monitoring Libraries

                                                                                  netdata

                                                                                  by netdata

                                                                                  sentry

                                                                                  by getsentry

                                                                                  skywalking

                                                                                  by apache

                                                                                  osquery

                                                                                  by osquery

                                                                                  cat

                                                                                  by dianping

                                                                                  Try Top Libraries by SigNoz

                                                                                  logs-benchmark

                                                                                  by SigNozShell

                                                                                  signoz.io

                                                                                  by SigNozJavaScript

                                                                                  sample-flask-app

                                                                                  by SigNozHTML

                                                                                  Compare Monitoring Libraries with Highest Support

                                                                                  sentry

                                                                                  by getsentry

                                                                                  zipkin

                                                                                  by openzipkin

                                                                                  netdata

                                                                                  by netdata

                                                                                  osquery

                                                                                  by osquery

                                                                                  prometheus-operator

                                                                                  by prometheus-operator

                                                                                  Find, review, and download reusable Libraries, Code Snippets, Cloud APIs from over 650 million Knowledge Items
                                                                                  Find more libraries
                                                                                  Explore Kits - Develop, implement, customize Projects, Custom Functions and Applications with kandi kits​
                                                                                  Save this library and start creating your kit