Skip to content

Instantly share code, notes, and snippets.

@Fristi
Last active April 28, 2020 15:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fristi/6cdcba410956b5548895782d8e16e9df to your computer and use it in GitHub Desktop.
Save Fristi/6cdcba410956b5548895782d8e16e9df to your computer and use it in GitHub Desktop.
Improved zio-telemetry OpenTracing
package zio.telemetry.opentracing
import java.util.concurrent.TimeUnit
import io.opentracing.{Span, Tracer}
import zio.clock.Clock
import zio._
object OpenTracing2 {
type OT = Has[Service]
trait Service {
def tag(key: String, value: String): UIO[Unit]
def locally[R, A](name: String, zio: RIO[R, A]): RIO[R, A]
}
def layer(tracer: Tracer, defaultRoot: String = "ROOT"): ZManaged[Clock, Nothing, Service] = {
for {
clock <- Managed.fromEffect(ZIO.access[Clock](_.get))
span <- Managed.make(UIO(tracer.buildSpan(defaultRoot).start()))(s => UIO(s.finish()))
ref <- Managed.fromEffect(FiberRef.make(span))
} yield new Service {
private def now: UIO[Long] = clock.currentTime(TimeUnit.MICROSECONDS)
def tag(key: String, value: String): UIO[Unit] = ref.update(_.setTag(key, value))
def locally[R, A](name: String, zio: RIO[R, A]): RIO[R, A] = {
def child: Task[Span] = ref.get.flatMap(current => ZIO(tracer.buildSpan(name).asChildOf(current).start()))
ZIO.bracket(child)(c => now.flatMap(at => UIO(c.finish(at))))(span => ref.locally(span)(zio))
}
}
}
def tag(key: String, value: String): RIO[OT, Unit] = ZIO.accessM(_.get.tag(key, value))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment