|
Akka/Scala example source code file (MetricsCollectorSpec.scala)
The MetricsCollectorSpec.scala Akka example source code
/*
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
*/
package akka.cluster
import scala.language.postfixOps
import scala.collection.immutable
import scala.concurrent.duration._
import scala.concurrent.Await
import scala.util.{ Success, Try, Failure }
import akka.actor._
import akka.testkit._
import akka.cluster.StandardMetrics._
import org.scalatest.WordSpec
import org.scalatest.Matchers
object MetricsEnabledSpec {
val config = """
akka.cluster.metrics.enabled = on
akka.cluster.metrics.collect-interval = 1 s
akka.cluster.metrics.gossip-interval = 1 s
akka.actor.provider = "akka.remote.RemoteActorRefProvider"
"""
}
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class MetricsCollectorSpec extends AkkaSpec(MetricsEnabledSpec.config) with ImplicitSender with MetricsCollectorFactory {
import system.dispatcher
val collector = createMetricsCollector
"Metric must" must {
"merge 2 metrics that are tracking the same metric" in {
for (i ← 1 to 20) {
val sample1 = collector.sample.metrics
val sample2 = collector.sample.metrics
val merged12 = sample2 flatMap (latest ⇒ sample1 collect {
case peer if latest sameAs peer ⇒
val m = peer :+ latest
m.value should be(latest.value)
m.isSmooth should be(peer.isSmooth || latest.isSmooth)
m
})
val sample3 = collector.sample.metrics
val sample4 = collector.sample.metrics
val merged34 = sample4 flatMap (latest ⇒ sample3 collect {
case peer if latest sameAs peer ⇒
val m = peer :+ latest
m.value should be(latest.value)
m.isSmooth should be(peer.isSmooth || latest.isSmooth)
m
})
}
}
}
"MetricsCollector" must {
"not raise errors when attempting reflective code in apply" in {
Try(createMetricsCollector).get should not be null
}
"collect accurate metrics for a node" in {
val sample = collector.sample
val metrics = sample.metrics.collect { case m ⇒ (m.name, m.value) }
val used = metrics collectFirst { case (HeapMemoryUsed, b) ⇒ b }
val committed = metrics collectFirst { case (HeapMemoryCommitted, b) ⇒ b }
metrics foreach {
case (SystemLoadAverage, b) ⇒ b.doubleValue should be >= (0.0)
case (Processors, b) ⇒ b.intValue should be >= (0)
case (HeapMemoryUsed, b) ⇒ b.longValue should be >= (0L)
case (HeapMemoryCommitted, b) ⇒ b.longValue should be > (0L)
case (HeapMemoryMax, b) ⇒
b.longValue should be > (0L)
used.get.longValue should be <= (b.longValue)
committed.get.longValue should be <= (b.longValue)
case (CpuCombined, b) ⇒
b.doubleValue should be <= (1.0)
b.doubleValue should be >= (0.0)
}
}
"collect JMX metrics" in {
// heap max may be undefined depending on the OS
// systemLoadAverage is JMX when SIGAR not present, but
// it's not present on all platforms
val c = collector.asInstanceOf[JmxMetricsCollector]
val heap = c.heapMemoryUsage
c.heapUsed(heap).isDefined should be(true)
c.heapCommitted(heap).isDefined should be(true)
c.processors.isDefined should be(true)
}
"collect 50 node metrics samples in an acceptable duration" taggedAs LongRunningTest in within(10 seconds) {
(1 to 50) foreach { _ ⇒
val sample = collector.sample
sample.metrics.size should be >= (3)
Thread.sleep(100)
}
}
}
}
/**
* Used when testing metrics without full cluster
*/
trait MetricsCollectorFactory { this: AkkaSpec ⇒
private def extendedActorSystem = system.asInstanceOf[ExtendedActorSystem]
def selfAddress = extendedActorSystem.provider.rootPath.address
val defaultDecayFactor = 2.0 / (1 + 10)
def createMetricsCollector: MetricsCollector =
Try(new SigarMetricsCollector(selfAddress, defaultDecayFactor,
extendedActorSystem.dynamicAccess.createInstanceFor[AnyRef]("org.hyperic.sigar.Sigar", Nil))).
recover {
case e ⇒
log.debug("Metrics will be retreived from MBeans, Sigar failed to load. Reason: " + e)
new JmxMetricsCollector(selfAddress, defaultDecayFactor)
}.get
private[cluster] def isSigar(collector: MetricsCollector): Boolean = collector.isInstanceOf[SigarMetricsCollector]
}
Other Akka source code examplesHere is a short list of links related to this Akka MetricsCollectorSpec.scala source code file: |
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.