Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blockhound + Opentelemetry agent fail on install #411

Closed
friscoMad opened this issue Apr 19, 2024 · 3 comments
Closed

Blockhound + Opentelemetry agent fail on install #411

friscoMad opened this issue Apr 19, 2024 · 3 comments
Assignees
Labels
status/invalid This doesn't seem right

Comments

@friscoMad
Copy link

We are using the opentelemtry java agent via JVM params and when Blockhound tries to install it fails as it tries to instrument opentelemetry loaded code.

[Byte Buddy] ERROR java.util.concurrent.FutureTask [null, module java.base, Thread[main,5,main], loaded=true]                                                                                                                                                          │
│ reactor.blockhound.shaded.net.bytebuddy.pool.TypePool$Resolution$NoSuchTypeException: Cannot resolve type description for io.opentelemetry.javaagent.bootstrap.VirtualFieldInstalledMarker                                                                             ││     at reactor.blockhound.shaded.net.bytebuddy.pool.TypePool$Resolution$Illegal.resolve(TypePool.java:190)                                                                                                                                                             │
│     at reactor.blockhound.shaded.net.bytebuddy.pool.TypePool$Default$LazyTypeDescription$TokenizedGenericType.toErasure(TypePool.java:6931)                                                                                                                            ││     at reactor.blockhound.shaded.net.bytebuddy.pool.TypePool$Default$LazyTypeDescription$TokenizedGenericType$TokenList.get(TypePool.java:7012)                                                                                                                        │
│     at reactor.blockhound.shaded.net.bytebuddy.pool.TypePool$Default$LazyTypeDescription$TokenizedGenericType$TokenList.get(TypePool.java:6958)                                                                                                                        ││     at java.base/java.util.AbstractList$Itr.next(AbstractList.java:371)                                                                                                                                                                                                │
│     at reactor.blockhound.shaded.net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.doAnalyze(MethodGraph.java:745)                                                                                                                                           ││     at reactor.blockhound.shaded.net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$Default.compile(MethodGraph.java:668)                                                                                                                                             │
│     at reactor.blockhound.shaded.net.bytebuddy.dynamic.scaffold.MethodGraph$Compiler$AbstractBase.compile(MethodGraph.java:519)                                                                                                                                        ││     at reactor.blockhound.shaded.net.bytebuddy.dynamic.scaffold.inline.DecoratingDynamicTypeBuilder.toTypeWriter(DecoratingDynamicTypeBuilder.java:496)                                                                                                                │
│     at reactor.blockhound.shaded.net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$UsingTypeWriter.make(DynamicType.java:4062)                                                                                                                                    ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:12510)                                                                                                                            │
│     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12445)                                                                                                                              ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1800(AgentBuilder.java:12154)                                                                                                                            │
│     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$Java9CapableVmDispatcher.run(AgentBuilder.java:12936)                                                                                                           ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$Java9CapableVmDispatcher.run(AgentBuilder.java:12866)                                                                                                           │
│     at java.base/java.security.AccessController.doPrivileged(Native Method)                                                                                                                                                                                            ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doPrivileged(AgentBuilder.java)                                                                                                                                 │
│     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12388)                                                                                                                              ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$ByteBuddy$ModuleSupport.transform(Unknown Source)                                                                                                               │
│     at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)                                                                                                                                                                        ││     at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)                                                                                                                                                                      │
│     at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)                                                                                                                                                                           ││     at java.instrument/sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:167)                                                                                                                                                             │
│     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)                                                                                                                                                                                  ││     at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)                                                                                                                                                                │
│     at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)                                                                                                                                                        ││     at java.base/java.lang.reflect.Method.invoke(Method.java:566)                                                                                                                                                                                                      │
│     at reactor.blockhound.shaded.net.bytebuddy.utility.Invoker$Dispatcher.invoke(Unknown Source)                                                                                                                                                                       ││     at reactor.blockhound.shaded.net.bytebuddy.utility.dispatcher.JavaDispatcher$Dispatcher$ForNonStaticMethod.invoke(JavaDispatcher.java:1032)                                                                                                                        │
│     at reactor.blockhound.shaded.net.bytebuddy.utility.dispatcher.JavaDispatcher$ProxiedInvocationHandler.invoke(JavaDispatcher.java:1162)                                                                                                                             ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.$Proxy86.retransformClasses(Unknown Source)                                                                                                                                                               │
│     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector$ForRetransformation.doApply(AgentBuilder.java:8395)                                                                                                           ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy$Collector.apply(AgentBuilder.java:8210)                                                                                                                                 │
│     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$RedefinitionStrategy.apply(AgentBuilder.java:5907)                                                                                                                                           ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default.doInstall(AgentBuilder.java:11521)                                                                                                                                                   │
│     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default.installOn(AgentBuilder.java:11421)                                                                                                                                                   ││     at reactor.blockhound.shaded.net.bytebuddy.agent.builder.AgentBuilder$Default$Delegator.installOn(AgentBuilder.java:13218)                                                                                                                                         │
│     at reactor.blockhound.BlockHound$Builder.instrument(BlockHound.java:597)

Expected Behavior

Open telemetry and blockhound can work together

Actual Behavior

Instrumentation fails

Steps to Reproduce

java -javaagent:/opt/otel/opentelemetry-javaagent-all.jar

@Test
void reproCase() {
   BlockHound.install()
}

Possible Solution

This reported issue in ByteBuddy seems to be related:
raphw/byte-buddy#1320

Your Environment

  • Reactor version(s) used:
  • Other relevant libraries versions (eg. netty, ...): opentelemetry 1.24 (I will do some test with a recent version in case it was fixed there)
  • JVM version (java -version): 11
  • OS and version (eg uname -a):
@pderop pderop self-assigned this Apr 19, 2024
@pderop
Copy link
Member

pderop commented Apr 19, 2024

Hi @friscoMad ,

Can you try to run your test like this: instead of calling BlockHound.install() from your test in the java code, declare the blockhound agent using a -javaagent option, like you do with your open telemetry agent.

but make sure you declare the BlockHound agent before the open telemetry agent.

it works for me when I run my sample application like this:

java -javaagent:blockhound-1.0.9.RELEASE.jar -javaagent:opentelemetry-javaagent-2.4.0-SNAPSHOT.jar  -jar target/echo-0.0.1-SNAPSHOT.jar

note that if I declare the blockhound agent after the opentelemetry agent, then I reproduce the same problem you have reported.

I have tested with jdk-8, jdk-11, jdk-17, jdk-21, and jdk-22

do not forget to use -XX:+AllowRedefinitionToAddDeleteMethods in case you use a JDK13+ version.

let me know.

thanks.

@pderop pderop added the for/user-attention This issue needs user attention (feedback, rework, etc...) label Apr 19, 2024
@friscoMad
Copy link
Author

Thanks, we are trying to avoid adding more agents to the command line, so our solution is to move the OTel agent to attach it on runtime using this contrib lib:
https://github.com/open-telemetry/opentelemetry-java-contrib/blob/main/runtime-attach/README.md
So far it appears to be working and both seem to be doing their thing, even when Blockhound is attached after OTel, which is interesting.

@pderop
Copy link
Member

pderop commented Apr 27, 2024

ok, I'm closing this issue, reopen it if necessary.
thanks.

@pderop pderop closed this as completed Apr 27, 2024
@pderop pderop added status/invalid This doesn't seem right and removed for/user-attention This issue needs user attention (feedback, rework, etc...) labels Apr 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
status/invalid This doesn't seem right
Projects
None yet
Development

No branches or pull requests

2 participants