aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala
blob: 9d470ad08917a8c343d40423302b38150d17249e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package xyz.driver.core
package rest
package headers

import akka.http.scaladsl.model.headers.{ModeledCustomHeader, ModeledCustomHeaderCompanion}

import scala.util.Try

/** Encapsulates 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(traceId: String, spanId: String) extends ModeledCustomHeader[Traceparent] {
  override def renderInRequests            = true
  override def renderInResponses           = true
  override val companion: Traceparent.type = Traceparent
  override def value: String               = f"01-$traceId-$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(
      traceId,
      spanId
    )
  }
}