MalformedInputException when /proc/self/mountinfo is not UTF-8 encoded #12418
Open
Description
Describe the bug
Running the OpenTelemetry Java Agent on a system that does not use the standard UTF-8 encoding causes a MalformedInputException.
Steps to reproduce
- Create the file
/proc/self/mountinfo
with a non-UTF-8 compatible character encoding. - Run the Java agent, e.g.:
java -javaagent:/tmp/opentelemetry-javaagent-2.8.0.jar -Dotel.service.name=myApp-jar myApp.jar
Expected behavior
The /proc/self/mountinfo
file should be read in the default system charset without causing an exception.
Actual behavior
The /proc/self/mountinfo
file is read in UTF-8.
[otel.javaagent 2024-10-09 09:59:01:490 +0100] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 2.8.0
OpenTelemetry Javaagent failed to start
java.lang.ExceptionInInitializerError
at java.base/java.lang.J9VMInternals.ensureError(J9VMInternals.java:206)
at java.base/java.lang.J9VMInternals.recordInitializationFailure(J9VMInternals.java:195)
at io.opentelemetry.instrumentation.resources.ContainerResourceProvider.createResource(ContainerResourceProvider.java:18)
at io.opentelemetry.sdk.autoconfigure.ResourceConfiguration.configureResource(ResourceConfiguration.java:106)
at io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder.build(AutoConfiguredOpenTelemetrySdkBuilder.java:439)
at io.opentelemetry.javaagent.tooling.OpenTelemetryInstaller.installOpenTelemetrySdk(OpenTelemetryInstaller.java:29)
at io.opentelemetry.javaagent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:122)
at io.opentelemetry.javaagent.tooling.AgentInstaller.installBytebuddyAgent(AgentInstaller.java:102)
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.premain(OpenTelemetryAgent.java:45)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:575)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:491)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:503)
Caused by: java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1
at java.base/java.io.BufferedReader$1.hasNext(BufferedReader.java:574)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:132)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:522)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:512)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:239)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at io.opentelemetry.instrumentation.resources.ContainerResource$Filesystem.lineList(ContainerResource.java:85)
at io.opentelemetry.instrumentation.resources.CgroupV2ContainerIdExtractor.extractContainerId(CgroupV2ContainerIdExtractor.java:51)
at io.opentelemetry.instrumentation.resources.ContainerResource.getContainerId(ContainerResource.java:63)
at io.opentelemetry.instrumentation.resources.ContainerResource.buildResource(ContainerResource.java:53)
at io.opentelemetry.instrumentation.resources.ContainerResource.buildSingleton(ContainerResource.java:34)
at io.opentelemetry.instrumentation.resources.ContainerResource.<clinit>(ContainerResource.java:30)
... 19 more
Caused by: java.nio.charset.MalformedInputException: Input length = 1
at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:370)
at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:212)
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:194)
at java.base/java.io.BufferedReader.fill(BufferedReader.java:162)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:329)
at java.base/java.io.BufferedReader.readLine(BufferedReader.java:396)
at java.base/java.io.BufferedReader$1.hasNext(BufferedReader.java:571)
... 32 more
Javaagent or library instrumentation version
2.8.0
Environment
JDK: IBM Semeru Runtime Certified Edition for z/OS 17.0.12.1 (build 17.0.12+7)
OS: z/OS 02.05.00
Additional context
The root cause appears to be that Files.lines(Path)
is equivalent to Files.lines(path, StandardCharsets.UTF_8)
.
Switching this to Files.lines(path, Charset.defaultCharset())
in ContainerResource
gets me past this issue. Will raise a PR shortly.