diff --git a/examples/src/main/scala/TracingExample.scala b/examples/src/main/scala/TracingExample.scala index 545091c00..a8e8bac5b 100644 --- a/examples/src/main/scala/TracingExample.scala +++ b/examples/src/main/scala/TracingExample.scala @@ -20,7 +20,6 @@ import cats.effect.MonadCancelThrow import cats.effect.Resource import cats.effect.std.Console import cats.syntax.all._ -import fs2.Stream import io.opentelemetry.api.GlobalOpenTelemetry import org.typelevel.otel4s.Attribute import org.typelevel.otel4s.java.OtelJava @@ -55,24 +54,23 @@ object TracingExample extends IOApp.Simple { .evalMap(OtelJava.forSync[IO]) .evalMap(_.tracerProvider.tracer("Example").get) - def run: IO[Unit] = { + def run: IO[Unit] = tracerResource.use { implicit tracer: Tracer[IO] => - val resource: Resource[IO, Unit] = - Resource.make(IO.sleep(50.millis))(_ => IO.sleep(100.millis)) - - def stream(name: String) = - Stream - .resource(tracer.spanBuilder(name).start >> resource) - .flatMap(_ => Stream(1, 2, 3)) - .evalMap(Work[IO].doWork) - tracer - .span("root") + .span("outer") .surround( - (stream("uninterrupted") ++ stream( - "interrupted" - ).interruptScope).compile.drain + IO.both( + tracer + .span("left") + .surround( + tracer.span("left-worker").use_.replicateA(10) + ), + tracer + .span("right") + .surround( + tracer.span("right-worker").use_.replicateA(10) + ) + ) ) - } - } + }.void } diff --git a/java/trace/src/main/scala/org/typelevel/otel4s/java/trace/TraceScope.scala b/java/trace/src/main/scala/org/typelevel/otel4s/java/trace/TraceScope.scala index f20db5bbf..b6094fe6d 100644 --- a/java/trace/src/main/scala/org/typelevel/otel4s/java/trace/TraceScope.scala +++ b/java/trace/src/main/scala/org/typelevel/otel4s/java/trace/TraceScope.scala @@ -21,8 +21,7 @@ import cats.effect.LiftIO import cats.effect.Ref import cats.effect.Resource import cats.effect.Sync -import cats.syntax.flatMap._ -import cats.syntax.functor._ +import cats.syntax.all._ import io.opentelemetry.api.trace.{Span => JSpan} import io.opentelemetry.context.{Context => JContext} import org.typelevel.otel4s.trace.SpanContext @@ -84,12 +83,21 @@ private[java] object TraceScope { def noopScope: Resource[F, Unit] = createScope(Scope.Noop) - private def createScope(scope: Scope): Resource[F, Unit] = - Resource - .make(local.get.to[F].flatMap(_.getAndSet(scope)))(p => - local.get.to[F].flatMap(_.set(p)) - ) - .void + private def createScope(scope: Scope): Resource[F, Unit] = { + val acquire = + local.get.to[F].product(Ref.of[F, Scope](scopeRoot)).flatTap { + case (_, nextRef) => + local.set(nextRef).to[F] + } + def release(oldRef: (Ref[F, Scope], Any)): F[Unit] = + local.set(oldRef._1).to[F] + Resource.make(acquire)(release) >> + Resource + .make(local.get.to[F].flatMap(_.getAndSet(scope)))(p => + local.get.to[F].flatMap(_.set(p)) + ) + .void + } private def nextScope(scope: Scope, span: JSpan): Scope = scope match {