Skip to content

Errors at startup in read-only filesystems environment #15666

@gaeljw

Description

@gaeljw

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds triageNew issue that requires triage

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions