Skip to content

"IllegalArgumentException: Unrecognized AnyValue type" when LogRecord.body equal to empty string #2530

@dshkil

Description

@dshkil

Component(s)

disk-buffering

What happened?

Description

LogRecord with a body equal to an empty string cannot be mapped to an SDK value. It happens in the background and causes the following unhandled exception.

java.lang.IllegalArgumentException: Unrecognized AnyValue type
	at io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.logs.LogRecordDataMapper.anyValueToBody(LogRecordDataMapper.java:139)
	at io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.logs.LogRecordDataMapper.mapToSdk(LogRecordDataMapper.java:81)
	at io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.logs.ProtoLogsDataMapper.protoToSignalItem(ProtoLogsDataMapper.java:38)
	at io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.logs.ProtoLogsDataMapper.protoToSignalItem(ProtoLogsDataMapper.java:20)
	at io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.common.BaseProtoSignalsDataMapper.fromProto(BaseProtoSignalsDataMapper.java:59)
	at io.opentelemetry.contrib.disk.buffering.internal.serialization.deserializers.LogRecordDataDeserializer.deserialize(LogRecordDataDeserializer.java:27)
	at io.opentelemetry.contrib.disk.buffering.internal.storage.Storage.doReadNext(Storage.java:123)
	at io.opentelemetry.contrib.disk.buffering.internal.storage.Storage.readNext(Storage.java:94)
	at io.opentelemetry.contrib.disk.buffering.internal.storage.StorageIterator.findNext(StorageIterator.java:80)
	at io.opentelemetry.contrib.disk.buffering.internal.storage.StorageIterator.hasNext(StorageIterator.java:41)
	at io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter.export(SignalFromDiskExporter.kt:73)
	at io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter.exportBatchOfLogs(SignalFromDiskExporter.kt:65)
	at io.opentelemetry.android.features.diskbuffering.SignalFromDiskExporter.exportBatchOfEach(SignalFromDiskExporter.kt:96)
	at io.opentelemetry.android.features.diskbuffering.scheduler.DefaultExportScheduler.onRun(DefaultExportScheduler.kt:31)
	at io.opentelemetry.android.internal.services.periodicwork.PeriodicRunnable.run(PeriodicRunnable.kt:24)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)

Steps to Reproduce

Our app emits log records using Kotlin code like:

        openTelemetry.logsBridge.get("applicationName")
            .logRecordBuilder()
            .setSeverity(severity)
            ....
            .setBody("") // Empty String
            .emit()

LogRecord is stored to the storage file.

Expected Result

On periodic background export, all log records are properly read from the storage file and submitted.

Actual Result

AnyValue deserialized using protobuf cannot be mapped to the SDK's Value. It causes the unhandled exception.

Component version

1.52.0

Log output

No response

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

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions