Below example uses Yammer metrics library , add "nl.grons" % "metrics-scala_2.11" % "2.1.5"] to library dependency in SBT.
To update the counters call the designated functions when the event happens. Meters give -1, -5, -15 min moving average values, below i have used just -5 min rate MetricsExample.scalapackage controllers import java.util.concurrent.TimeUnit import play.api.libs.json.Json import com.yammer.metrics.scala.Instrumented object MetricsExample with Instrumented { val requests = metrics.counter("number_requests") val success = metrics.counter("number_success") val failed = metrics.counter("number_failed") val successRate = metrics.meter("successRate", "number_success", "rate", TimeUnit.SECONDS) val requestRate = metrics.meter("requestRate", "number_requests", "rate", TimeUnit.SECONDS) val processTime = metrics.histogram("processTime") case class Statistics ( requests: Long, success: Long, failed: Long, requestRate: Double, successRate: Double, minProcessTime: Double, meanProcessTime: Double, maxProcessTime: Double ) object Statistics { implicit val formatStatistics = Json.format[Statistics] } def incrementRequests() { requests += 1 requestRate.mark() } def incrementSuccess() = { success += 1 successRate.mark() } def incrementFailed() = failed += 1 def updateProcessTime(time: Long) = { if(processTime.count > 100) processTime.clear() processTime += time } def getMetrics = { Statistics( requests.count, success.count, failed.count, requestRate.fiveMinuteRate, successRate.fiveMinuteRate, processTime.min, processTime.mean, processTime.max ) } }
0 Comments
/** type in scala allows us to define placeholders for types to be realized later. For example type T of trait Alpha in below example: **/ scala> trait Alpha { | type T | def member: T | } defined trait Alpha scala> class Beta[A](m: A) extends Alpha { | type T = A | def member = m | } defined class Beta scala> val gamma = new Beta[Int](4) gamma: Beta[Int] = Beta@1b410b60 scala> val gamma1 = new Beta[String]("str") gamma1: Beta[String] = Beta@42e25b0b scala> gamma.member res10: Int = 4 scala> gamma1.member res11: String = str /** Compute[B] is subtype of Compute[A] if B is subtype of A. This is known as Covariance. An object defined on SubType can be assigned to variable of superType. You can tell the Scala compiler that Compute[A] is covariant on A as follows: **/ scala> class Compute[+A] defined class Compute scala> val strObj: Compute[AnyRef] = new Compute[String] strObj: Compute[AnyRef] = Compute@a3d8174 scala> val strObj: Compute[String] = new Compute[AnyRef] <console>:8: error: type mismatch; found : Compute[AnyRef] required: Compute[String] val strObj: Compute[String] = new Compute[AnyRef] ^ /** Compute[B] is subtype of Compute[A] if A is subtype of B. This is known as contravariance. An object defined on SuperType can be assigned to variable of subType. You can tell the Scala compiler that Compute[A] is contravariance on A as follows: **/ scala> class Compute[-A] defined class Compute scala> val strObj: Compute[String] = new Compute[AnyRef] strObj: Compute[String] = Compute@d9345cd scala> val strObj: Compute[AnyRef] = new Compute[String] <console>:8: error: type mismatch; found : Compute[String] required: Compute[AnyRef] val strObj: Compute[AnyRef] = new Compute[String] ^ Enumerations by extending Enumerationobject Gender extends Enumeration { val Male, Female = Value } def aboutMe(x: Gender.Value) = x match { case Gender.Male => println("I am Male") case Gender.Female => println("I am Female") } println(aboutMe(Gender.Male)) println(aboutMe(Gender.Female)) Using Sealed Trait and Objectobject Gender { sealed trait GenderVal case object Male extends GenderVal case object Female extends GenderVal val Value = Seq(Male, Female) } def abtMe(x: Gender.GenderVal) = x match { case Gender.Male => println("I am Male" ) case Gender.Female => println("I am Female") } println(abtMe(Gender.Male)) |
Archives
October 2016
Categories
All
|