spring-boothyperledger-fabricopen-telemetryhyperledger-fabric-sdk-java

OpenTelemetry version conflict in Spring Boot 3.1.3 with Hyperledger Fabric Gateway Java 2.2.8 (using gradle)


I need to include OpenTelemetry in a Spring Boot 3.1.3 project as it is required by Hyperledger Fabric Gateway 2.2.8 Looks like I am getting version conflicts between OpenTelemetry 1.29.0 and 1.25.0 as shown by "gradle -q dependencies" command:

|    |    +--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0
|    |    |    \--- io.opentelemetry:opentelemetry-context:1.25.0
|    |    +--- io.opentelemetry:opentelemetry-sdk:1.29.0 -> 1.25.0
|    |    |    +--- io.opentelemetry:opentelemetry-api:1.25.0 (*)
|    |    |    +--- io.opentelemetry:opentelemetry-sdk-common:1.25.0
|    |    |    |    \--- io.opentelemetry:opentelemetry-api:1.25.0 (*)
|    |    |    +--- io.opentelemetry:opentelemetry-sdk-trace:1.25.0
|    |    |    |    +--- io.opentelemetry:opentelemetry-api:1.25.0 (*)
|    |    |    |    \--- io.opentelemetry:opentelemetry-sdk-common:1.25.0 (*)
|    |    |    \--- io.opentelemetry:opentelemetry-sdk-metrics:1.25.0 -> 1.29.0
|    |    |         +--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*)
|    |    |         \--- io.opentelemetry:opentelemetry-sdk-common:1.29.0 -> 1.25.0 (*)
|    |    +--- io.opentelemetry:opentelemetry-sdk-trace:1.29.0 -> 1.25.0 (*)
|    |    +--- io.opentelemetry:opentelemetry-exporter-otlp:1.29.0
|    |    |    +--- io.opentelemetry:opentelemetry-sdk-trace:1.29.0 -> 1.25.0 (*)
|    |    |    +--- io.opentelemetry:opentelemetry-sdk-metrics:1.29.0 (*)
|    |    |    \--- io.opentelemetry:opentelemetry-sdk-logs:1.29.0
|    |    |         +--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*)
|    |    |         \--- io.opentelemetry:opentelemetry-sdk-common:1.29.0 -> 1.25.0 (*)
|    |    +--- io.opentelemetry:opentelemetry-extension-trace-propagators:1.29.0 -> 1.25.0
|    |    |    \--- io.opentelemetry:opentelemetry-api:1.25.0 (*)
|    |    +--- io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.29.0
|    |    |    +--- io.opentelemetry:opentelemetry-sdk:1.29.0 -> 1.25.0 (*)
|    |    |    \--- io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.29.0 -> 1.25.0
|    |    |         \--- io.opentelemetry:opentelemetry-sdk:1.25.0 (*)
|    |    +--- io.opentelemetry.instrumentation:opentelemetry-grpc-1.6:1.29.0-alpha
|    |    |    +--- io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.29.0
|    |    |    |    \--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*)
|    |    |    +--- io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv:1.29.0-alpha
|    |    |    |    +--- io.opentelemetry:opentelemetry-semconv:1.29.0-alpha
|    |    |    |    |    \--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*)
|    |    |    |    \--- io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.29.0 (*)
|    |    |    \--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*)
|    |    \--- io.opentelemetry.proto:opentelemetry-proto:1.0.0-alpha
|    |         \--- com.google.protobuf:protobuf-java:3.23.4

My dependencies in build.gradle:

//  implementation(platform("io.opentelemetry:opentelemetry-bom:1.25.0"))
//  implementation platform('io.opentelemetry:opentelemetry-bom-alpha:1.25.0-alpha')
    implementation("io.opentelemetry:opentelemetry-api")
    implementation('io.opentelemetry:opentelemetry-semconv')
    implementation('io.opentelemetry:opentelemetry-sdk-extension-autoconfigure')
    implementation 'io.opentelemetry:opentelemetry-api-logs:1.25.0-alpha'
    implementation 'io.opentelemetry:opentelemetry-sdk-metrics:1.29.0'
//  implementation 'io.opentelemetry:opentelemetry-exporters-otlp:0.9.1'
    implementation 'io.opentelemetry:opentelemetry-exporter-otlp:1.29.0'
    runtimeOnly 'io.opentelemetry:opentelemetry-exporter-otlp-common:1.29.0'

and I end up having this conflict when building the project:

java.lang.IllegalAccessError: class io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder tried to access method 'void io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder.<init>(java.lang.String, java.lang.String, long, java.net.URI, java.util.function.Supplier, java.lang.String)' (io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder and io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder are in unnamed module of loader 'app')

Any idea how I can solve the issue?


Solution

  • Assuming that you're using the io.spring.dependency-management plugin in your project, Spring Boot will be automatically applying its dependency management. This dependency management covers Open Telemetry through version 1.25.0 of opentelemetry-bom. By specifying versions for some but not all of your OpenTelemetry dependencies, you are overriding some but not all of Spring Boot's dependency management. This is leaving your project with an incompatible mixture of versions.

    In the first instance, I would try removing the versions from all of your OpenTelemetry dependencies, relying on Spring Boot's dependency management instead. This should ensure that all OpenTelemetry dependencies are compatible with the version of Spring Boot that you're using.

    If removing the versions does not work and you need to use OpenTelemetry 1.29.0, you can override the OpenTelemetry version in your build.gradle:

    ext {
        set("opentelemetry.version", "1.29.0")
    }
    

    Unfortunately, this isn't guaranteed to work as there may have been breaking changes in OpenTelemetry between 1.25 and 1.29 that make it incompatible with Spring Boot 3.1. You'll have to try it and see.