aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-10-04 13:50:10 -0700
committerJakob Odersky <jakob@driver.xyz>2017-10-04 13:50:10 -0700
commit87182fa750f65ac57c78c42507645b94a4541385 (patch)
tree26283c84375a0f9e6d65ebbc09afe567930333db
parent2bee42177529fee5d03a5696b7a5912ca21fe5a3 (diff)
downloadtracing-87182fa750f65ac57c78c42507645b94a4541385.tar.gz
tracing-87182fa750f65ac57c78c42507645b94a4541385.tar.bz2
tracing-87182fa750f65ac57c78c42507645b94a4541385.zip
Remove tracing context; use plain http headers
-rw-r--r--src/main/scala/TracingDirectives.scala92
1 files changed, 32 insertions, 60 deletions
diff --git a/src/main/scala/TracingDirectives.scala b/src/main/scala/TracingDirectives.scala
index 6dd0b09..2c02571 100644
--- a/src/main/scala/TracingDirectives.scala
+++ b/src/main/scala/TracingDirectives.scala
@@ -12,18 +12,26 @@ import scala.collection.immutable.Seq
trait TracingDirectives {
import TracingDirectives._
- def optionalTraceContext: Directive1[Option[TraceContext]] =
- extractRequest.map { req =>
- TraceContext.fromHeaders(req.headers)
+ def extractTraceHeaders: Directive1[Seq[HttpHeader]] =
+ extractRequest.map { request =>
+ request.headers.filter(h =>
+ h.name == TraceHeaderName || h.name == SpanHeaderName)
}
- def withTraceContext(ctx: TraceContext): Directive0 =
- mapRequest(req => req.withHeaders(ctx.headers))
-
def trace(tracer: Tracer,
name: String,
extraLabels: Map[String, String] = Map.empty): Directive0 =
extractRequest.flatMap { request =>
+ def getHeader(name: String): Option[String] =
+ request.headers.find(_.name == name).map(_.value)
+
+ // get existing trace or start a new one
+ val traceId = getHeader(TraceHeaderName)
+ .map(UUID.fromString)
+ .getOrElse(UUID.randomUUID())
+
+ val parentSpanId = getHeader(SpanHeaderName).map(UUID.fromString)
+
val labels = Map(
"/http/user_agent" -> "driver-tracer",
"/http/method" -> request.method.name,
@@ -31,64 +39,28 @@ trait TracingDirectives {
"/http/host" -> request.uri.authority.host.toString
) ++ extraLabels
- val span: Span = TraceContext.fromHeaders(request.headers) match {
- case None => // no parent span, create new trace
- Span(
- name = name,
- labels = labels
- )
- case Some(TraceContext(traceId, parentSpanId)) =>
- Span(
- name = name,
- traceId = traceId,
- parentSpanId = parentSpanId,
- labels = labels
- )
+ val span = Span(
+ name = name,
+ traceId = traceId,
+ parentSpanId = parentSpanId,
+ labels = labels
+ )
+
+ val childHeaders = Seq(
+ RawHeader(TraceHeaderName, span.traceId.toString),
+ RawHeader(SpanHeaderName, span.spanId.toString)
+ )
+
+ mapRequest(childRequest => childRequest.withHeaders(childHeaders)) & mapRouteResult {
+ result =>
+ tracer.submit(span.end())
+ result
}
-
- withTraceContext(TraceContext.fromSpan(span)) & mapRouteResult { res =>
- tracer.submit(span.end())
- res
- }
-
}
- /*
- def span2(name2: String, tracer: Tracer): Directive0 = {
- val f: RouteResult ⇒ RouteResult = ???
- Directive { inner ⇒ ctx ⇒
- inner(())(ctx).map(f)(ctx.executionContext)
- }
- }
- */
-
}
object TracingDirectives extends TracingDirectives {
-
- case class TraceContext(traceId: UUID, parentSpanId: Option[UUID]) {
- import TraceContext._
-
- def headers: Seq[HttpHeader] =
- Seq(RawHeader(TraceHeaderName, traceId.toString)) ++
- parentSpanId.toSeq.map(id => RawHeader(SpanHeaderName, id.toString))
- }
- object TraceContext {
- val TraceHeaderName = "Tracing-Trace-Id"
- val SpanHeaderName = "Tracing-Span-Id"
-
- def fromHeaders(headers: Seq[HttpHeader]): Option[TraceContext] = {
- val traceId = headers
- .find(_.name == TraceHeaderName)
- .map(_.value)
- .map(UUID.fromString)
- val parentSpanId =
- headers.find(_.name == SpanHeaderName).map(_.value).map(UUID.fromString)
- traceId.map { tid =>
- TraceContext(tid, parentSpanId)
- }
- }
- def fromSpan(span: Span) = TraceContext(span.traceId, Some(span.spanId))
- }
-
+ val TraceHeaderName = "Tracing-Trace-Id"
+ val SpanHeaderName = "Tracing-Span-Id"
}