diff options
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala')
-rw-r--r-- | kamon-core/src/main/scala/kamon/trace/ActiveSpanSource.scala | 46 |
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 |