Describe the bug
Hello folks,
After upgrading from 2.21.0 to 2.22.0 (and 2.23.0), when using the java agent, we get errors at startup because we run in an environment where the filesystem is read-only by default:
[otel.javaagent 2025-12-16 10:35:09:991 +0000] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 2.23.0
[otel.javaagent 2025-12-16 10:35:17:060 +0000] [main] ERROR io.opentelemetry.javaagent.tooling.HelperInjector - Error preparing helpers while processing class java.util.logging.Logger for java-util-logging. Failed to inject helper classes into instance <bootstrap>
java.lang.IllegalStateException: Failed to create temporary directory.
at io.opentelemetry.javaagent.tooling.HelperInjector.createTempDir(HelperInjector.java:430)
at io.opentelemetry.javaagent.tooling.HelperInjector.injectBootstrapClassLoader(HelperInjector.java:414)
at io.opentelemetry.javaagent.tooling.HelperInjector.injectHelperClasses(HelperInjector.java:291)
at io.opentelemetry.javaagent.tooling.HelperInjector.lambda$transform$11(HelperInjector.java:201)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.AbstractWeakConcurrentMap.lambda$computeIfAbsent$0(AbstractWeakConcurrentMap.java:187)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(Unknown Source)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.AbstractWeakConcurrentMap.computeIfAbsent(AbstractWeakConcurrentMap.java:186)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.WeakConcurrentMap.computeIfAbsent(WeakConcurrentMap.java:48)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.WeakConcurrentMap$WithInlinedExpunction.computeIfAbsent(WeakConcurrentMap.java:221)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.WeakLockFreeCache.computeIfAbsent(WeakLockFreeCache.java:22)
at io.opentelemetry.javaagent.tooling.HelperInjector.transform(HelperInjector.java:174)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:12822)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12759)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1800(AgentBuilder.java:12468)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$Java9CapableVmDispatcher.run(AgentBuilder.java:13250)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$Java9CapableVmDispatcher.run(AgentBuilder.java:13180)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doPrivileged(AgentBuilder.java)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12702)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$ByteBuddy$ModuleSupport.transform(Unknown Source)
at java.instrument/sun.instrument.TransformerManager.transform(Unknown Source)
at java.instrument/sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.base/java.lang.ClassLoader.findBootstrapClass(Native Method)
at java.base/java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source)
at java.base/java.lang.System$1.findBootstrapClassOrNull(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$BootClassLoader.loadClassOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(Unknown Source)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at org.slf4j.bridge.SLF4JBridgeHandler.<clinit>(SLF4JBridgeHandler.java:111)
at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:91)
at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:75)
at play.api.inject.guice.GuiceApplicationBuilder.$anonfun$configureLoggerFactory$1(GuiceApplicationBuilder.scala:158)
at scala.Option.map(Option.scala:242)
at play.api.inject.guice.GuiceApplicationBuilder.configureLoggerFactory(GuiceApplicationBuilder.scala:157)
at play.api.inject.guice.GuiceApplicationBuilder.applicationModule(GuiceApplicationBuilder.scala:116)
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:200)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:176)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
at play.core.server.ProdServerStart$.start(ProdServerStart.scala:52)
at play.core.server.ProdServerStart$.main(ProdServerStart.scala:28)
at play.core.server.ProdServerStart.main(ProdServerStart.scala)
Caused by: java.nio.file.FileSystemException: /tmp/opentelemetry-temp-jars7548131800099795207: Read-only file system
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(Unknown Source)
at java.base/java.nio.file.Files.createDirectory(Unknown Source)
at java.base/java.nio.file.TempFileHelper.create(Unknown Source)
at java.base/java.nio.file.TempFileHelper.createTempDirectory(Unknown Source)
at java.base/java.nio.file.Files.createTempDirectory(Unknown Source)
at io.opentelemetry.javaagent.tooling.HelperInjector.createTempDir(HelperInjector.java:428)
... 42 more
[otel.javaagent 2025-12-16 10:35:17:075 +0000] [main] ERROR io.opentelemetry.javaagent.tooling.HelperInjector - Error preparing helpers while processing class java.util.logging.LogManager$RootLogger for java-util-logging. Failed to inject helper classes into instance <bootstrap>
java.lang.IllegalStateException: Failed to create temporary directory.
at io.opentelemetry.javaagent.tooling.HelperInjector.createTempDir(HelperInjector.java:430)
at io.opentelemetry.javaagent.tooling.HelperInjector.injectBootstrapClassLoader(HelperInjector.java:414)
at io.opentelemetry.javaagent.tooling.HelperInjector.injectHelperClasses(HelperInjector.java:291)
at io.opentelemetry.javaagent.tooling.HelperInjector.lambda$transform$11(HelperInjector.java:201)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.AbstractWeakConcurrentMap.lambda$computeIfAbsent$0(AbstractWeakConcurrentMap.java:187)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(Unknown Source)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.AbstractWeakConcurrentMap.computeIfAbsent(AbstractWeakConcurrentMap.java:186)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.WeakConcurrentMap.computeIfAbsent(WeakConcurrentMap.java:48)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.weaklockfree.WeakConcurrentMap$WithInlinedExpunction.computeIfAbsent(WeakConcurrentMap.java:221)
at io.opentelemetry.javaagent.shaded.instrumentation.api.internal.cache.WeakLockFreeCache.computeIfAbsent(WeakLockFreeCache.java:22)
at io.opentelemetry.javaagent.tooling.HelperInjector.transform(HelperInjector.java:174)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doTransform(AgentBuilder.java:12822)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12759)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.access$1800(AgentBuilder.java:12468)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$Java9CapableVmDispatcher.run(AgentBuilder.java:13250)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$Java9CapableVmDispatcher.run(AgentBuilder.java:13180)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.doPrivileged(AgentBuilder.java)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer.transform(AgentBuilder.java:12702)
at net.bytebuddy.agent.builder.AgentBuilder$Default$ExecutingTransformer$ByteBuddy$ModuleSupport.transform(Unknown Source)
at java.instrument/sun.instrument.TransformerManager.transform(Unknown Source)
at java.instrument/sun.instrument.InstrumentationImpl.transform(Unknown Source)
at java.logging/java.util.logging.LogManager.ensureLogManagerInitialized(Unknown Source)
at java.logging/java.util.logging.LogManager.getLogManager(Unknown Source)
at org.slf4j.bridge.SLF4JBridgeHandler.getRootLogger(SLF4JBridgeHandler.java:132)
at org.slf4j.bridge.SLF4JBridgeHandler.removeHandlersForRootLogger(SLF4JBridgeHandler.java:175)
at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:91)
at play.api.libs.logback.LogbackLoggerConfigurator.configure(LogbackLoggerConfigurator.scala:75)
at play.api.inject.guice.GuiceApplicationBuilder.$anonfun$configureLoggerFactory$1(GuiceApplicationBuilder.scala:158)
at scala.Option.map(Option.scala:242)
at play.api.inject.guice.GuiceApplicationBuilder.configureLoggerFactory(GuiceApplicationBuilder.scala:157)
at play.api.inject.guice.GuiceApplicationBuilder.applicationModule(GuiceApplicationBuilder.scala:116)
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:200)
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:176)
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21)
at play.core.server.ProdServerStart$.start(ProdServerStart.scala:52)
at play.core.server.ProdServerStart$.main(ProdServerStart.scala:28)
at play.core.server.ProdServerStart.main(ProdServerStart.scala)
Caused by: java.nio.file.FileSystemException: /tmp/opentelemetry-temp-jars6192078968140338460: Read-only file system
at java.base/sun.nio.fs.UnixException.translateToIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(Unknown Source)
at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(Unknown Source)
at java.base/java.nio.file.Files.createDirectory(Unknown Source)
at java.base/java.nio.file.TempFileHelper.create(Unknown Source)
at java.base/java.nio.file.TempFileHelper.createTempDirectory(Unknown Source)
at java.base/java.nio.file.Files.createTempDirectory(Unknown Source)
at io.opentelemetry.javaagent.tooling.HelperInjector.createTempDir(HelperInjector.java:428)
... 37 more
Is it required to have a writeable tmp folder for using the Java agent?
Note that the stacktrace seems to originate from logging libraries even though we don't use OTEL for logs (OTEL_LOGS_EXPORTER=none).
Steps to reproduce
None yet, I can provide a MRE later if needed.
Expected behavior
No error at startup
Actual behavior
Errors at startup
Javaagent or library instrumentation version
2.23.0
Environment
JDK: 25.0.1
OS: Linux
Additional context
No response
Tip
React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it. Learn more here.
Describe the bug
Hello folks,
After upgrading from 2.21.0 to 2.22.0 (and 2.23.0), when using the java agent, we get errors at startup because we run in an environment where the filesystem is read-only by default:
Is it required to have a writeable
tmpfolder for using the Java agent?Note that the stacktrace seems to originate from logging libraries even though we don't use OTEL for logs (
OTEL_LOGS_EXPORTER=none).Steps to reproduce
None yet, I can provide a MRE later if needed.
Expected behavior
No error at startup
Actual behavior
Errors at startup
Javaagent or library instrumentation version
2.23.0
Environment
JDK: 25.0.1
OS: Linux
Additional context
No response
Tip
React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding
+1orme too, to help us triage it. Learn more here.