From 5d296a16270b1ec66d206ef1195208ea864f49c1 Mon Sep 17 00:00:00 2001 From: Ivan Topolnak Date: Mon, 3 Feb 2014 18:10:08 -0300 Subject: create the notion of a metric group category for easier filtering when subscribing --- .../src/main/scala/kamon/newrelic/Metric.scala | 32 +++++++++++++++ .../src/main/scala/kamon/newrelic/NewRelic.scala | 4 +- .../kamon/newrelic/WebTransactionMetrics.scala | 34 ++++++++++++++++ .../src/main/scala/kamon/newrelic/package.scala | 45 ++++++++++++++++++++++ 4 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala create mode 100644 kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala create mode 100644 kamon-newrelic/src/main/scala/kamon/newrelic/package.scala (limited to 'kamon-newrelic/src/main/scala') diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala new file mode 100644 index 00000000..dc6f0868 --- /dev/null +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala @@ -0,0 +1,32 @@ +/* + * ========================================================================================= + * Copyright © 2013 the kamon project + * + * 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. + * ========================================================================================= + */ + +package kamon.newrelic + +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) + } + +} diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala index 5f736a90..57be566c 100644 --- a/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala @@ -35,7 +35,7 @@ class NewRelicManager extends Actor with ActorLogging { //Kamon(Trace)(context.system).api ! Trace.Register - val webTransactionMetrics = context.actorOf(Props[WebTransactionMetrics], "web-transaction-metrics") + val webTransactionMetrics = context.actorOf(Props[WebTransactionMetrics2], "web-transaction-metrics") val agent = context.actorOf(Props[Agent], "agent") import context.dispatcher @@ -70,7 +70,7 @@ object NewRelicMetric { case class MetricBatch(metrics: List[(ID, Data)]) } -class WebTransactionMetrics extends Actor with ActorLogging { +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) diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala new file mode 100644 index 00000000..e10e9271 --- /dev/null +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala @@ -0,0 +1,34 @@ +/* + * ========================================================================================= + * Copyright © 2013 the kamon project + * + * 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. + * ========================================================================================= + */ + +package kamon.newrelic + +import kamon.metrics.{ TraceMetrics, MetricGroupSnapshot, MetricGroupIdentity } + +object WebTransactionMetrics { + def collectWebTransactionMetrics(metrics: Map[MetricGroupIdentity, MetricGroupSnapshot]): List[Metric] = { + metrics.collect { + case (TraceMetrics(name), groupSnapshot) ⇒ + + + groupSnapshot.metrics foreach { + case (metricIdentity, snapshot) => println(s"[$name] - ${toNewRelicMetric(name, None, snapshot)}") + } + } + + Nil + } +} diff --git a/kamon-newrelic/src/main/scala/kamon/newrelic/package.scala b/kamon-newrelic/src/main/scala/kamon/newrelic/package.scala new file mode 100644 index 00000000..f0b28d95 --- /dev/null +++ b/kamon-newrelic/src/main/scala/kamon/newrelic/package.scala @@ -0,0 +1,45 @@ +/* + * + * * ========================================================================================= + * * Copyright © 2013 the kamon project + * * + * * 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. + * * ========================================================================================= + * + */ + +package kamon + +import kamon.metrics.MetricSnapshot + +package object newrelic { + + def toNewRelicMetric(name: String, scope: Option[String], snapshot: MetricSnapshot): Metric = { + var total: Double = 0D + var sumOfSquares: Double = 0D + + val measurementLevels = snapshot.measurementLevels.iterator + while(measurementLevels.hasNext) { + val level = measurementLevels.next() + + // NewRelic metrics need to be scaled to seconds. + val scaledValue = level.value / 1E9D + + total += scaledValue + sumOfSquares += scaledValue * scaledValue + } + + val scaledMin = snapshot.min / 1E9D + val scaledMax = snapshot.max / 1E9D + + Metric(name, scope, snapshot.numberOfMeasurements, total, total, scaledMin, scaledMax, sumOfSquares) + } +} -- cgit v1.2.3