diff options
author | Ivan Topolnak <itopolnak@despegar.com> | 2014-02-04 18:16:07 -0300 |
---|---|---|
committer | Ivan Topolnak <itopolnak@despegar.com> | 2014-02-04 18:16:07 -0300 |
commit | 57e433c07a271b4e5e4159500cdc828cd7bb6a83 (patch) | |
tree | 6b2928dcf3c1dc68c4131aa864a0a0f53ccf2160 /kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala | |
parent | 7307e1cc97e0363d1fb4cc116fc69a5272ca3730 (diff) | |
download | Kamon-57e433c07a271b4e5e4159500cdc828cd7bb6a83.tar.gz Kamon-57e433c07a271b4e5e4159500cdc828cd7bb6a83.tar.bz2 Kamon-57e433c07a271b4e5e4159500cdc828cd7bb6a83.zip |
partial rewrite of kamon-newrelic
Diffstat (limited to 'kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala')
-rw-r--r-- | kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala | 103 |
1 files changed, 27 insertions, 76 deletions
diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala index 57be566c..ef2de343 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala @@ -16,97 +16,48 @@ package kamon.newrelic import akka.actor._ -import scala.collection.mutable -import kamon.Kamon -import kamon.trace.{ UowTrace } -import kamon.newrelic.NewRelicMetric.{ MetricBatch, FlushMetrics } import scala.concurrent.duration._ +import kamon.Kamon +import kamon.metrics.{TickMetricSnapshotBuffer, TraceMetrics, Metrics} +import kamon.metrics.Subscriptions.TickMetricSnapshot +import akka.actor -class NewRelic extends ExtensionId[NewRelicExtension] { - def createExtension(system: ExtendedActorSystem): NewRelicExtension = new NewRelicExtension(system) -} class NewRelicExtension(system: ExtendedActorSystem) extends Kamon.Extension { - val api: ActorRef = system.actorOf(Props[NewRelicManager], "kamon-newrelic") + val manager: ActorRef = system.actorOf(Props[NewRelicManager], "kamon-newrelic") + + Kamon(Metrics)(system).subscribe(TraceMetrics, "*", manager, permanently = true) } class NewRelicManager extends Actor with ActorLogging { - log.info("Registering the Kamon(NewRelic) extension") - - //Kamon(Trace)(context.system).api ! Trace.Register + log.info("Starting the Kamon(NewRelic) extension") - val webTransactionMetrics = context.actorOf(Props[WebTransactionMetrics2], "web-transaction-metrics") val agent = context.actorOf(Props[Agent], "agent") - - import context.dispatcher - context.system.scheduler.schedule(1 minute, 1 minute) { - webTransactionMetrics.tell(FlushMetrics, agent) - } + val translator = context.actorOf(MetricTranslator.props(agent), "translator") + val buffer = context.actorOf(TickMetricSnapshotBuffer.props(1 minute, translator), "metric-buffer") def receive = { - case trace: UowTrace ⇒ webTransactionMetrics ! trace - } -} - -object NewRelicMetric { - case class ID(name: String, scope: Option[String]) - case class Data(var callCount: Long, var total: Double, var totalExclusive: Double, var min: Double, var max: Double, var sumOfSquares: Double) { - def record(value: Double): Unit = { - if (value > max) max = value - if (value < min) min = value - - total += value - totalExclusive += value - sumOfSquares += value * value - callCount += 1 - } - } - - object Data { - def apply(): Data = Data(0, 0, 0, Double.MaxValue, 0, 0) + case tick: TickMetricSnapshot => buffer.forward(tick) } - - case object FlushMetrics - case class MetricBatch(metrics: List[(ID, Data)]) } -class WebTransactionMetrics2 extends Actor with ActorLogging { - val apdexT = 0.5D - var metrics = mutable.Map.empty[NewRelicMetric.ID, NewRelicMetric.Data] - var apdex = NewRelicMetric.Data(0, 0, 0, apdexT, apdexT, 0) - - def receive = { - case trace: UowTrace ⇒ updateStats(trace) - case FlushMetrics ⇒ flush - } - - def flush: Unit = { - sender ! MetricBatch(metrics.toList :+ (NewRelicMetric.ID("Apdex", None), apdex)) - apdex = NewRelicMetric.Data(0, 0, 0, apdexT, apdexT, 0) - metrics = mutable.Map.empty[NewRelicMetric.ID, NewRelicMetric.Data] - } - - def recordValue(metricID: NewRelicMetric.ID, value: Double): Unit = { - metrics.getOrElseUpdate(metricID, NewRelicMetric.Data()).record(value) - } - - def recordApdex(time: Double): Unit = { - if (time <= apdexT) - apdex.callCount += 1 - else if (time > apdexT && time <= (4 * apdexT)) - apdex.total += 1 - else - apdex.totalExclusive += 1 - } +object NewRelic extends ExtensionId[NewRelicExtension] with ExtensionIdProvider { + def lookup(): ExtensionId[_ <: actor.Extension] = NewRelic + def createExtension(system: ExtendedActorSystem): NewRelicExtension = new NewRelicExtension(system) - def updateStats(trace: UowTrace): Unit = { - // Basic Metrics - val elapsedSeconds = trace.elapsed / 1E9D + case class Metric(name: String, scope: Option[String], callCount: Long, total: Double, totalExclusive: Double, + min: Double, max: Double, sumOfSquares: Double) { + + def merge(that: Metric): Metric = { + Metric(name, scope, + callCount + that.callCount, + total + that.total, + totalExclusive + that.totalExclusive, + math.min(min, that.min), + math.max(max, that.max), + sumOfSquares + that.sumOfSquares) + } - recordApdex(elapsedSeconds) - recordValue(NewRelicMetric.ID("WebTransaction", None), elapsedSeconds) - recordValue(NewRelicMetric.ID("HttpDispatcher", None), elapsedSeconds) - recordValue(NewRelicMetric.ID("WebTransaction/Custom/" + trace.name, None), elapsedSeconds) } -} +}
\ No newline at end of file |