aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/ActiveSpan.scala
blob: c30a7157bc7dddf2e9aa88eafd2096fd3e6b4c7c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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(): Span
}

object ActiveSpan {

  final class Default(wrappedSpan: Span, restoreOnDeactivate: ActiveSpan, tl: ThreadLocal[ActiveSpan])
      extends ActiveSpan {

    override def deactivate(): Span = {
      tl.set(restoreOnDeactivate)
      wrappedSpan
    }

    //
    //  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 addSpanTag(key: String, value: Long): Span =
      wrappedSpan.addSpanTag(key, value)

    override def addSpanTag(key: String, value: Boolean): 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(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)
  }
}