aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/LoggingTracer.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/LoggingTracer.scala')
-rw-r--r--src/main/scala/LoggingTracer.scala48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/main/scala/LoggingTracer.scala b/src/main/scala/LoggingTracer.scala
new file mode 100644
index 0000000..b22d22a
--- /dev/null
+++ b/src/main/scala/LoggingTracer.scala
@@ -0,0 +1,48 @@
+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 {
+ import LoggingTracer.JsonProtocol._
+
+ override def submit(span: Span): Unit = logger.debug(
+ span.toJson.compactPrint
+ )
+}
+
+object LoggingTracer {
+
+ object JsonProtocol extends DefaultJsonProtocol {
+ implicit def uuidFormat: JsonFormat[UUID] = jsonFormat(
+ { (js: JsValue) =>
+ js match {
+ case JsString(str) => UUID.fromString(str)
+ case other => deserializationError("expected string as UUID")
+ }
+ }, { (uuid: UUID) =>
+ JsString(uuid.toString)
+ }
+ )
+
+ private val timeFormatter = DateTimeFormatter
+ .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX")
+ .withZone(ZoneId.of("UTC"))
+
+ implicit def instantFormat: JsonFormat[Instant] = jsonFormat(
+ { (js: JsValue) =>
+ js match {
+ case JsString(str) => Instant.parse(str)
+ case other => deserializationError(s"`$other` is not a valid instant")
+ }
+ }, { (instant: Instant) =>
+ JsString(timeFormatter.format(instant))
+ }
+ )
+ implicit def spanFormat: RootJsonFormat[Span] = jsonFormat7(Span.apply)
+ }
+
+}