aboutsummaryrefslogtreecommitdiff
path: root/kamon-trace
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2013-10-30 09:04:25 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2013-10-30 09:04:25 -0300
commitca1e93621ddad4b9f2a9028ea183b1c2f4c25a27 (patch)
tree2f9ce9a7b2f73fd19b5ec2d1af46c4ab43037528 /kamon-trace
parentab40e0e7f35f97390d180b49d556ee36aac4af18 (diff)
downloadKamon-ca1e93621ddad4b9f2a9028ea183b1c2f4c25a27.tar.gz
Kamon-ca1e93621ddad4b9f2a9028ea183b1c2f4c25a27.tar.bz2
Kamon-ca1e93621ddad4b9f2a9028ea183b1c2f4c25a27.zip
move things all over the place
Diffstat (limited to 'kamon-trace')
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/TraceContext.scala61
-rw-r--r--kamon-trace/src/main/scala/kamon/trace/Tracer.scala16
2 files changed, 77 insertions, 0 deletions
diff --git a/kamon-trace/src/main/scala/kamon/trace/TraceContext.scala b/kamon-trace/src/main/scala/kamon/trace/TraceContext.scala
new file mode 100644
index 00000000..78db911d
--- /dev/null
+++ b/kamon-trace/src/main/scala/kamon/trace/TraceContext.scala
@@ -0,0 +1,61 @@
+package kamon.trace
+
+import java.util.UUID
+import akka.actor._
+import java.util.concurrent.atomic.AtomicLong
+import scala.concurrent.duration._
+
+// TODO: Decide if we need or not an ID, generating it takes time and it doesn't seem necessary.
+case class TraceContext(id: Long, tracer: ActorRef, uow: String = "", userContext: Option[Any] = None)
+
+object TraceContext {
+ val reporter = Kamon.actorSystem.actorOf(Props[NewRelicReporting])
+ val traceIdCounter = new AtomicLong
+
+ def apply()(implicit system: ActorSystem) = {
+ val n = traceIdCounter.incrementAndGet()
+ val actor = system.actorOf(UowTraceAggregator.props(reporter, 30 seconds), s"tracer-${n}")
+ actor ! Start()
+
+ new TraceContext(n, actor) // TODO: Move to a kamon specific supervisor, like /user/kamon/tracer
+ }
+}
+
+
+
+class TraceAccumulator extends Actor {
+ def receive = {
+ case a => println("Trace Accumulated: "+a)
+ }
+}
+
+
+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]) = storage set f(storage.get)
+
+ def store(entry: TraceEntry): Boolean = {
+ update(entry :: _)
+ true
+ }
+}
+
+
diff --git a/kamon-trace/src/main/scala/kamon/trace/Tracer.scala b/kamon-trace/src/main/scala/kamon/trace/Tracer.scala
new file mode 100644
index 00000000..e64cfaa6
--- /dev/null
+++ b/kamon-trace/src/main/scala/kamon/trace/Tracer.scala
@@ -0,0 +1,16 @@
+package kamon.trace
+
+import scala.util.DynamicVariable
+
+
+
+object Tracer {
+ val traceContext = new DynamicVariable[Option[TraceContext]](None)
+
+
+ def context() = traceContext.value
+ def set(ctx: TraceContext) = traceContext.value = Some(ctx)
+
+ def start = set(newTraceContext)
+ def newTraceContext(): TraceContext = TraceContext()(Kamon.actorSystem)
+}