Skip to content

Instantly share code, notes, and snippets.

@ccarlile
Created August 11, 2022 16:32
Show Gist options
  • Save ccarlile/e30aee4976c3664958f3ab61cc8ebd13 to your computer and use it in GitHub Desktop.
Save ccarlile/e30aee4976c3664958f3ab61cc8ebd13 to your computer and use it in GitHub Desktop.
Traced transactor for trace4cats
object V {
val Doobie = "1.0.0-RC2"
val NatchezExtras = "7.0.0-M4"
val Trace4Cats = "0.14.0"
}
val trace4catsNatchez = "io.janstenpickle" %% "trace4cats-natchez" % V.Trace4Cats
val natchezExtrasDoobie = "com.ovoenergy" %% "natchez-extras-doobie" % V.NatchezExtras
val doobie = "org.tpolecat" %% "doobie-core" % V.Doobie
libraryDependencies ++= Seq(trace4catsNatchez, natchezExtrasDoobie, doobie)
package io.github.ccarlile
import cats.effect.Async
import cats.data.Kleisli
import cats.~>
import cats.arrow.FunctionK
import natchez.{Span => NatchezSpan}
import doobie.Transactor
import trace4cats.{Span}
import trace4cats.kernel.ToHeaders
import com.ovoenergy.natchez.extras.doobie.{TracedTransactor => NatchezTracedTransactor}
import trace4cats.natchez.Trace4CatsSpan
object TracedTransactor {
type NatchezTraced[F[_], A] = Kleisli[F, NatchezSpan[F], A]
type Traced[F[_], A] = Kleisli[F, Span[F], A]
def apply[F[_]: Async](transactor: Transactor[F], appName: String): Transactor[Traced[F, *]] =
traceTransactor(traceNatchez[F](transactor, appName))
private def traceTransactor[F[_]: Async](
transactor: Transactor[NatchezTraced[F, *]]
): Transactor[Traced[F, *]] = transactor.mapK(convert[F])
private def convert[F[_]: Async]: NatchezTraced[F, *] ~> Traced[F, *] =
new FunctionK[NatchezTraced[F, *], Traced[F, *]] {
def apply[A](fa: Kleisli[F, NatchezSpan[F], A]): Kleisli[F, Span[F], A] = fa.local(convertSpan)
}
private def convertSpan[F[_]: Async]: Span[F] => NatchezSpan[F] = span => Trace4CatsSpan(span, ToHeaders.standard)
private def traceNatchez[F[_]: Async](
transactor: Transactor[F],
appName: String
): Transactor[NatchezTraced[F, *]] =
NatchezTracedTransactor[F](appName, transactor)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment