aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/kamon/TraceContext.scala
blob: 351446f32762135c75ca8a923237c86d79bf7cdc (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
package kamon

import java.util.UUID
import akka.actor.{ActorSystem, ActorPath}
import akka.agent.Agent
import java.util.concurrent.TimeUnit
import scala.util.{Failure, Success}
import akka.util.Timeout


case class TraceContext(id: UUID, private val entries: Agent[List[TraceEntry]], userContext: Option[Any] = None) {
  implicit val timeout = Timeout(30, TimeUnit.SECONDS)
  implicit val as = Kamon.actorSystem.dispatcher

  def append(entry: TraceEntry) = entries send (entry :: _)
  def close = entries.future.onComplete({
    case Success(list) => Kamon.publish(FullTransaction(id, list))
    case Failure(t) => println("WTF!")
  })
}

object TraceContext {
  def apply()(implicit actorSystem: ActorSystem) = new TraceContext(UUID.randomUUID(), Agent[List[TraceEntry]](Nil))
}



trait TraceEntry

case class CodeBlockExecutionTime(name: String, begin: Long, end: Long) extends TraceEntry



case class TransactionTrace(id: UUID, start: Long, end: Long, entries: Seq[TraceEntry])





object Collector {

}

trait TraceEntryStorage {
  def store(entry: TraceEntry): Boolean
}

class TransactionContext(val id: UUID, private val storage: TraceEntryStorage) {
  def store(entry: TraceEntry) = storage.store(entry)
}

object ThreadLocalTraceEntryStorage extends TraceEntryStorage {

  private val storage = new ThreadLocal[List[TraceEntry]] {
    override def initialValue(): List[TraceEntry] = Nil
    def update(f: List[TraceEntry] => List[TraceEntry]) = set(f(get()))
  }

  def store(entry: TraceEntry): Boolean = {
    storage.update(entry :: _)
    true
  }
}