Failed to Inject helper classes - io.opentelemetry.javaagent.tooling.HelperInjector
Hi,
We have this for opentelemetry agent. We are using
- springboot v 2.7.0,
- JDK17 and
- opentelemetry-javaagent v1.11.1
Please help to fix this.
ERROR [otel.javaagent 2022-08-18 13:22:29:537 +0000] [main] ERROR io.opentelemetry.javaagent.tooling.HelperInjector - Error preparing helpers while processing class org.springframework.web.servlet.DispatcherServlet for spring-webmvc. Failed to inject helper classes into instance org.springframework.boot.loader.LaunchedURLClassLoader@3d7fa3ae java.lang.UnsupportedOperationException: Cannot get defined package using reflection: Unable to make protected java.lang.Package java.lang.ClassLoader.getPackage(java.lang.String) accessible: module java.base does not "opens java.lang" to unnamed module @442d9b6e at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Initializable$Unavailable.getDefinedPackage(ClassInjector.java:478) at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.injectRaw(ClassInjector.java:250) at io.opentelemetry.javaagent.tooling.HelperInjector.injectClassLoader(HelperInjector.java:262) at io.opentelemetry.javaagent.tooling.HelperInjector.lambda$injectHelperClasses$2(HelperInjector.java:211) at io.opentelemetry.javaagent.shaded.instrumentation.api.cache.internal.weaklockfree.AbstractWeakConcurrentMap.lambda$computeIfAbsent$0(AbstractWeakConcurrentMap.java:177) at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708) at io.opentelemetry.javaagent.shaded.instrumentation.api.cache.internal.weaklockfree.AbstractWeakConcurrentMap.computeIfAbsent(AbstractWeakConcurrentMap.java:177) at io.opentelemetry.javaagent.shaded.instrumentation.api.cache.internal.weaklockfree.WeakConcurrentMap.computeIfAbsent(WeakConcurrentMap.java:48) at io.opentelemetry.javaagent.shaded.instrumentation.api.cache.internal.weaklockfree.WeakConcurrentMap$WithInlinedExpunction.computeIfAbsent(WeakConcurrentMap.java:206) at io.opentelemetry.javaagent.shaded.instrumentation.api.cache.WeakLockFreeCache.computeIfAbsent(WeakLockFreeCache.java:21) at io.opentelemetry.javaagent.tooling.HelperInjector.injectHelperClasses(HelperInjector.java:199) at io.opentelemetry.javaagent.tooling.HelperInjector.transform(HelperInjector.java:155)
It's because Java 17 is strict on the module boundaries and reflection is no longer supported to do this. This exception is expected.
The agent should rather use ClassInjector.UsingLookup. This new method is only supported starting from Java 9. Both methods can be supported side by side; each injector class declares a static isAvailable method to check its applicability on the current VM.