aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-10-04 15:02:55 -0700
committerJakob Odersky <jakob@driver.xyz>2017-10-04 15:02:55 -0700
commit50985bc8f889176d360d8ab1ce1d880bd4d9c766 (patch)
tree588e56c8e253a5b1b38a60d9b228e9a8f66138fb
parent87182fa750f65ac57c78c42507645b94a4541385 (diff)
downloadtracing-50985bc8f889176d360d8ab1ce1d880bd4d9c766.tar.gz
tracing-50985bc8f889176d360d8ab1ce1d880bd4d9c766.tar.bz2
tracing-50985bc8f889176d360d8ab1ce1d880bd4d9c766.zip
Update tests
-rw-r--r--src/main/scala/LoggingTracer.scala7
-rw-r--r--src/main/scala/TracingDirectives.scala4
-rw-r--r--src/test/scala/GoogleTracerSpec.scala51
-rw-r--r--src/test/scala/TracingDirectivesSpec.scala55
4 files changed, 87 insertions, 30 deletions
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)
}