aboutsummaryrefslogtreecommitdiff
path: root/kamon-newrelic
diff options
context:
space:
mode:
authorIvan Topolnak <itopolnak@despegar.com>2014-02-03 18:10:08 -0300
committerIvan Topolnjak <ivantopo@gmail.com>2014-02-04 09:18:08 -0300
commit5d296a16270b1ec66d206ef1195208ea864f49c1 (patch)
tree03d71af983c7737234a13695bef0bf97cf5e4411 /kamon-newrelic
parent9534d698ccf7e7c368db5e896abdb5d13ce27a48 (diff)
downloadKamon-5d296a16270b1ec66d206ef1195208ea864f49c1.tar.gz
Kamon-5d296a16270b1ec66d206ef1195208ea864f49c1.tar.bz2
Kamon-5d296a16270b1ec66d206ef1195208ea864f49c1.zip
create the notion of a metric group category for easier filtering when subscribing
Diffstat (limited to 'kamon-newrelic')
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/Metric.scala32
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/NewRelic.scala4
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/WebTransactionMetrics.scala34
-rw-r--r--kamon-newrelic/src/main/scala/kamon/newrelic/package.scala45
4 files changed, 113 insertions, 2 deletions
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 <http://kamon.io/>
+ *
+ * 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 <http://kamon.io/>
+ *
+ * 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 <http://kamon.io/>
+ * *
+ * * 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)
+ }
+}