From cd54e4ed73734dbabebbf22e4fa288c9b047992e Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Thu, 24 Aug 2017 11:23:21 +0200 Subject: introduce the SpanCustomizer API --- .../main/scala/kamon/testkit/SpanInspection.scala | 64 ++++++++++++++++++++++ .../main/scala/kamon/testkit/SpanInspector.scala | 61 --------------------- 2 files changed, 64 insertions(+), 61 deletions(-) create mode 100644 kamon-testkit/src/main/scala/kamon/testkit/SpanInspection.scala delete mode 100644 kamon-testkit/src/main/scala/kamon/testkit/SpanInspector.scala (limited to 'kamon-testkit/src/main') diff --git a/kamon-testkit/src/main/scala/kamon/testkit/SpanInspection.scala b/kamon-testkit/src/main/scala/kamon/testkit/SpanInspection.scala new file mode 100644 index 00000000..c4a83a73 --- /dev/null +++ b/kamon-testkit/src/main/scala/kamon/testkit/SpanInspection.scala @@ -0,0 +1,64 @@ +package kamon.testkit + +import kamon.trace.{Span, SpanContext} +import kamon.trace.Span.FinishedSpan +import kamon.util.Clock + +import scala.reflect.ClassTag +import scala.util.Try + +trait SpanInspection { + + def inspect(span: Span): SpanInspection.Inspector = + new SpanInspection.Inspector(span) +} + +object SpanInspection { + + class Inspector(span: Span) { + private val (realSpan, spanData) = Try { + val realSpan = span match { + case _: Span.Local => span + } + + val spanData = invoke[Span.Local, FinishedSpan](realSpan, "toFinishedSpan", classOf[Long] -> Long.box(Clock.microTimestamp())) + (realSpan, spanData) + }.getOrElse((null, null)) + + def isEmpty: Boolean = + realSpan == null + + def spanTag(key: String): Option[Span.TagValue] = + spanData.tags.get(key) + + def spanTags(): Map[String, Span.TagValue] = + spanData.tags + + def metricTags(): Map[String, String] = + getField[Span.Local, Map[String, String]](realSpan, "customMetricTags") + + def startTimestamp(): Long = + getField[Span.Local, Long](realSpan, "startTimestampMicros") + + def context(): SpanContext = + spanData.context + + def operationName(): String = + spanData.operationName + + + private def getField[T, R](target: Any, fieldName: String)(implicit classTag: ClassTag[T]): R = { + val toFinishedSpanMethod = classTag.runtimeClass.getDeclaredFields.find(_.getName.contains(fieldName)).get + toFinishedSpanMethod.setAccessible(true) + toFinishedSpanMethod.get(target).asInstanceOf[R] + } + + private def invoke[T, R](target: Any, fieldName: String, parameters: (Class[_], AnyRef)*)(implicit classTag: ClassTag[T]): R = { + val parameterClasses = parameters.map(_._1) + val parameterInstances = parameters.map(_._2) + val toFinishedSpanMethod = classTag.runtimeClass.getDeclaredMethod(fieldName, parameterClasses: _*) + toFinishedSpanMethod.setAccessible(true) + toFinishedSpanMethod.invoke(target, parameterInstances: _*).asInstanceOf[R] + } + } +} \ No newline at end of file diff --git a/kamon-testkit/src/main/scala/kamon/testkit/SpanInspector.scala b/kamon-testkit/src/main/scala/kamon/testkit/SpanInspector.scala deleted file mode 100644 index 25f7ee06..00000000 --- a/kamon-testkit/src/main/scala/kamon/testkit/SpanInspector.scala +++ /dev/null @@ -1,61 +0,0 @@ -package kamon.testkit - -import kamon.trace.{Span, SpanContext} -import kamon.trace.Span.FinishedSpan -import kamon.util.Clock - -import scala.reflect.ClassTag -import scala.util.Try - -class SpanInspector(span: Span) { - private val (realSpan, spanData) = Try { - val realSpan = span match { - case _: Span.Local => span - } - - val spanData = invoke[Span.Local, FinishedSpan](realSpan, "toFinishedSpan", classOf[Long] -> Long.box(Clock.microTimestamp())) - (realSpan, spanData) - }.getOrElse((null, null)) - - def isEmpty: Boolean = - realSpan == null - - def spanTag(key: String): Option[Span.TagValue] = - spanData.tags.get(key) - - def spanTags(): Map[String, Span.TagValue] = - spanData.tags - - def metricTags(): Map[String, String] = - getField[Span.Local, Map[String, String]](realSpan, "customMetricTags") - - def startTimestamp(): Long = - getField[Span.Local, Long](realSpan, "startTimestampMicros") - - def context(): SpanContext = - spanData.context - - def operationName(): String = - spanData.operationName - - - - - private def getField[T, R](target: Any, fieldName: String)(implicit classTag: ClassTag[T]): R = { - val toFinishedSpanMethod = classTag.runtimeClass.getDeclaredFields.find(_.getName.contains(fieldName)).get - toFinishedSpanMethod.setAccessible(true) - toFinishedSpanMethod.get(target).asInstanceOf[R] - } - - private def invoke[T, R](target: Any, fieldName: String, parameters: (Class[_], AnyRef)*)(implicit classTag: ClassTag[T]): R = { - val parameterClasses = parameters.map(_._1) - val parameterInstances = parameters.map(_._2) - val toFinishedSpanMethod = classTag.runtimeClass.getDeclaredMethod(fieldName, parameterClasses: _*) - toFinishedSpanMethod.setAccessible(true) - toFinishedSpanMethod.invoke(target, parameterInstances: _*).asInstanceOf[R] - } -} - -object SpanInspector { - def apply(span: Span): SpanInspector = new SpanInspector(span) -} -- cgit v1.2.3