From 50985bc8f889176d360d8ab1ce1d880bd4d9c766 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Wed, 4 Oct 2017 15:02:55 -0700 Subject: Update tests --- src/main/scala/LoggingTracer.scala | 7 ++-- src/main/scala/TracingDirectives.scala | 4 +-- src/test/scala/GoogleTracerSpec.scala | 51 +++++++++++++++++++++++++++ src/test/scala/TracingDirectivesSpec.scala | 55 +++++++++++++++++------------- 4 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 src/test/scala/GoogleTracerSpec.scala diff --git a/src/main/scala/LoggingTracer.scala b/src/main/scala/LoggingTracer.scala index b22d22a..a3ef307 100644 --- a/src/main/scala/LoggingTracer.scala +++ b/src/main/scala/LoggingTracer.scala @@ -3,15 +3,12 @@ package xyz.driver.tracing import java.util.UUID import java.time.{Instant, ZoneId} import java.time.format.DateTimeFormatter -import akka.event.LoggingAdapter import spray.json._ -class LoggingTracer(implicit logger: LoggingAdapter) extends Tracer { +class LoggingTracer(logger: String => Unit) extends Tracer { import LoggingTracer.JsonProtocol._ - override def submit(span: Span): Unit = logger.debug( - span.toJson.compactPrint - ) + override def submit(span: Span): Unit = logger(span.toJson.compactPrint) } object LoggingTracer { diff --git a/src/main/scala/TracingDirectives.scala b/src/main/scala/TracingDirectives.scala index 2c02571..a172808 100644 --- a/src/main/scala/TracingDirectives.scala +++ b/src/main/scala/TracingDirectives.scala @@ -19,7 +19,7 @@ trait TracingDirectives { } def trace(tracer: Tracer, - name: String, + name: Option[String] = None, extraLabels: Map[String, String] = Map.empty): Directive0 = extractRequest.flatMap { request => def getHeader(name: String): Option[String] = @@ -40,7 +40,7 @@ trait TracingDirectives { ) ++ extraLabels val span = Span( - name = name, + name = name.getOrElse(request.uri.path.toString), traceId = traceId, parentSpanId = parentSpanId, labels = labels diff --git a/src/test/scala/GoogleTracerSpec.scala b/src/test/scala/GoogleTracerSpec.scala new file mode 100644 index 0000000..fcdd73b --- /dev/null +++ b/src/test/scala/GoogleTracerSpec.scala @@ -0,0 +1,51 @@ +package xyz.driver.tracing + +import java.nio.file._ + +import akka.actor._ +import akka.stream._ +import akka.http.scaladsl.server.Directives._ +import akka.http.scaladsl.server._ +import akka.http.scaladsl.testkit.ScalatestRouteTest +import org.scalatest._ +import xyz.driver.tracing.TracingDirectives._ + +import scala.concurrent._ +import scala.concurrent.duration._ + +class GoogleTracerSpec extends FlatSpec { + + implicit val system = ActorSystem(this.getClass.getSimpleName) + import system.dispatcher + implicit val materializer = ActorMaterializer() + + "Google Tracer" should "submit" in { + val tracer = new GoogleTracer( + "driverinc-sandbox", + Paths.get( + system.settings.config.getString("tracing.google.service-account-file")) + ) + + // create 100 traces, each with 10 nested spans + for (_ <- 0 until 100) { + (0 until 10).foldLeft(Span(name = "trace-test.driver.xyz")) { + case (previous, i) => + val p: Span = previous + val span = Span( + name = s"trace-test.driver.xyz-$i", + traceId = previous.traceId, + parentSpanId = Some(previous.spanId) + ) + Thread.sleep(2) + val done = span.end() + tracer.submit(done) + done + } + } + + // TODO: automatically verify that traces were created on google stack driver + + Await.ready(tracer.close(), 30.seconds) + } + +} diff --git a/src/test/scala/TracingDirectivesSpec.scala b/src/test/scala/TracingDirectivesSpec.scala index 783f59b..61206c8 100644 --- a/src/test/scala/TracingDirectivesSpec.scala +++ b/src/test/scala/TracingDirectivesSpec.scala @@ -16,40 +16,49 @@ class TracingDirectivesSpec with BeforeAndAfterAll with ScalatestRouteTest { - def route(tracer: Tracer): Route = trace(tracer, "example.org") { - pathPrefix("1") { - trace(tracer, "test-sub-trace-1") { + class DummyTracer extends Tracer { + private var _spans: List[Span] = Nil + def spans = synchronized { _spans } + + override def submit(span: Span): Unit = synchronized { + _spans = span :: _spans + } + } + + def route(tracer: Tracer): Route = trace(tracer, Some("example.org")) { + trace(tracer, Some("trace-1-1")) { + Thread.sleep(2) + trace(tracer, Some("trace-1-2")) { Thread.sleep(2) - trace(tracer, "test-subsub-trace-1") { - Thread.sleep(2) - trace(tracer, "test-subsubsub-trace-1") { - Thread.sleep(10) - complete("ok") - } - } - } - } ~ - pathPrefix("2") { - trace(tracer, "test-sub-trace-2") { - Thread.sleep(20) + trace(tracer, Some("trace-1-3")) { + Thread.sleep(10) complete("ok") } } + } } - "Google Tracer" should "submit" in { - val tracer = new GoogleTracer( - "driverinc-sandbox", - Paths.get( - system.settings.config.getString("tracing.google.service-account-file")) - ) + "Tracing directives" should "nest spans correctly" in { + val tracer = new DummyTracer - val futures: Seq[Assertion] = for (i <- 0 until 100) yield { - Get(s"https://example.org/${i % 2 + 1}") ~> route(tracer) ~> check { + for (i <- 0 until 100) yield { + Get(s"https://example.org") ~> route(tracer) ~> check { assert(responseAs[String] == "ok") } } + val traces = tracer.spans.groupBy(_.traceId) + assert(traces.toSeq.length == 100) + + traces.foreach { + case (traceId, spans) => + def getSpan(name: String) = spans.find(_.name == name).get + assert( + getSpan("trace-1-3").parentSpanId.get === getSpan("trace-1-2").spanId) + assert( + getSpan("trace-1-2").parentSpanId.get === getSpan("trace-1-1").spanId) + } + Await.ready(tracer.close(), 30.seconds) } -- cgit v1.2.3