Skip to content

Unexpected call to beginMessage() in ByteArrayProtoReader32 when exporting logs from disk #840

@ploszczyca-spoton

Description

@ploszczyca-spoton

Description

I encountered a java.lang.IllegalStateException: Unexpected call to beginMessage() exception when OpenTelemetry's disk buffering feature attempted to export stored log batches. The issue appears to occur while deserializing log data, specifically within ByteArrayProtoReader32 and the ProtoAdapter.decode() method.

Stack Trace

Fatal Exception: java.lang.IllegalStateException: Unexpected call to beginMessage()
       at com.squareup.wire.ByteArrayProtoReader32.beginMessage(ByteArrayProtoReader32.kt:57)
       at com.squareup.wire.ProtoReader32AsProtoReader.beginMessage(ProtoReader32AsProtoReader.kt:1)
       at io.opentelemetry.diskbuffering.proto.common.v1.AnyValue$ProtoAdapter_AnyValue.decode(AnyValue.java:1)
       at io.opentelemetry.diskbuffering.proto.common.v1.AnyValue$ProtoAdapter_AnyValue.decode(AnyValue.java:2)
       at io.opentelemetry.diskbuffering.proto.common.v1.KeyValue$ProtoAdapter_KeyValue.decode(KeyValue.java:1)
       at io.opentelemetry.diskbuffering.proto.common.v1.KeyValue$ProtoAdapter_KeyValue.decode(KeyValue.java:2)
       at io.opentelemetry.diskbuffering.proto.logs.v1.LogRecord$ProtoAdapter_LogRecord.decode(LogRecord.java:1)
       at io.opentelemetry.diskbuffering.proto.logs.v1.LogRecord$ProtoAdapter_LogRecord.decode(LogRecord.java:2)
       at io.opentelemetry.diskbuffering.proto.logs.v1.ScopeLogs$ProtoAdapter_ScopeLogs.decode(ScopeLogs.java:1)
       at io.opentelemetry.diskbuffering.proto.logs.v1.ScopeLogs$ProtoAdapter_ScopeLogs.decode(ScopeLogs.java:2)
       at io.opentelemetry.diskbuffering.proto.logs.v1.ResourceLogs$ProtoAdapter_ResourceLogs.decode(ResourceLogs.java:1)
       at io.opentelemetry.diskbuffering.proto.logs.v1.ResourceLogs$ProtoAdapter_ResourceLogs.decode(ResourceLogs.java:2)
       at io.opentelemetry.diskbuffering.proto.logs.v1.LogsData$ProtoAdapter_LogsData.decode(LogsData.java:1)
       at io.opentelemetry.diskbuffering.proto.logs.v1.LogsData$ProtoAdapter_LogsData.decode(LogsData.java:2)
       at com.squareup.wire.ProtoAdapter.decode(ProtoAdapter.kt:2)
       at com.squareup.wire.ProtoAdapter.decode(ProtoAdapter.kt:16)
       at io.opentelemetry.contrib.disk.buffering.internal.serialization.deserializers.LogRecordDataDeserializer.deserialize(LogRecordDataDeserializer.java:6)
       at io.opentelemetry.contrib.disk.buffering.internal.exporter.FromDiskExporterImpl.lambda$exportStoredBatch$0(FromDiskExporterImpl.java:43)
       at io.opentelemetry.contrib.disk.buffering.internal.storage.files.ReadableFile.readAndProcess(ReadableFile.java:45)
       at io.opentelemetry.contrib.disk.buffering.internal.storage.Storage.readAndProcess(Storage.java:2)
       at io.opentelemetry.contrib.disk.buffering.internal.storage.Storage.readAndProcess(Storage.java:1)
       at io.opentelemetry.contrib.disk.buffering.internal.exporter.FromDiskExporterImpl.exportStoredBatch(FromDiskExporterImpl.java:37)
       at io.opentelemetry.contrib.disk.buffering.LogRecordFromDiskExporter.exportStoredBatch(LogRecordFromDiskExporter.java:2)
       at io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter.exportBatchOfLogs(SignalFromDiskExporter.kt:8)
       at io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter.exportBatchOfEach(SignalFromDiskExporter.kt:12)
       at io.opentelemetry.android.features.diskbuffering.scheduler.DefaultExportScheduler.onRun(DefaultExportScheduler.kt:9)
       at io.opentelemetry.android.internal.services.periodicwork.PeriodicRunnable.run(PeriodicRunnable.kt:6)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at java.lang.Thread.run(Thread.java:919)
        

Steps to Reproduce:

  1. Enable disk buffering in OpenTelemetry Android SDK.
        val diskBufferingConfig = DiskBufferingConfiguration.builder()
            .setEnabled(true)
            .build()
  1. Generate log events and store them on disk.
  2. Wait for the log export process to trigger.
  3. Observe the crash when logs are being read and deserialized.

Versions:

  • opentelemetry-android: 0.8.0-alpha
  • Android OS: 10

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds author feedbackWaiting for additional feedback from the authorstale

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions