aboutsummaryrefslogtreecommitdiff
path: root/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala')
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala43
1 files changed, 39 insertions, 4 deletions
diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala
index 7fe5793c..31a3669d 100644
--- a/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala
+++ b/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala
@@ -16,18 +16,53 @@
package kamon.newrelic
-import kamon.metrics.{ TraceMetrics, MetricGroupSnapshot, MetricGroupIdentity }
+import kamon.metrics._
import kamon.metrics.TraceMetrics.ElapsedTime
+import akka.actor.Actor
+import kamon.Kamon
trait WebTransactionMetrics {
- def collectWebTransactionMetrics(metrics: Map[MetricGroupIdentity, MetricGroupSnapshot]): List[NewRelic.Metric] = {
+ self: Actor =>
+
+ def collectWebTransactionMetrics(metrics: Map[MetricGroupIdentity, MetricGroupSnapshot]): Seq[NewRelic.Metric] = {
+ val apdexBuilder = new ApdexBuilder("Apdex", None, (NewRelic)(context.system).apdexT)
+ var accumulatedHttpDispatcher: MetricSnapshot = DefaultMetricSnapshot.empty
+
val webTransactionMetrics = metrics.collect {
case (TraceMetrics(name), groupSnapshot) ⇒
+
groupSnapshot.metrics collect {
- case (ElapsedTime, snapshot) => toNewRelicMetric("HttpDispatcher", None, snapshot)
+ case (ElapsedTime, snapshot) =>
+ accumulatedHttpDispatcher = accumulatedHttpDispatcher.merge(snapshot)
+ snapshot.measurementLevels.foreach(level => apdexBuilder.record(level.value / 1E9D, level.count))
+
+ toNewRelicMetric(s"WebTransaction/Custom/$name", None, snapshot)
}
}
- webTransactionMetrics.flatten.toList
+ val httpDispatcher = toNewRelicMetric("HttpDispatcher", None, accumulatedHttpDispatcher)
+ val webTransaction = toNewRelicMetric("WebTransaction", None, accumulatedHttpDispatcher)
+
+ Seq(httpDispatcher, webTransaction, apdexBuilder.build) ++ webTransactionMetrics.flatten.toSeq
}
}
+
+class ApdexBuilder(name: String, scope: Option[String], apdexT: Double) {
+ val frustratingThreshold = 4 * apdexT
+
+ var satisfying = 0L
+ var tolerating = 0L
+ var frustrating = 0L
+
+ def record(duration: Double, count: Long): Unit =
+ if(duration <= apdexT)
+ satisfying += count
+ else
+ if(duration <= frustratingThreshold)
+ tolerating += count
+ else
+ frustrating += count
+
+ // NewRelic reuses the same metric structure for recording the Apdex.. weird, but that's how it works.
+ def build: NewRelic.Metric = NewRelic.Metric(name, scope, satisfying, tolerating, frustrating, apdexT, apdexT, 0)
+}