Reputation: 1
I am trying to use the JDK's own "com. Sun. View the attach the VirtualMachine" to dynamically inject OpenTelemetry - Agent:
import com.sun.tools.attach.*;
VirtualMachine vm = VirtualMachine.attach(String.valueOf(PID));
vm.loadAgent(agentName)
I found that I did successfully inject it from the jvm into my application and was able to successfully read the parameters configured on the application.Also, in Tomcat's catalina.out, the log information at the time of injection is printed:
[otel.javaagent 2025-02-18 17:45:07:954 +0800] [Attach Listener] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 2.11.0
But all kinds of errors followed, and it seemed that all classes could not be retransformed,like:
[otel.javaagent 2025-02-18 18:29:50:182 +0800] [Attach Listener] DEBUG io.opentelemetry.javaagent.tooling.AgentInstaller$TransformLoggingListener - Transformed io.netty.channel.DefaultChannelPipeline -- ParallelWebappClassLoader
context: czcb_security_service
delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@4eec7777
[otel.javaagent 2025-02-18 18:29:50:189 +0800] [Attach Listener] DEBUG io.opentelemetry.javaagent.tooling.AgentInstaller$RedefinitionLoggingListener - Exception while retransforming 262 classes: [class filters.ExampleFilter, class compressionFilters.CompressionFilter, class async.Stockticker, class com.alibaba.csp.sentinel.transport.command.http.HttpEventTask, class com.ifp.core.session.IFPSessionManager$1, class io.netty.channel.AbstractChannelHandlerContext$WriteTask, class com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter$ServerThread, class com.alibaba.csp.sentinel.slots.system.SystemStatusListener, class com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc$1, class com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter$2, class org.apache.dubbo.common.threadlocal.InternalRunnable, class org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable, class io.netty.handler.timeout.IdleStateHandler$AllIdleTimeoutTask, class io.netty.handler.timeout.IdleStateHandler$AbstractIdleTask, class io.netty.channel.nio.AbstractNioByteChannel$1, class org.apache.dubbo.metadata.report.support.AbstractMetadataReport$SaveProperties, class org.apache.curator.framework.imps.DeleteBuilderImpl$5, class org.apache.curator.framework.imps.GetChildrenBuilderImpl$3, class org.apache.curator.framework.imps.CreateBuilderImpl$11, class org.apache.dubbo.common.threadlocal.InternalThread, class io.netty.channel.AbstractChannel$AbstractUnsafe$2, class io.netty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor$1, class io.netty.bootstrap.AbstractBootstrap$2, class io.netty.bootstrap.ServerBootstrap$1$1, class io.netty.bootstrap.AbstractBootstrap$PendingRegistrationPromise, class io.netty.util.concurrent.FastThreadLocalRunnable, class io.netty.util.internal.ThreadExecutorMap$2, class io.netty.util.concurrent.SingleThreadEventExecutor$4, interface io.netty.util.concurrent.AbstractEventExecutor$LazyRunnable, class io.netty.channel.AbstractChannel$AbstractUnsafe$1, class io.netty.buffer.PooledByteBufAllocator$1, class io.netty.channel.nio.AbstractNioChannel$1, class io.netty.channel.SucceededChannelFuture, class io.netty.channel.CompleteChannelFuture, class io.netty.channel.AbstractChannelHandlerContext, class io.netty.channel.DefaultChannelPipeline$PendingHandlerRemovedTask, class io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask, class io.netty.channel.DefaultChannelPipeline$PendingHandlerCallback, interface io.netty.channel.ChannelProgressivePromise, interface io.netty.channel.ChannelProgressiveFuture, class io.netty.channel.DefaultChannelPipeline, class io.netty.channel.AbstractChannel$CloseFuture, class io.netty.channel.DefaultChannelPromise, class io.netty.channel.VoidChannelPromise, interface io.netty.channel.ChannelPipeline, class io.netty.util.concurrent.SingleThreadEventExecutor$1, class io.netty.channel.nio.NioEventLoop, class io.netty.channel.SingleThreadEventLoop, class io.netty.util.concurrent.SingleThreadEventExecutor, class io.netty.util.concurrent.FailedFuture, class io.netty.util.concurrent.CompleteFuture, class io.netty.util.concurrent.GlobalEventExecutor$TaskRunner, class io.netty.util.concurrent.GlobalEventExecutor$1, class io.netty.util.concurrent.PromiseTask$SentinelRunnable, class io.netty.util.concurrent.ScheduledFutureTask, class io.netty.util.concurrent.PromiseTask, class io.netty.util.concurrent.AbstractScheduledEventExecutor$2, interface io.netty.util.concurrent.ScheduledFuture, interface io.netty.util.concurrent.ProgressivePromise, interface io.netty.util.concurrent.ProgressiveFuture, class io.netty.util.concurrent.GlobalEventExecutor, class io.netty.util.concurrent.AbstractScheduledEventExecutor, class io.netty.util.concurrent.AbstractEventExecutor, class io.netty.util.concurrent.DefaultPromise, class io.netty.util.concurrent.AbstractFuture, class io.netty.channel.nio.NioEventLoopGroup, class io.netty.channel.MultithreadEventLoopGroup, class io.netty.util.concurrent.MultithreadEventExecutorGroup, class io.netty.util.concurrent.AbstractEventExecutorGroup, class io.netty.util.concurrent.FastThreadLocalThread, class org.apache.dubbo.common.timer.HashedWheelTimer$Worker, class org.apache.curator.framework.imps.ExistsBuilderImpl$3, class org.apache.curator.framework.listen.ListenerContainer$1, class org.apache.curator.framework.imps.CuratorFrameworkImpl$4, class org.apache.zookeeper.ClientCnxn$EventThread, class org.apache.zookeeper.ClientCnxn$SendThread, class org.apache.zookeeper.server.ZooKeeperThread, class org.apache.curator.framework.state.ConnectionStateManager$1, class com.google.common.util.concurrent.AbstractListeningExecutorService, interface io.netty.channel.ChannelPromise, interface io.netty.util.concurrent.Promise, interface io.netty.channel.ChannelFuture, interface io.netty.util.concurrent.Future, class com.ifp.adapter.netty.http.NettyResponse, class com.ifp.adapter.netty.http.NettyRequest, class cfca.ch.qos.logback.classic.joran.ReconfigureOnChangeTask, class com.cfca.ra.cs.generated.CSProcessorSoapBindingStub, class org.apache.commons.discovery.jdk.PsuedoSystemClassLoader, interface com.cfca.ra.cs.generated.CSProcessor, class com.alibaba.druid.pool.DruidPooledCallableStatement, class com.alibaba.druid.pool.DruidPooledPreparedStatement, class com.alibaba.druid.pool.DruidPooledStatement, class com.alibaba.druid.stat.DruidDataSourceStatManager, class oracle.jdbc.driver.OracleTimeoutPollingThread, interface com.alibaba.druid.proxy.jdbc.ConnectionProxy, class oracle.jdbc.driver.T4CConnection, class oracle.jdbc.driver.PhysicalConnection, class oracle.jdbc.driver.OracleConnection, class oracle.jdbc.OracleConnectionWrapper, interface oracle.jdbc.internal.OracleConnection, interface oracle.jdbc.OracleConnection, class oracle.jdbc.driver.T4CCallableStatement, class oracle.jdbc.driver.OracleCallableStatement, interface oracle.jdbc.internal.OracleCallableStatement, interface oracle.jdbc.OracleCallableStatement, class oracle.jdbc.driver.T4CPreparedStatement, class oracle.jdbc.driver.OraclePreparedStatement, interface oracle.jdbc.internal.OraclePreparedStatement, interface oracle.jdbc.OraclePreparedStatement, class oracle.jdbc.driver.T4CStatement, class oracle.jdbc.driver.OracleStatement, interface oracle.jdbc.internal.OracleStatement, interface oracle.jdbc.OracleStatement, class oracle.jdbc.driver.OracleDriver, class com.alibaba.druid.mock.MockDriver, class com.alibaba.druid.proxy.DruidDriver, class com.alibaba.csp.sentinel.util.TimeUtil, class com.jcraft.jsch.ChannelSftp, class com.jcraft.jsch.ChannelSession, class com.jcraft.jsch.Channel, class com.alibaba.csp.sentinel.node.metric.MetricTimerListener, class com.alibaba.fastjson.util.ASMClassLoader, class org.apache.ibatis.ognl.enhance.ContextClassLoader, class com.alibaba.druid.pool.DruidDataSource$LogStatsThread, class com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread, class com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread, class com.alibaba.druid.pool.DruidDataSource$DestroyTask, class com.alibaba.druid.pool.DruidPooledConnection, class org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor, class redis.clients.jedis.Connection, class redis.clients.jedis.Jedis, class redis.clients.jedis.BinaryJedis, class com.ctrip.framework.apollo.internals.RemoteConfigRepository$2, class org.apache.dubbo.config.DubboShutdownHook, interface org.apache.http.client.HttpClient, class org.apache.dubbo.common.extension.ExtensionLoader, class org.apache.ibatis.logging.LogFactory$6, class org.apache.ibatis.logging.LogFactory$5, class org.apache.ibatis.logging.LogFactory$4, class org.apache.ibatis.logging.LogFactory$3, class org.apache.ibatis.logging.LogFactory$2, class org.apache.ibatis.logging.LogFactory$1, class com.ctrip.framework.apollo.spring.property.SpringValueRegistry$1, class com.ifp.core.base.IFPClassLoader, class com.ctrip.framework.apollo.internals.RemoteConfigLongPollService$2, class com.ctrip.framework.apollo.internals.RemoteConfigRepository$1, class com.ctrip.framework.apollo.internals.ConfigServiceLocator$2, class com.dianping.cat.message.io.ChannelManager, class com.dianping.cat.message.io.TcpSocketSender, interface org.unidal.helper.Threads$Task, class org.unidal.helper.Threads$RunnableThread, class org.unidal.helper.Threads$Manager$1, class org.springframework.cglib.core.internal.LoadingCache$2, class com.google.inject.internal.BytecodeGen$BridgeClassLoader, class com.google.inject.internal.AbstractBindingProcessor$Processor$1, class com.google.common.util.concurrent.SettableFuture, class com.google.common.util.concurrent.AbstractFuture, class org.springframework.beans.factory.support.DisposableBeanAdapter, class org.apache.log4j.PropertyWatchdog, class org.apache.log4j.helpers.FileWatchdog, class org.apache.log4j.Category, class org.springframework.context.support.AbstractApplicationContext$2, class org.springframework.context.support.ContextTypeMatchClassLoader, class org.springframework.core.DecoratingClassLoader, class org.springframework.web.context.support.XmlWebApplicationContext, class org.springframework.web.context.support.AbstractRefreshableWebApplicationContext, class org.springframework.context.support.AbstractApplicationContext, class io.opentelemetry.api.trace.PropagatedSpan, class io.opentelemetry.context.ArrayBasedContext, class io.opentelemetry.context.ContextStorageWrappers, class org.apache.logging.log4j.core.LoggerContext$1, class org.apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher, class com.lmax.disruptor.BatchEventProcessor, interface com.lmax.disruptor.EventProcessor, class org.apache.logging.log4j.core.util.Log4jThread, class org.apache.logging.log4j.core.Logger, class org.apache.logging.log4j.core.LoggerContext$ThreadContextDataTask, class org.apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction, class org.apache.logging.log4j.core.appender.routing.IdlePurgePolicy, class org.apache.logging.log4j.core.appender.rolling.action.DeleteAction, class org.apache.logging.log4j.core.appender.rolling.action.AbstractPathAction, class org.apache.logging.log4j.core.appender.rolling.action.AbstractAction, interface org.apache.logging.log4j.core.appender.rolling.action.Action, class org.apache.logging.log4j.core.impl.ContextDataInjectorFactory, interface org.apache.logging.log4j.core.util.Cancellable, class org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry, class org.apache.logging.log4j.simple.SimpleLogger, class org.apache.logging.log4j.status.StatusLogger, class org.apache.logging.log4j.spi.AbstractLogger, class com.ifp.web.servlet.CenterServiceRequestServlet, class com.ifp.web.servlet.IFPRequestServlet, class org.springframework.web.servlet.FrameworkServlet, class org.springframework.web.servlet.HttpServletBean, class com.ifp.web.filter.SetCharacterEncodingFilter, class org.apache.tomcat.util.threads.TaskThread$WrappingRunnable, class org.apache.tomcat.util.threads.ThreadPoolExecutor, class org.apache.tomcat.util.threads.TaskThread, class org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor, class org.apache.catalina.filters.RequestDumperFilter, class org.apache.catalina.filters.CsrfPreventionFilter, class org.apache.catalina.filters.CsrfPreventionFilterBase, class org.apache.catalina.filters.SetCharacterEncodingFilter, class org.apache.catalina.filters.FilterBase, class org.apache.catalina.startup.HostConfig$DeployDirectory, class org.apache.tomcat.websocket.server.WsFilter, class org.apache.jasper.servlet.JspServlet, class javax.servlet.ServletOutputStream, class org.apache.catalina.servlets.DefaultServlet, class javax.servlet.http.HttpServlet, class javax.servlet.GenericServlet, interface javax.servlet.Filter, class org.apache.catalina.loader.ParallelWebappClassLoader, class org.apache.catalina.loader.WebappClassLoaderBase, interface javax.servlet.Servlet, class org.apache.catalina.startup.HostConfig$DeployWar, class org.apache.catalina.core.ContainerBase$StartChild, class org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller, class org.apache.catalina.connector.CoyoteAdapter, class org.apache.tomcat.util.net.NioEndpoint$Poller, class org.apache.coyote.AbstractProtocol$AsyncTimeout, class org.apache.catalina.connector.Response, interface javax.servlet.http.HttpServletResponse, class org.apache.catalina.connector.Request, interface org.apache.catalina.servlet4preview.http.HttpServletRequest, interface javax.servlet.http.HttpServletRequest, interface javax.servlet.ServletRequest, class org.apache.tomcat.util.net.NioEndpoint$Acceptor, class org.apache.tomcat.util.net.AbstractEndpoint$Acceptor, class org.apache.tomcat.util.net.NioEndpoint$SocketProcessor, class org.apache.tomcat.util.net.SocketProcessorBase, class org.apache.catalina.startup.Catalina$CatalinaShutdownHook, class org.apache.catalina.startup.SafeForkJoinWorkerThreadFactory$SafeForkJoinWorkerThread, class org.apache.juli.AsyncFileHandler$LoggerThread, class org.apache.juli.ClassLoaderLogManager$Cleaner, class org.apache.juli.ClassLoaderLogManager$RootLogger, class java.util.concurrent.CompletableFuture$Completion, class java.util.concurrent.ForkJoinWorkerThread, class java.util.concurrent.ForkJoinTask, class java.util.concurrent.ForkJoinPool, interface java.rmi.Remote, class java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask, class sun.net.www.protocol.http.HttpURLConnection, class java.net.HttpURLConnection, interface java.util.concurrent.RunnableScheduledFuture, class java.util.concurrent.ScheduledThreadPoolExecutor, class java.lang.invoke.InnerClassLambdaMetafactory, class java.util.concurrent.Executors$RunnableAdapter, class java.util.concurrent.ThreadPoolExecutor$Worker, class java.util.concurrent.FutureTask, interface java.util.concurrent.RunnableFuture, interface java.util.concurrent.Callable, class java.util.logging.LogManager$RootLogger, class java.util.concurrent.ThreadPoolExecutor, class java.util.concurrent.Executors$FinalizableDelegatedExecutorService, class java.util.concurrent.Executors$DelegatedExecutorService, class java.util.concurrent.AbstractExecutorService, class java.util.logging.Logger, class sun.reflect.Reflection, class sun.misc.Launcher$AppClassLoader, class java.net.URLClassLoader, class java.lang.ClassLoader, class java.lang.Class]
java.lang.VerifyError
at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
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:497)
at net.bytebuddy.utility.Invoker$Dispatcher.invoke(Unknown Source)
at net.bytebuddy.utility.dispatcher.JavaDispatcher$Dispatcher$ForNonStaticMethod.invoke(JavaDispatcher.java:1033)
at net.bytebuddy.utility.dispatcher.JavaDispatcher$ProxiedInvocationHandler.invoke(JavaDispatcher.java:1163)
at net.bytebuddy.agent.builder.$Proxy93.retransformClasses(Unknown Source)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector$ForRetransformation.doApply(AgentBuilder.java:8611)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector.apply(AgentBuilder.java:8426)
at net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy.apply(AgentBuilder.java:6123)
at net.bytebuddy.agent.builder.AgentBuilder$Default.doInstall(AgentBuilder.java:11737)
at net.bytebuddy.agent.builder.AgentBuilder$Default.installOn(AgentBuilder.java:11637)
at io.opentelemetry.javaagent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:202)
at io.opentelemetry.javaagent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:109)
at io.opentelemetry.javaagent.tooling.AgentStarterImpl.start(AgentStarterImpl.java:101)
at io.opentelemetry.javaagent.bootstrap.AgentInitializer$1.run(AgentInitializer.java:54)
at io.opentelemetry.javaagent.bootstrap.AgentInitializer$1.run(AgentInitializer.java:48)
at io.opentelemetry.javaagent.bootstrap.AgentInitializer.execute(AgentInitializer.java:70)
at io.opentelemetry.javaagent.bootstrap.AgentInitializer.initialize(AgentInitializer.java:47)
at io.opentelemetry.javaagent.OpenTelemetryAgent.startAgent(OpenTelemetryAgent.java:57)
at io.opentelemetry.javaagent.OpenTelemetryAgent.agentmain(OpenTelemetryAgent.java:49)
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:497)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallAgentmain(InstrumentationImpl.java:411)
[otel.javaagent 2025-02-18 18:29:50:211 +0800] [Attach Listener] DEBUG io.opentelemetry.javaagent.tooling.AgentInstaller - Detected custom LogManager configuration: java.util.logging.manager=org.apache.juli.ClassLoaderLogManager
[otel.javaagent 2025-02-18 18:29:50:211 +0800] [Attach Listener] DEBUG io.opentelemetry.javaagent.tooling.AgentInstaller - Class org.apache.juli.ClassLoaderLogManager is on system classpath: not delaying AgentInstaller#afterAgent()
[otel.javaagent 2025-02-18 18:29:50:213 +0800] [Attach Listener] DEBUG io.opentelemetry.javaagent.shaded.instrumentation.jmx.engine.JmxMetricInsight - Empty JMX configuration, no metrics will be collected for InstrumentationScope io.opentelemetry.jmx
I want to be able to inject the Agent dynamically to make it easier to plug and unplug
Upvotes: 0
Views: 21