aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2014-05-09 12:35:54 -0300
committerDiego <diegolparra@gmail.com>2014-05-09 12:35:54 -0300
commit650d82631585cd6fe06056027d69f27a33bb8d3e (patch)
tree91aaed110091a7048646e4013e5c897e9f7f0b09
parent816cca4dacce342ef5d9c61dda744161a088d439 (diff)
downloadKamon-650d82631585cd6fe06056027d69f27a33bb8d3e.tar.gz
Kamon-650d82631585cd6fe06056027d69f27a33bb8d3e.tar.bz2
Kamon-650d82631585cd6fe06056027d69f27a33bb8d3e.zip
+ core: added MinMaxCounterSpec and new test in ActorMetricsSpec
-rw-r--r--kamon-core/src/main/scala/akka/instrumentation/ActorMessagePassingTracing.scala12
-rw-r--r--kamon-core/src/main/scala/kamon/metrics/instruments/counter/MinMaxCounter.scala2
-rw-r--r--kamon-core/src/main/scala/kamon/util/Contexts.scala24
-rw-r--r--kamon-core/src/test/scala/kamon/metrics/ActorMetricsSpec.scala16
-rw-r--r--kamon-core/src/test/scala/kamon/metrics/instrument/MinMaxCounterSpec.scala109
5 files changed, 148 insertions, 15 deletions
diff --git a/kamon-core/src/main/scala/akka/instrumentation/ActorMessagePassingTracing.scala b/kamon-core/src/main/scala/akka/instrumentation/ActorMessagePassingTracing.scala
index 9ef43bbe..13e506e2 100644
--- a/kamon-core/src/main/scala/akka/instrumentation/ActorMessagePassingTracing.scala
+++ b/kamon-core/src/main/scala/akka/instrumentation/ActorMessagePassingTracing.scala
@@ -25,6 +25,7 @@ import kamon.metrics.{ ActorMetrics, Metrics }
import kamon.Kamon
import kamon.metrics.ActorMetrics.ActorMetricRecorder
import kamon.metrics.instruments.counter.MinMaxCounter
+import kamon.util.Contexts
@Aspect
class BehaviourInvokeTracing {
@@ -43,16 +44,17 @@ class BehaviourInvokeTracing {
cellWithMetrics.metricIdentity = metricIdentity
cellWithMetrics.actorMetricsRecorder = metricsExtension.register(metricIdentity, ActorMetrics.Factory)
- val executor = system.dispatchers.lookup("kamon.default-dispatcher")
+ val executor = Contexts.lookupExecutionContext(Contexts.kamonDefaultDispatcher)(system)
system.scheduler.schedule(0 milliseconds, 100 milliseconds) {
cellWithMetrics.actorMetricsRecorder.map {
am ⇒
+ import am.mailboxSize._
val (min, max, sum) = cellWithMetrics.queueSize.collect()
- am.mailboxSize.record(min)
- am.mailboxSize.record(max)
- am.mailboxSize.record(sum)
+ record(min)
+ record(max)
+ record(sum)
}
}(executor)
}
@@ -114,7 +116,7 @@ class BehaviourInvokeTracing {
trait ActorCellMetrics {
var metricIdentity: ActorMetrics = _
var actorMetricsRecorder: Option[ActorMetricRecorder] = _
- val queueSize = MinMaxCounter()
+ val queueSize = MinMaxCounter()
}
@Aspect
diff --git a/kamon-core/src/main/scala/kamon/metrics/instruments/counter/MinMaxCounter.scala b/kamon-core/src/main/scala/kamon/metrics/instruments/counter/MinMaxCounter.scala
index ed83f4bc..6c89a4d1 100644
--- a/kamon-core/src/main/scala/kamon/metrics/instruments/counter/MinMaxCounter.scala
+++ b/kamon-core/src/main/scala/kamon/metrics/instruments/counter/MinMaxCounter.scala
@@ -39,7 +39,7 @@ class MinMaxCounter {
def collect(): (Long, Long, Long) = {
val currentValue = sum.get()
- val result = (abs(min.max()), max.max(), currentValue)
+ val result = (abs(min.maxThenReset()), max.maxThenReset(), currentValue)
max.update(currentValue)
min.update(-currentValue)
result
diff --git a/kamon-core/src/main/scala/kamon/util/Contexts.scala b/kamon-core/src/main/scala/kamon/util/Contexts.scala
new file mode 100644
index 00000000..d2fe6360
--- /dev/null
+++ b/kamon-core/src/main/scala/kamon/util/Contexts.scala
@@ -0,0 +1,24 @@
+package kamon.util
+
+import akka.actor.ActorSystem
+
+/*
+ * =========================================================================================
+ * Copyright © 2013-2014 the kamon project <http://kamon.io/>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ * =========================================================================================
+ */
+object Contexts {
+ val kamonDefaultDispatcher = "kamon.default-dispatcher"
+
+ def lookupExecutionContext(id:String)(implicit system: ActorSystem) = system.dispatchers.lookup(id)
+}
diff --git a/kamon-core/src/test/scala/kamon/metrics/ActorMetricsSpec.scala b/kamon-core/src/test/scala/kamon/metrics/ActorMetricsSpec.scala
index 0f0bb475..7430e0f0 100644
--- a/kamon-core/src/test/scala/kamon/metrics/ActorMetricsSpec.scala
+++ b/kamon-core/src/test/scala/kamon/metrics/ActorMetricsSpec.scala
@@ -15,9 +15,9 @@
package kamon.metrics
-import org.scalatest.{WordSpecLike, Matchers}
-import akka.testkit.{TestProbe, TestKitBase}
-import akka.actor.{ActorRef, Actor, Props, ActorSystem}
+import org.scalatest.{ WordSpecLike, Matchers }
+import akka.testkit.{ TestProbe, TestKitBase }
+import akka.actor.{ ActorRef, Actor, Props, ActorSystem }
import com.typesafe.config.ConfigFactory
import scala.concurrent.duration._
import kamon.Kamon
@@ -89,8 +89,8 @@ class ActorMetricsSpec extends TestKitBase with WordSpecLike with Matchers {
val stalledTickMetrics = expectActorMetrics("user/tracked-mailbox-size-queueing-up", metricsListener, 2 seconds)
stalledTickMetrics.mailboxSize.numberOfMeasurements should equal(31)
// only the automatic last-value recording should be taken, and includes the message being currently processed.
- stalledTickMetrics.mailboxSize.measurements should contain only (Measurement(0, 10), Measurement(10, 21))
- stalledTickMetrics.mailboxSize.min should equal(0)
+ stalledTickMetrics.mailboxSize.measurements should contain only (Measurement(10, 31))
+ stalledTickMetrics.mailboxSize.min should equal(10)
stalledTickMetrics.mailboxSize.max should equal(10)
stalledTickMetrics.processingTime.numberOfMeasurements should be(0L)
stalledTickMetrics.timeInMailbox.numberOfMeasurements should be(0L)
@@ -115,7 +115,6 @@ class ActorMetricsSpec extends TestKitBase with WordSpecLike with Matchers {
}
}
-
def expectActorMetrics(actorPath: String, listener: TestProbe, waitTime: FiniteDuration): ActorMetricSnapshot = {
val tickSnapshot = within(waitTime) {
listener.expectMsgType[TickMetricSnapshot]
@@ -150,19 +149,18 @@ class ActorMetricsSpec extends TestKitBase with WordSpecLike with Matchers {
(actor, metricsListener)
}
}
-
}
class DelayableActor extends Actor {
def receive = {
case Delay(time) ⇒ Thread.sleep(time.toMillis)
- case Discard ⇒
+ case Discard ⇒
}
}
class FailedActor extends Actor {
def receive = {
- case Error ⇒ 1 / 0
+ case Error ⇒ 1 / 0
case Discard ⇒
}
}
diff --git a/kamon-core/src/test/scala/kamon/metrics/instrument/MinMaxCounterSpec.scala b/kamon-core/src/test/scala/kamon/metrics/instrument/MinMaxCounterSpec.scala
new file mode 100644
index 00000000..a309f92e
--- /dev/null
+++ b/kamon-core/src/test/scala/kamon/metrics/instrument/MinMaxCounterSpec.scala
@@ -0,0 +1,109 @@
+package kamon.metrics.instrument
+/* =========================================================================================
+ * Copyright © 2013-2014 the kamon project <http://kamon.io/>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ * =========================================================================================
+ */
+import org.scalatest.{Matchers, WordSpecLike}
+import kamon.metrics.instruments.counter.MinMaxCounter
+
+class MinMaxCounterSpec extends WordSpecLike with Matchers {
+
+
+ "the MinMaxCounter" should {
+ "increment" in {
+ val counter = MinMaxCounter()
+
+ counter.increment()
+ counter.increment()
+ counter.increment()
+ counter.increment()
+ counter.increment()
+
+ val (_, _, sum) = counter.collect()
+
+ sum should be(5)
+ }
+
+ "decrement" in {
+ val counter = MinMaxCounter()
+ counter.increment(5L)
+
+ counter.decrement()
+ counter.decrement()
+ counter.decrement()
+ counter.decrement()
+ counter.decrement()
+
+ val (_, _, sum) = counter.collect()
+
+ sum should be(0)
+ }
+
+ "reset the min and max with the sum value when the collect method is called" in {
+ val counter = MinMaxCounter()
+
+ counter.increment(10)
+ counter.increment(20)
+ counter.increment(30)
+ counter.increment(40)
+ counter.increment(50)
+
+ counter.collect() //only for check the last value after reset min max
+
+ val (min, max, sum) = counter.collect()
+
+ min should be(sum)
+ max should be(sum)
+ sum should be(150)
+ }
+ }
+
+ "track the min value" in {
+ val counter = MinMaxCounter()
+
+ counter.increment(10)
+ counter.increment(20)
+ counter.increment(30)
+ counter.increment(40)
+ counter.increment(50)
+
+ val (min, _, _) = counter.collect()
+
+ min should be(0)
+
+ counter.increment(50)
+
+ val (minAfterCollectAndAddSomeValues, _, _) = counter.collect()
+
+ minAfterCollectAndAddSomeValues should be(150)
+ }
+
+ "track the max value" in {
+ val counter = MinMaxCounter()
+ counter.increment(10)
+ counter.increment(20)
+ counter.increment(30)
+ counter.increment(40)
+ counter.increment(50)
+
+ val (_, max, _) = counter.collect()
+
+ max should be(150)
+
+ counter.increment(200)
+
+ val (_,maxAfterCollectAndAddSomeValues, _) = counter.collect()
+
+ maxAfterCollectAndAddSomeValues should be(350)
+ }
+}