From 0609c571e2c390f4b069db3f0b1808947d27154d Mon Sep 17 00:00:00 2001 From: Diego Parra Date: Fri, 31 May 2013 17:57:26 -0300 Subject: WIP:Metrics 3 --- src/main/resources/META-INF/aop.xml | 1 + src/main/scala/akka/ActorAspect.scala | 46 ---------------------- src/main/scala/akka/ActorInstrumentation.scala | 46 ++++++++++++++++++++++ src/main/scala/kamon/metric/MetricsUtils.scala | 9 +++++ .../instrumentation/ActorInstrumentationSpec.scala | 42 ++++++++++++++++++++ 5 files changed, 98 insertions(+), 46 deletions(-) delete mode 100644 src/main/scala/akka/ActorAspect.scala create mode 100644 src/main/scala/akka/ActorInstrumentation.scala create mode 100644 src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala diff --git a/src/main/resources/META-INF/aop.xml b/src/main/resources/META-INF/aop.xml index d97a00ea..09f60a8f 100644 --- a/src/main/resources/META-INF/aop.xml +++ b/src/main/resources/META-INF/aop.xml @@ -10,6 +10,7 @@ + diff --git a/src/main/scala/akka/ActorAspect.scala b/src/main/scala/akka/ActorAspect.scala deleted file mode 100644 index ae21aa13..00000000 --- a/src/main/scala/akka/ActorAspect.scala +++ /dev/null @@ -1,46 +0,0 @@ -package akka - -import actor.ActorCell -import org.aspectj.lang.annotation.{After, Around, Pointcut, Aspect} -import org.aspectj.lang.ProceedingJoinPoint -import kamon.metric.Metrics.{ metricsRegistry => meterRegistry } -import com.codahale.metrics.Meter -import kamon.metric.MetricsUtils._ - -@Aspect("perthis(actorCellCreation(*))") -class ActorAspect { - - /** - * Aspect members - */ - - private val actorMeter:Meter = new Meter - - /** - * Pointcuts - */ - @Pointcut("execution(akka.actor.ActorCell+.new(..)) && this(actor)") - def actorCellCreation(actor:ActorCell):Unit = {} - - @Pointcut("execution(* akka.actor.ActorCell+.receiveMessage(..))") - def actorReceive():Unit = {} - - /** - * Advices - */ - @After("actorCellCreation(actor)") - def afterCellCreation(actor:ActorCell):Unit ={ - val actorName:String = actor.self.path.toString - - meterRegistry.register(s"meter-for-${actorName}", actorMeter) - } - - @Around("actorReceive()") - def around(pjp: ProceedingJoinPoint) = { - import pjp._ - - markMeter(actorMeter) { - proceed - } - } - } \ No newline at end of file diff --git a/src/main/scala/akka/ActorInstrumentation.scala b/src/main/scala/akka/ActorInstrumentation.scala new file mode 100644 index 00000000..afe0e459 --- /dev/null +++ b/src/main/scala/akka/ActorInstrumentation.scala @@ -0,0 +1,46 @@ +package akka + +import actor.ActorCell +import org.aspectj.lang.annotation.{After, Around, Pointcut, Aspect} +import org.aspectj.lang.ProceedingJoinPoint +import kamon.metric.Metrics.{ metricsRegistry => meterRegistry } +import com.codahale.metrics.Meter +import kamon.metric.MetricsUtils._ + +@Aspect("perthis(actorCellCreation(*))") +class ActorInstrumentation { + + /** + * Aspect members + */ + + private val actorMeter:Meter = new Meter + + /** + * Pointcuts + */ + @Pointcut("execution(akka.actor.ActorCell+.new(..)) && this(actor)") + def actorCellCreation(actor:ActorCell):Unit = {} + + @Pointcut("execution(* akka.actor.ActorCell+.receiveMessage(..))") + def actorReceive():Unit = {} + + /** + * Advices + */ + @After("actorCellCreation(actor)") + def afterCellCreation(actor:ActorCell):Unit ={ + val actorName:String = actor.self.path.toString + + meterRegistry.register(s"meter-for-${actorName}", actorMeter) + } + + @Around("actorReceive()") + def around(pjp: ProceedingJoinPoint) = { + import pjp._ + + markMeter(actorMeter) { + proceed + } + } + } \ No newline at end of file diff --git a/src/main/scala/kamon/metric/MetricsUtils.scala b/src/main/scala/kamon/metric/MetricsUtils.scala index fc72dcf3..5b4ceaf4 100644 --- a/src/main/scala/kamon/metric/MetricsUtils.scala +++ b/src/main/scala/kamon/metric/MetricsUtils.scala @@ -34,6 +34,15 @@ object MetricsUtils { // } //} +// implicit def runnable(f: () => Unit): Runnable = +// new Runnable() { def run() = f() } +// +// +// import java.util.concurrent.Callable +// +// implicit def callable[T](f: () => T): Callable[T] = +// new Callable[T]() { def call() = f() } + // private val actorCounter:Counter = new Counter // private val actorTimer:Timer = new Timer // diff --git a/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala b/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala new file mode 100644 index 00000000..2921824e --- /dev/null +++ b/src/test/scala/akka/instrumentation/ActorInstrumentationSpec.scala @@ -0,0 +1,42 @@ +package akka.instrumentation + +import org.scalatest.WordSpec +import org.scalatest.matchers.{ShouldMatchers, MustMatchers} +import akka.actor.{Actor, Props, ActorSystem} +import kamon.metric.Metrics +import com.codahale.metrics.Meter +import scala.collection.JavaConverters._ + + +class ActorInstrumentationSpec extends WordSpec with MustMatchers with ShouldMatchers { + import Metrics.metricsRegistry._ + val system = ActorSystem() + + import system._ + val echoRef = actorOf(Props(new EchoActor), "Echo-Actor") + + "a instrumented Actor" should { + "send a message and record a metric on the Metrics Registry and count messages" in { + + echoRef ! "Message 1" + echoRef ! "Message 2" + echoRef ! "Message 3" + echoRef ! "Message 4" + echoRef ! "Message 5" + echoRef ! "Message 6" + + val meter = getMeters.asScala.filterKeys(_.toLowerCase.contains("Echo-Actor".toLowerCase())).collectFirst{case pair:(String, Meter) => pair._2.getCount}.get + + meter should equal(6) + } + } + +} + +class EchoActor extends Actor { + def receive = { + case msg ⇒ sender ! msg + } +} + + -- cgit v1.2.3