aboutsummaryrefslogblamecommitdiff
path: root/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala
blob: 866476db9fb70ca60867d4d16e89b41fb590dc41 (plain) (tree)
1
2
3
4
5
6
7
8
9




                                                                                           
                                            


                     
                                                                                   




                                                                                              
                                                                                                 


                                                        
                                                                                                  








                                                                                                     
                                      


     
package xyz.driver.core
package rest
package headers

import akka.http.scaladsl.model.headers.{ModeledCustomHeader, ModeledCustomHeaderCompanion}
import xyz.driver.core.reporting.SpanContext

import scala.util.Try

/** Encapsulates a trace context in an HTTP header for propagation across services.
  *
  * This implementation corresponds to the W3C editor's draft specification (as of 2018-08-28)
  * https://w3c.github.io/distributed-tracing/report-trace-context.html. The 'flags' field is
  * ignored.
  */
final case class Traceparent(spanContext: SpanContext) extends ModeledCustomHeader[Traceparent] {
  override def renderInRequests            = true
  override def renderInResponses           = true
  override val companion: Traceparent.type = Traceparent
  override def value: String               = f"01-${spanContext.traceId}-${spanContext.spanId}-00"
}
object Traceparent extends ModeledCustomHeaderCompanion[Traceparent] {
  override val name = "traceparent"
  override def parse(value: String) = Try {
    val Array(version, traceId, spanId, _) = value.split("-")
    require(
      version == "01",
      s"Found unsupported version '$version' in traceparent header. Only version '01' is supported.")
    new Traceparent(
      new SpanContext(traceId, spanId)
    )
  }
}