Skip to content

GlobalOpenTelemetry.get and set Conflict Causing Runtime Exception in OpenTelemetry SDK #6937

Open
@celikrecep

Description

@celikrecep

Hello, I am using OpenTelemetry version 1.44.0 in my Android project. On Crashlytics, I see the following error: "GlobalOpenTelemetry.set". This error doesn’t happen all the time but occurs for some users. The root cause of the error is as follows:

io.opentelemetry.api.GlobalOpenTelemetry.set (GlobalOpenTelemetry.java:115)
io.opentelemetry.api.GlobalOpenTelemetry.get (GlobalOpenTelemetry.java:85)
io.opentelemetry.api.GlobalOpenTelemetry.getMeterProvider (GlobalOpenTelemetry.java:174)
io.opentelemetry.exporter.internal.ExporterMetrics.meter (ExporterMetrics.java:91)
io.opentelemetry.exporter.internal.ExporterMetrics.seen (ExporterMetrics.java:74)
io.opentelemetry.exporter.internal.ExporterMetrics.addSeen (ExporterMetrics.java:58)
io.opentelemetry.exporter.internal.http.HttpExporter.export (HttpExporter.java:58)
io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter.export (OtlpHttpLogRecordExporter.java:102)
io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor$Worker.exportCurrentBatch (BatchLogRecordProcessor.java:321)
io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor$Worker.run (BatchLogRecordProcessor.java:238)
java.lang.Thread.run (Thread.java:929)

Prior to this, the stack trace points to the Dagger module where I provide OpenTelemetry, as follows:

io.opentelemetry.sdk.OpenTelemetrySdkBuilder.buildAndRegisterGlobal (OpenTelemetrySdkBuilder.java:85)

I provide OpenTelemetry using Dagger Hilt with the following code:

OpenTelemetrySdk.builder()
    .apply { contextPropagators.ifPresent { setPropagators(it) } }
    .apply { tracerProvider.ifPresent { setTracerProvider(it) } }
    .apply { sdkLoggerProvider.ifPresent { setLoggerProvider(it) } }
    .apply { sdkMeterProvider.ifPresent { setMeterProvider(it) } }
    .buildAndRegisterGlobal()

Afterward, I perform all operations through this OpenTelemetry instance without calling the set method again.

When I follow the stack trace, the issue seems to occur because the get() method calls set() since GlobalOpenTelemetry is null. However, within the set() method, an exception is thrown because GlobalOpenTelemetry is not null.

Despite trying various approaches, I have been unable to reproduce this error. Could you please help me with this issue?

Artifacts: (opentelemetry-bom, opentelemetry-sdk, opentelemetry-api, opentelemetry-exporter-otlp, opentelemetry-exporter-logging, opentelemetry-exporter-otlp-common)

Version: (1.44.0)

How did you reference these artifacts?
build.gradle

Note: I’m not sure if it matters, but when using version 1.40.0, this error occurred very rarely—maybe once a week at most for users.

Please also share if you have any suggestion regarding how to initialize OpenTelemetry before any of the GlobalOpenTelemetry APIs get invoked automatically by the SDK?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions