Use the global OpenTelemetry instance

Use this page when OpenTelemetry is already configured outside otel4s, and you want to reuse that process-wide instance.

Common cases:

Prerequisites

1. Make sure the global SDK is configured elsewhere

OtelJava.global does not create or configure an SDK. It only reads the current global OpenTelemetry instance.

That instance might come from:

2. Read the global instance from otel4s

import cats.effect.{IO, IOApp}
import org.typelevel.otel4s.metrics.MeterProvider
import org.typelevel.otel4s.oteljava.OtelJava
import org.typelevel.otel4s.trace.TracerProvider

object Main extends IOApp.Simple {
  def run: IO[Unit] =
    OtelJava.global[IO].flatMap { otel4s =>
      program(otel4s.meterProvider, otel4s.tracerProvider)
    }

  def program(
      meterProvider: MeterProvider[IO],
      tracerProvider: TracerProvider[IO]
  ): IO[Unit] =
    for {
      meter <- meterProvider.get("auth-service")
      tracer <- tracerProvider.get("auth-service")

      counter <- meter.counter[Long]("service.requests").create
      _ <- counter.inc()

      _ <- tracer.span("startup").surround(IO.unit)
    } yield ()
}

3. Do not create a second SDK in the same application

If your process already has a configured global SDK, do not also call OtelJava.autoConfigured for the same application path.

Use:

What's next