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 ioty.channel.DefaultChannelPipeline -- ParallelWebappClassLoader
context: czcb_security_service
delegate: false
----------> Parent Classloader:
java.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.transportmand.http.HttpEventTask, class com.ifp.core.session.IFPSessionManager$1, class ioty.channel.AbstractChannelHandlerContext$WriteTask, class com.alibaba.csp.sentinel.transportmand.SimpleHttpCommandCenter$ServerThread, class com.alibaba.csp.sentinel.slots.system.SystemStatusListener, class com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc$1, class com.alibaba.csp.sentinel.transportmand.SimpleHttpCommandCenter$2, class .apache.dubbomon.threadlocal.InternalRunnable, class .apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable, class ioty.handler.timeout.IdleStateHandler$AllIdleTimeoutTask, class ioty.handler.timeout.IdleStateHandler$AbstractIdleTask, class ioty.channel.nio.AbstractNioByteChannel$1, class .apache.dubbo.metadata.report.support.AbstractMetadataReport$SaveProperties, class .apache.curator.framework.imps.DeleteBuilderImpl$5, class .apache.curator.framework.imps.GetChildrenBuilderImpl$3, class .apache.curator.framework.imps.CreateBuilderImpl$11, class .apache.dubbomon.threadlocal.InternalThread, class ioty.channel.AbstractChannel$AbstractUnsafe$2, class ioty.bootstrap.ServerBootstrap$ServerBootstrapAcceptor$1, class ioty.bootstrap.AbstractBootstrap$2, class ioty.bootstrap.ServerBootstrap$1$1, class ioty.bootstrap.AbstractBootstrap$PendingRegistrationPromise, class ioty.util.concurrent.FastThreadLocalRunnable, class ioty.util.internal.ThreadExecutorMap$2, class ioty.util.concurrent.SingleThreadEventExecutor$4, interface ioty.util.concurrent.AbstractEventExecutor$LazyRunnable, class ioty.channel.AbstractChannel$AbstractUnsafe$1, class ioty.buffer.PooledByteBufAllocator$1, class ioty.channel.nio.AbstractNioChannel$1, class ioty.channel.SucceededChannelFuture, class ioty.channel.CompleteChannelFuture, class ioty.channel.AbstractChannelHandlerContext, class ioty.channel.DefaultChannelPipeline$PendingHandlerRemovedTask, class ioty.channel.DefaultChannelPipeline$PendingHandlerAddedTask, class ioty.channel.DefaultChannelPipeline$PendingHandlerCallback, interface ioty.channel.ChannelProgressivePromise, interface ioty.channel.ChannelProgressiveFuture, class ioty.channel.DefaultChannelPipeline, class ioty.channel.AbstractChannel$CloseFuture, class ioty.channel.DefaultChannelPromise, class ioty.channel.VoidChannelPromise, interface ioty.channel.ChannelPipeline, class ioty.util.concurrent.SingleThreadEventExecutor$1, class ioty.channel.nio.NioEventLoop, class ioty.channel.SingleThreadEventLoop, class ioty.util.concurrent.SingleThreadEventExecutor, class ioty.util.concurrent.FailedFuture, class ioty.util.concurrent.CompleteFuture, class ioty.util.concurrent.GlobalEventExecutor$TaskRunner, class ioty.util.concurrent.GlobalEventExecutor$1, class ioty.util.concurrent.PromiseTask$SentinelRunnable, class ioty.util.concurrent.ScheduledFutureTask, class ioty.util.concurrent.PromiseTask, class ioty.util.concurrent.AbstractScheduledEventExecutor$2, interface ioty.util.concurrent.ScheduledFuture, interface ioty.util.concurrent.ProgressivePromise, interface ioty.util.concurrent.ProgressiveFuture, class ioty.util.concurrent.GlobalEventExecutor, class ioty.util.concurrent.AbstractScheduledEventExecutor, class ioty.util.concurrent.AbstractEventExecutor, class ioty.util.concurrent.DefaultPromise, class ioty.util.concurrent.AbstractFuture, class ioty.channel.nio.NioEventLoopGroup, class ioty.channel.MultithreadEventLoopGroup, class ioty.util.concurrent.MultithreadEventExecutorGroup, class ioty.util.concurrent.AbstractEventExecutorGroup, class ioty.util.concurrent.FastThreadLocalThread, class .apache.dubbomon.timer.HashedWheelTimer$Worker, class .apache.curator.framework.imps.ExistsBuilderImpl$3, class .apache.curator.framework.listen.ListenerContainer$1, class .apache.curator.framework.imps.CuratorFrameworkImpl$4, class .apache.zookeeper.ClientCnxn$EventThread, class .apache.zookeeper.ClientCnxn$SendThread, class .apache.zookeeper.server.ZooKeeperThread, class .apache.curator.framework.state.ConnectionStateManager$1, class com.googlemon.util.concurrent.AbstractListeningExecutorService, interface ioty.channel.ChannelPromise, interface ioty.util.concurrent.Promise, interface ioty.channel.ChannelFuture, interface ioty.util.concurrent.Future, class com.ifp.adapterty.http.NettyResponse, class com.ifp.adapterty.http.NettyRequest, class cfca.ch.qos.logback.classic.joran.ReconfigureOnChangeTask, class com.cfca.ra.cs.generated.CSProcessorSoapBindingStub, class .apachemons.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 .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 .apachemons.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 .apache.dubbo.config.DubboShutdownHook, interface .apache.http.client.HttpClient, class .apache.dubbomon.extension.ExtensionLoader, class .apache.ibatis.logging.LogFactory$6, class .apache.ibatis.logging.LogFactory$5, class .apache.ibatis.logging.LogFactory$4, class .apache.ibatis.logging.LogFactory$3, class .apache.ibatis.logging.LogFactory$2, class .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 .unidal.helper.Threads$Task, class .unidal.helper.Threads$RunnableThread, class .unidal.helper.Threads$Manager$1, class .springframework.cglib.core.internal.LoadingCache$2, class com.google.inject.internal.BytecodeGen$BridgeClassLoader, class com.google.inject.internal.AbstractBindingProcessor$Processor$1, class com.googlemon.util.concurrent.SettableFuture, class com.googlemon.util.concurrent.AbstractFuture, class .springframework.beans.factory.support.DisposableBeanAdapter, class .apache.log4j.PropertyWatchdog, class .apache.log4j.helpers.FileWatchdog, class .apache.log4j.Category, class .springframework.context.support.AbstractApplicationContext$2, class .springframework.context.support.ContextTypeMatchClassLoader, class .springframework.core.DecoratingClassLoader, class .springframework.web.context.support.XmlWebApplicationContext, class .springframework.web.context.support.AbstractRefreshableWebApplicationContext, class .springframework.context.support.AbstractApplicationContext, class io.opentelemetry.api.trace.PropagatedSpan, class io.opentelemetry.context.ArrayBasedContext, class io.opentelemetry.context.ContextStorageWrappers, class .apache.logging.log4j.core.LoggerContext$1, class .apache.logging.log4j.core.appender.AsyncAppenderEventDispatcher, class com.lmax.disruptor.BatchEventProcessor, interface com.lmax.disruptor.EventProcessor, class .apache.logging.log4j.core.util.Log4jThread, class .apache.logging.log4j.core.Logger, class .apache.logging.log4j.core.LoggerContext$ThreadContextDataTask, class .apache.logging.log4j.core.appender.rolling.action.PosixViewAttributeAction, class .apache.logging.log4j.core.appender.routing.IdlePurgePolicy, class .apache.logging.log4j.core.appender.rolling.action.DeleteAction, class .apache.logging.log4j.core.appender.rolling.action.AbstractPathAction, class .apache.logging.log4j.core.appender.rolling.action.AbstractAction, interface .apache.logging.log4j.core.appender.rolling.action.Action, class .apache.logging.log4j.core.impl.ContextDataInjectorFactory, interface .apache.logging.log4j.core.util.Cancellable, class .apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry, class .apache.logging.log4j.simple.SimpleLogger, class .apache.logging.log4j.status.StatusLogger, class .apache.logging.log4j.spi.AbstractLogger, class com.ifp.web.servlet.CenterServiceRequestServlet, class com.ifp.web.servlet.IFPRequestServlet, class .springframework.web.servlet.FrameworkServlet, class .springframework.web.servlet.HttpServletBean, class com.ifp.web.filter.SetCharacterEncodingFilter, class .apache.tomcat.util.threads.TaskThread$WrappingRunnable, class .apache.tomcat.util.threads.ThreadPoolExecutor, class .apache.tomcat.util.threads.TaskThread, class .apache.catalina.core.ContainerBase$ContainerBackgroundProcessor, class .apache.catalina.filters.RequestDumperFilter, class .apache.catalina.filters.CsrfPreventionFilter, class .apache.catalina.filters.CsrfPreventionFilterBase, class .apache.catalina.filters.SetCharacterEncodingFilter, class .apache.catalina.filters.FilterBase, class .apache.catalina.startup.HostConfig$DeployDirectory, class .apache.tomcat.websocket.server.WsFilter, class .apache.jasper.servlet.JspServlet, class javax.servlet.ServletOutputStream, class .apache.catalina.servlets.DefaultServlet, class javax.servlet.http.HttpServlet, class javax.servlet.GenericServlet, interface javax.servlet.Filter, class .apache.catalina.loader.ParallelWebappClassLoader, class .apache.catalina.loader.WebappClassLoaderBase, interface javax.servlet.Servlet, class .apache.catalina.startup.HostConfig$DeployWar, class .apache.catalina.core.ContainerBase$StartChild, class .apache.tomcat.util.NioBlockingSelector$BlockPoller, class .apache.catalina.connector.CoyoteAdapter, class .apache.tomcat.util.NioEndpoint$Poller, class .apache.coyote.AbstractProtocol$AsyncTimeout, class .apache.catalina.connector.Response, interface javax.servlet.http.HttpServletResponse, class .apache.catalina.connector.Request, interface .apache.catalina.servlet4preview.http.HttpServletRequest, interface javax.servlet.http.HttpServletRequest, interface javax.servlet.ServletRequest, class .apache.tomcat.util.NioEndpoint$Acceptor, class .apache.tomcat.util.AbstractEndpoint$Acceptor, class .apache.tomcat.util.NioEndpoint$SocketProcessor, class .apache.tomcat.util.SocketProcessorBase, class .apache.catalina.startup.Catalina$CatalinaShutdownHook, class .apache.catalina.startup.SafeForkJoinWorkerThreadFactory$SafeForkJoinWorkerThread, class .apache.juli.AsyncFileHandler$LoggerThread, class .apache.juli.ClassLoaderLogManager$Cleaner, class .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.www.protocol.http.HttpURLConnection, class java.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.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=.apache.juli.ClassLoaderLogManager
[otel.javaagent 2025-02-18 18:29:50:211 +0800] [Attach Listener] DEBUG io.opentelemetry.javaagent.tooling.AgentInstaller - Class .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