aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala46
1 files changed, 46 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala b/kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala
new file mode 100644
index 00000000..f4a363a6
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala
@@ -0,0 +1,46 @@
+package kamon.trace
+
+
+trait Scope extends AutoCloseable {
+ def close(): Unit
+}
+
+trait ActiveSpanSource {
+ def activeSpan(): Span
+
+ def activate(span: Span): Scope
+ def activate(span: Span, finishOnClose: Boolean): Scope
+}
+
+object ActiveSpanSource {
+
+ final class ThreadLocalBased extends ActiveSpanSource {
+ private val emptySpan = Span.Empty(this)
+ private val storage: ThreadLocal[Span] = new ThreadLocal[Span] {
+ override def initialValue(): Span = emptySpan
+ }
+
+ override def activeSpan(): Span =
+ storage.get()
+
+ override def activate(span: Span): Scope =
+ activate(span, finishOnClose = false)
+
+ override def activate(span: Span, finishOnClose: Boolean): Scope = {
+ val previouslyActiveSpan = storage.get()
+ storage.set(span)
+
+ new Scope {
+ override def close(): Unit = {
+ storage.set(previouslyActiveSpan)
+ if (finishOnClose && span != null)
+ span.finish()
+ }
+ }
+ }
+ }
+
+ object ThreadLocalBased {
+ def apply(): ThreadLocalBased = new ThreadLocalBased()
+ }
+} \ No newline at end of file