aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/test/scala/kamon/trace/TraceContextManipulationSpec.scala
blob: d073f68e248962bd7b25fce6cee6af2bf94fe599 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package kamon.trace

import akka.actor.ActorSystem
import akka.testkit.TestKitBase
import com.typesafe.config.ConfigFactory
import kamon.trace.TraceContext.SegmentIdentity
import org.scalatest.{ Matchers, WordSpecLike }

class TraceContextManipulationSpec extends TestKitBase with WordSpecLike with Matchers {
  implicit def self = testActor
  implicit lazy val system: ActorSystem = ActorSystem("trace-metrics-spec", ConfigFactory.parseString(
    """
      |kamon.metrics {
      |  tick-interval = 1 hour
      |  filters = [
      |    {
      |      trace {
      |        includes = [ "*" ]
      |        excludes = [ "non-tracked-trace"]
      |      }
      |    }
      |  ]
      |  precision {
      |    default-histogram-precision {
      |      highest-trackable-value = 3600000000000
      |      significant-value-digits = 2
      |    }
      |
      |    default-min-max-counter-precision {
      |      refresh-interval = 1 second
      |      highest-trackable-value = 999999999
      |      significant-value-digits = 2
      |    }
      |  }
      |}
    """.stripMargin))

  "the TraceRecorder api" should {
    "allow starting a trace within a specified block of code, and only within that block of code" in {
      val createdContext = TraceRecorder.withNewTraceContext("start-context") {
        TraceRecorder.currentContext should not be empty
        TraceRecorder.currentContext.get
      }

      TraceRecorder.currentContext shouldBe empty
      createdContext.name shouldBe ("start-context")
    }

    "allow starting a trace within a specified block of code, providing a trace-token and only within that block of code" in {
      val createdContext = TraceRecorder.withNewTraceContext("start-context-with-token", Some("token-1")) {
        TraceRecorder.currentContext should not be empty
        TraceRecorder.currentContext.get
      }

      TraceRecorder.currentContext shouldBe empty
      createdContext.name shouldBe ("start-context-with-token")
      createdContext.token should be("token-1")
    }

    "allow providing a TraceContext and make it available within a block of code" in {
      val createdContext = TraceRecorder.withNewTraceContext("manually-provided-trace-context") { TraceRecorder.currentContext }

      TraceRecorder.currentContext shouldBe empty
      TraceRecorder.withTraceContext(createdContext) {
        TraceRecorder.currentContext should be(createdContext)
      }

      TraceRecorder.currentContext shouldBe empty
    }

    "allow renaming a trace" in {
      val createdContext = TraceRecorder.withNewTraceContext("trace-before-rename") {
        TraceRecorder.rename("renamed-trace")
        TraceRecorder.currentContext.get
      }

      TraceRecorder.currentContext shouldBe empty
      createdContext.name shouldBe ("renamed-trace")
    }

    "allow creating a segment within a trace" in {
      val createdContext = TraceRecorder.withNewTraceContext("trace-with-segments") {
        val segmentHandle = TraceRecorder.startSegment(TraceManipulationTestSegment("segment-1"))

        TraceRecorder.currentContext.get
      }

      TraceRecorder.currentContext shouldBe empty
      createdContext.name shouldBe ("trace-with-segments")

    }
  }

  case class TraceManipulationTestSegment(name: String) extends SegmentIdentity

}