Skip to content

Commit

Permalink
Upgrade, Additional Tags
Browse files Browse the repository at this point in the history
  • Loading branch information
ChristopherDavenport committed Apr 19, 2022
1 parent ad2612b commit e178453
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 13 deletions.
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ val catsV = "2.7.0"
val catsEffectV = "3.3.11"
val fs2V = "3.2.7"
val http4sV = "0.23.7"
val natchezV = "0.1.4"
val natchezV = "0.1.6"
val munitCatsEffectV = "1.0.7"

val slf4jV = "1.7.30"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ object ClientMiddleware {
ep: EntryPoint[F], // This is to escape from F Trace to Resource[F, *] timing. Which is critical
reqHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
respHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
clientSpanName: Request[F] => String = {(req: Request[F]) => s"Http Client - ${req.method}"}
clientSpanName: Request[F] => String = {(req: Request[F]) => s"Http Client - ${req.method}"},
additionalRequestTags: Request[F] => Seq[(String, TraceValue)] = {(_: Request[F]) => Seq()},
additionalResponseTags: Response[F] => Seq[(String, TraceValue)] = {(_: Response[F]) => Seq()},
)(client: Client[F]): Client[F] =
Client[F]{(req: Request[F]) =>
val base = request(req, reqHeaders)
val base = request(req, reqHeaders) ++ additionalRequestTags(req)
MonadCancelThrow[Resource[F, *]].uncancelable(poll =>
for {
baggage <- Resource.eval(Trace[F].kernel)
Expand All @@ -34,15 +36,14 @@ object ClientMiddleware {
Resource.eval(span.put("exit.case" -> "succeeded")) >>
fa.flatMap(resp =>
Resource.eval(
span.put(response(resp, respHeaders):_*)
span.put((response(resp, respHeaders) ++ additionalResponseTags(resp)):_*)
)
)
case Outcome.Errored(e) =>
val exitCase: (String, TraceValue) = ("exit.case" -> TraceValue.stringToTraceValue("errored"))
val error = OTHttpTags.Errors.error(e)
Resource.eval(
span.put(exitCase) >>
span.put(error:_*)
span.put((exitCase :: error):_*)
)
case Outcome.Canceled() =>
// Canceled isn't always an error, but it generally is for http
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,29 @@ object ServerMiddleware {
ep: EntryPoint[F],
isKernelHeader: CIString => Boolean = name => !ExcludedHeaders.contains(name),
reqHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
respHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded
respHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
routeClassifier: Request[F] => Option[String] = {(_: Request[F]) => None},
serverSpanName: Request[F] => String = {(req: Request[F]) => s"Http Server - ${req.method}"},
additionalRequestTags: Request[F] => Seq[(String, TraceValue)] = {(_: Request[F]) => Seq()},
additionalResponseTags: Response[F] => Seq[(String, TraceValue)] = {(_: Response[F]) => Seq()},
)(f: Trace[F] => HttpApp[F]): HttpApp[F] =
MakeSureYouKnowWhatYouAreDoing.tracedF(ep, FunctionK.id[F], isKernelHeader, reqHeaders, respHeaders)(f.andThen(_.pure[F]))
MakeSureYouKnowWhatYouAreDoing.tracedF(ep, FunctionK.id[F], isKernelHeader, reqHeaders, respHeaders,
routeClassifier, serverSpanName, additionalRequestTags, additionalResponseTags
)(f.andThen(_.pure[F]))

def httpRoutes[F[_]: MonadCancelThrow: GenFiberLocal](
ep: EntryPoint[F],
isKernelHeader: CIString => Boolean = name => !ExcludedHeaders.contains(name),
reqHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
respHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded
respHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
routeClassifier: Request[F] => Option[String] = {(_: Request[F]) => None},
serverSpanName: Request[F] => String = {(req: Request[F]) => s"Http Server - ${req.method}"},
additionalRequestTags: Request[F] => Seq[(String, TraceValue)] = {(_: Request[F]) => Seq()},
additionalResponseTags: Response[F] => Seq[(String, TraceValue)] = {(_: Response[F]) => Seq()},
)(f: Trace[F] => HttpRoutes[F]): HttpRoutes[F] =
MakeSureYouKnowWhatYouAreDoing.tracedF(ep, OptionT.liftK, isKernelHeader, reqHeaders, respHeaders)(f.andThen(_.pure[OptionT[F, *]]))
MakeSureYouKnowWhatYouAreDoing.tracedF(ep, OptionT.liftK, isKernelHeader, reqHeaders, respHeaders,
routeClassifier, serverSpanName, additionalRequestTags, additionalResponseTags
)(f.andThen(_.pure[OptionT[F, *]]))

object MakeSureYouKnowWhatYouAreDoing {
// This effect to generate routes will run on every request.
Expand All @@ -46,7 +58,9 @@ object ServerMiddleware {
reqHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
respHeaders: Set[CIString] = OTHttpTags.Headers.defaultHeadersIncluded,
routeClassifier: Request[F] => Option[String] = {(_: Request[F]) => None},
serverSpanName: Request[F] => String = {(req: Request[F]) => s"Http Server - ${req.method}"}
serverSpanName: Request[F] => String = {(req: Request[F]) => s"Http Server - ${req.method}"},
additionalRequestTags: Request[F] => Seq[(String, TraceValue)] = {(_: Request[F]) => Seq()},
additionalResponseTags: Response[F] => Seq[(String, TraceValue)] = {(_: Response[F]) => Seq()},
)(
f: Trace[F] => G[Http[G, F]]
): Http[G, F] = cats.data.Kleisli{(req: Request[F]) =>
Expand All @@ -60,15 +74,15 @@ object ServerMiddleware {

MonadCancelThrow[G].uncancelable(poll =>
ep.continueOrElseRoot(serverSpanName(req), kernel).mapK(fk).use{span =>
val init = request(req, reqHeaders, routeClassifier)
val init = request(req, reqHeaders, routeClassifier) ++ additionalRequestTags(req)
fk(span.put(init:_*)) >>
fk(GenFiberLocal[F].local(span)).map(fromFiberLocal(_))
.flatMap( trace =>
poll(f(trace).flatMap(_.run(req))).guaranteeCase{
case Outcome.Succeeded(fa) =>
fk(span.put("exit.case" -> "succeeded")) >>
fa.flatMap{resp =>
val out = response(resp, respHeaders)
val out = response(resp, respHeaders) ++ additionalResponseTags(resp)
fk(span.put(out:_*))
}
case Outcome.Errored(e) =>
Expand Down

0 comments on commit e178453

Please sign in to comment.