aboutsummaryrefslogtreecommitdiff
path: root/kamon-core/src/main/scala/kamon/trace/Incubator.scala
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-12-03 02:10:46 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2014-12-03 02:10:46 +0100
commit216687a130d9f68aacc67d7fe932fb4007288291 (patch)
treeed3a525c4436f44b0dfd8aa6695ee63a3bc01bb6 /kamon-core/src/main/scala/kamon/trace/Incubator.scala
parent3ef0a1b6e7c3e277fb44d607f248fd94c20df5c0 (diff)
downloadKamon-216687a130d9f68aacc67d7fe932fb4007288291.tar.gz
Kamon-216687a130d9f68aacc67d7fe932fb4007288291.tar.bz2
Kamon-216687a130d9f68aacc67d7fe932fb4007288291.zip
= core: first simple approach to providing traces and a subscription mechanism.
Diffstat (limited to 'kamon-core/src/main/scala/kamon/trace/Incubator.scala')
-rw-r--r--kamon-core/src/main/scala/kamon/trace/Incubator.scala45
1 files changed, 45 insertions, 0 deletions
diff --git a/kamon-core/src/main/scala/kamon/trace/Incubator.scala b/kamon-core/src/main/scala/kamon/trace/Incubator.scala
new file mode 100644
index 00000000..d363d771
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/trace/Incubator.scala
@@ -0,0 +1,45 @@
+package kamon.trace
+
+import akka.actor.{ Props, Actor, ActorRef }
+import kamon.trace.Incubator.{ CheckForCompletedTraces, IncubatingTrace }
+import scala.annotation.tailrec
+import scala.collection.immutable.Queue
+import scala.concurrent.duration._
+
+class Incubator(subscriptions: ActorRef, maxIncubationNanoTime: Long) extends Actor {
+ import context.dispatcher
+ val checkSchedule = context.system.scheduler.schedule(100 millis, 100 millis, self, CheckForCompletedTraces)
+ var incubating = Queue.empty[IncubatingTrace]
+
+ def receive = {
+ case CheckForCompletedTraces ⇒ dispatchCompleted()
+ case tc: TracingContext ⇒ incubating = incubating.enqueue(IncubatingTrace(tc))
+ }
+
+ @tailrec private def dispatchCompleted(): Unit = {
+ if (incubating.nonEmpty) {
+ val it = incubating.head
+ if (!it.tc.shouldIncubate || it.incubationNanoTime >= maxIncubationNanoTime) {
+ it.tc.generateTraceInfo.map(subscriptions ! _)
+ incubating = incubating.tail
+ dispatchCompleted()
+ }
+ }
+ }
+
+ override def postStop(): Unit = {
+ super.postStop()
+ checkSchedule.cancel()
+ }
+}
+
+object Incubator {
+
+ def props(subscriptions: ActorRef, maxIncubationNanoTime: Long): Props = Props(new Incubator(subscriptions, maxIncubationNanoTime))
+
+ case object CheckForCompletedTraces
+ case class IncubatingTrace(tc: TracingContext) {
+ private val incubationStartNanoTime = System.nanoTime()
+ def incubationNanoTime: Long = System.nanoTime() - incubationStartNanoTime
+ }
+}