aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/akka/Tracer.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/akka/Tracer.scala')
-rw-r--r--src/main/scala/akka/Tracer.scala68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/main/scala/akka/Tracer.scala b/src/main/scala/akka/Tracer.scala
new file mode 100644
index 00000000..4b2542b7
--- /dev/null
+++ b/src/main/scala/akka/Tracer.scala
@@ -0,0 +1,68 @@
+package akka
+
+import actor.{Props, Actor, ActorSystemImpl}
+import concurrent.forkjoin.ForkJoinPool
+import scala.concurrent.duration._
+import com.newrelic.api.agent.NewRelic
+import akka.dispatch.Mailbox
+
+object Tracer {
+ var system: ActorSystemImpl = _
+ var forkJoinPool:ForkJoinPool = _
+ var mailbox:Mailbox = _
+
+ def collectPool(pool: ForkJoinPool) = forkJoinPool = pool
+ def collectActorSystem(actorSystem: ActorSystemImpl) = system = actorSystem
+
+ def collectMailBox(mb: akka.dispatch.Mailbox) = {
+ mailbox = mb
+ }
+
+ def start():Unit ={
+ implicit val dispatcher = system.dispatcher
+ val metricsActor = system.actorOf(Props[MetricsActor], "PoolActor")
+
+ system.scheduler.schedule(10 seconds, 6 second, metricsActor, PoolMetrics(forkJoinPool))
+ system.scheduler.schedule(10 seconds, 6 second, metricsActor, MailboxMetrics(mailbox))
+ }
+}
+
+case class PoolMetrics(poolName:String, data:Map[String,Int])
+object PoolMetrics {
+ def apply(pool: ForkJoinPool) = new PoolMetrics(pool.getClass.getSimpleName, toMap(pool))
+
+ def toMap(pool: scala.concurrent.forkjoin.ForkJoinPool):Map[String,Int] = Map[String,Int](
+ "ActiveThreadCount" -> pool.getActiveThreadCount,
+ "Parallelism" -> pool.getParallelism,
+ "PoolSize" -> pool.getPoolSize,
+ "QueuedSubmissionCount" -> pool.getQueuedSubmissionCount,
+ "StealCount" -> pool.getStealCount.toInt,
+ "QueuedTaskCount" -> pool.getQueuedTaskCount.toInt,
+ "RunningThreadCount" -> pool.getRunningThreadCount
+ )
+}
+case class MailboxMetrics(mbName:String, mailBox:Mailbox)
+object MailboxMetrics {
+ def apply(mb: Mailbox) = new MailboxMetrics(mb.actor.self.path.toString,mb)
+}
+
+class MetricsActor extends Actor {
+ def receive = {
+ case poolMetrics:PoolMetrics => {
+ println(poolMetrics)
+ poolMetrics.data.map{case(k,v) => NewRelic.recordMetric(s"${poolMetrics.poolName}:${k}",v)}
+ }
+ case mailboxMetrics:MailboxMetrics => {
+ val actorName = mailboxMetrics.mbName
+ val mb = mailboxMetrics.mailBox
+ println(s"Sending metrics to Newrelic MailBoxMonitor -> ${actorName}")
+
+
+ NewRelic.recordMetric(s"${actorName}:Mailbox:NumberOfMessages",mb.numberOfMessages)
+ NewRelic.recordMetric(s"${actorName}:Mailbox:MailboxDispatcherThroughput",mb.dispatcher.throughput)
+
+ NewRelic.addCustomParameter(s"${actorName}:Mailbox:Status", mb.hasMessages.toString)
+ NewRelic.addCustomParameter(s"${actorName}:Mailbox:HasMessages", mb.hasMessages.toString)
+ }
+ }
+} \ No newline at end of file