caliban
caliban copied to clipboard
Provide a way to extract span parent from request headers in caliban-tracing
Provide a way to extract span parent from request headers in caliban-tracing. This will enable (easy) tracing across different microservices etc using caliban-tracing. I'm unsure what request headers should be injected into tracing context. Possibly it would be user defined? Maybe some default implementation can be provided for some specification like B3?
Some quick poc of a RequestInterceptor:
case class TracingContextInterceptor(spanName: String, includeHeaders: Set[String])
extends RequestInterceptor[Tracing] {
override def apply[R <: Tracing, A](request: ServerRequest)(e: ZIO[R, TapirResponse, A]): ZIO[R, TapirResponse, A] =
ZIO.serviceWithZIO[Tracing] { tracing =>
val headers = request.headers
.map(header => header.name -> header.value)
.toMap
.collect {
case (k, v) if includeHeaders.contains(k) => (k, v)
}
.toSeq
val carrier: mutable.Map[String, String] = mutable.Map(headers: _*)
tracing.extractSpan(
TraceContextPropagator.default,
IncomingContextCarrier.default(carrier),
spanName
)(e)
}
}