aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/akka/PoolMonitorInstrumentation.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/akka/PoolMonitorInstrumentation.scala')
-rw-r--r--src/main/scala/akka/PoolMonitorInstrumentation.scala18
1 files changed, 16 insertions, 2 deletions
diff --git a/src/main/scala/akka/PoolMonitorInstrumentation.scala b/src/main/scala/akka/PoolMonitorInstrumentation.scala
index 167083e8..e78e0d7e 100644
--- a/src/main/scala/akka/PoolMonitorInstrumentation.scala
+++ b/src/main/scala/akka/PoolMonitorInstrumentation.scala
@@ -1,16 +1,30 @@
package akka
import org.aspectj.lang.annotation._
+import akka.dispatch.MonitorableThreadFactory
+import kamon.metric.Metrics
+import scala.concurrent.forkjoin.ForkJoinPool
+import com.codahale.metrics.Gauge
-@Aspect("perthis(poolMonitor(*))")
+@Aspect("perthis(poolMonitor(scala.concurrent.forkjoin.ForkJoinPool))")
class PoolMonitorAspect {
println("Created PoolMonitorAspect")
+
@Pointcut("execution(scala.concurrent.forkjoin.ForkJoinPool.new(..)) && this(pool)")
- protected def poolMonitor(pool:scala.concurrent.forkjoin.ForkJoinPool):Unit = {}
+ protected def poolMonitor(pool: scala.concurrent.forkjoin.ForkJoinPool):Unit = {}
@After("poolMonitor(pool)")
def beforePoolInstantiation(pool: scala.concurrent.forkjoin.ForkJoinPool):Unit = {
+ pool.getFactory match {
+ case m: MonitorableThreadFactory => registerForMonitoring(pool, m.name)
+ }
+ }
+ def registerForMonitoring(fjp: ForkJoinPool, name: String) {
+ Metrics.registry.register(s"/metrics/actorsystem/{actorsystem-name}/dispatcher/$name",
+ new Gauge[Long] {
+ def getValue: Long = fjp.getPoolSize
+ })
}
}