aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala70
1 files changed, 70 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala b/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala
new file mode 100644
index 00000000..3a46d94f
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala
@@ -0,0 +1,70 @@
+package kamon.trace
+
+/**
+ * Wraps a [[kamon.trace.Span]] that has been activated in the current Thread. By activated we really mean, it is
+ * stored in a ThreadLocal value inside the tracer until [[kamon.trace.ActiveSpan#deactivate()]] is called.
+ *
+ * When a [[kamon.trace.Span]] is activated it will keep a reference to the previously active Span on the current
+ * Thread, take it's place as the currently active Span and put the original one once this ActiveSpan gets deactivated.
+ *
+ */
+trait ActiveSpan extends Span {
+
+ /**
+ * Sets the currently active Span to whatever Span was active when this Span was activated.
+ *
+ */
+ def deactivate(): Unit
+}
+
+object ActiveSpan {
+
+ final class Default(wrappedSpan: Span, restoreOnDeactivate: ActiveSpan, tl: ThreadLocal[ActiveSpan])
+ extends ActiveSpan {
+
+ override def deactivate(): Unit =
+ tl.set(restoreOnDeactivate)
+
+ //
+ // Forward all other members to the wrapped Span.
+ //
+
+ override def annotate(annotation: Span.Annotation): Span =
+ wrappedSpan.annotate(annotation)
+
+ override def addSpanTag(key: String, value: String): Span =
+ wrappedSpan.addSpanTag(key, value)
+
+ override def addMetricTag(key: String, value: String): Span =
+ wrappedSpan.addMetricTag(key, value)
+
+ override def addBaggage(key: String, value: String): Span =
+ wrappedSpan.addBaggage(key, value)
+
+ override def getBaggage(key: String): Option[String] =
+ wrappedSpan.getBaggage(key)
+
+ override def disableMetricsCollection(): Span =
+ wrappedSpan.disableMetricsCollection()
+
+ override def context(): SpanContext =
+ wrappedSpan.context()
+
+ override def setOperationName(operationName: String): Span =
+ wrappedSpan.setOperationName(operationName)
+
+ override def finish(): Unit =
+ wrappedSpan.finish()
+
+ override def finish(finishMicros: Long): Unit =
+ wrappedSpan.finish(finishMicros)
+
+ override def capture(): Continuation =
+ wrappedSpan.capture()
+ }
+
+ object Default {
+ def apply(wrappedSpan: Span, restoreOnDeactivate: ActiveSpan, tl: ThreadLocal[ActiveSpan]): Default =
+ new Default(wrappedSpan, restoreOnDeactivate, tl)
+ }
+} \ No newline at end of file