aboutsummaryrefslogtreecommitdiff
path: root/core-rest/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core-rest/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala')
-rw-r--r--core-rest/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala33
1 files changed, 33 insertions, 0 deletions
diff --git a/core-rest/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala b/core-rest/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala
new file mode 100644
index 0000000..866476d
--- /dev/null
+++ b/core-rest/src/main/scala/xyz/driver/core/rest/headers/Traceparent.scala
@@ -0,0 +1,33 @@
+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)
+ )
+ }
+}