io.janstenpickle.trace4cats.http4s.server.Http4sResourceKleislis.scala Maven / Gradle / Ivy
package io.janstenpickle.trace4cats.http4s.server
import cats.{Applicative, Monad}
import cats.data.Kleisli
import cats.effect.Resource
import io.janstenpickle.trace4cats.Span
import io.janstenpickle.trace4cats.http4s.common.{Http4sHeaders, Http4sRequestFilter, Http4sSpanNamer, Request_}
import io.janstenpickle.trace4cats.inject.{ResourceKleisli, SpanParams}
import io.janstenpickle.trace4cats.model.SpanKind
object Http4sResourceKleislis {
def fromHeadersContext[F[_]: Monad, Ctx](
makeContext: (Request_, Span[F]) => F[Ctx],
spanNamer: Http4sSpanNamer = Http4sSpanNamer.methodWithPath,
requestFilter: Http4sRequestFilter = Http4sRequestFilter.allowAll
)(k: ResourceKleisli[F, SpanParams, Span[F]]): ResourceKleisli[F, Request_, Ctx] =
fromHeaders[F](spanNamer, requestFilter)(k).tapWithF { (req, span) =>
Resource.liftF(makeContext(req, span))
}
def fromHeaders[F[_]: Applicative](
spanNamer: Http4sSpanNamer = Http4sSpanNamer.methodWithPath,
requestFilter: Http4sRequestFilter = Http4sRequestFilter.allowAll,
)(k: ResourceKleisli[F, SpanParams, Span[F]]): ResourceKleisli[F, Request_, Span[F]] =
Kleisli { req =>
val filter = requestFilter.lift(req).getOrElse(true)
val headers = Http4sHeaders.converter.from(req.headers)
if (filter) k.run((spanNamer(req), SpanKind.Server, headers)) else Span.noop[F]
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy