caliban icon indicating copy to clipboard operation
caliban copied to clipboard

Provide a way to extract span parent from request headers in caliban-tracing

Open jeejeeone opened this issue 2 years ago • 0 comments

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)
      }
  }

jeejeeone avatar Apr 03 '23 09:04 jeejeeone