aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego <diegolparra@gmail.com>2014-05-14 00:09:46 -0300
committerDiego <diegolparra@gmail.com>2014-05-14 00:09:46 -0300
commit7bfc8d29253316289dba6d791126a6d95a0628fb (patch)
tree15cfef1116f5424380097e4ee48225e773c917a1
parent4da99bff39028cc055a669281def52b40de10fd4 (diff)
downloadKamon-7bfc8d29253316289dba6d791126a6d95a0628fb.tar.gz
Kamon-7bfc8d29253316289dba6d791126a6d95a0628fb.tar.bz2
Kamon-7bfc8d29253316289dba6d791126a6d95a0628fb.zip
! datadog: first functional implementation of DatadogMetricsSender
-rw-r--r--kamon-core/src/main/scala/kamon/metrics/instruments/CounterRecorder.scala2
-rw-r--r--kamon-datadog/src/main/scala/kamon/datadog/DatadogMetricsSender.scala39
-rw-r--r--kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala27
-rw-r--r--kamon-playground/src/main/resources/application.conf4
4 files changed, 26 insertions, 46 deletions
diff --git a/kamon-core/src/main/scala/kamon/metrics/instruments/CounterRecorder.scala b/kamon-core/src/main/scala/kamon/metrics/instruments/CounterRecorder.scala
index eba3c865..e5efbc15 100644
--- a/kamon-core/src/main/scala/kamon/metrics/instruments/CounterRecorder.scala
+++ b/kamon-core/src/main/scala/kamon/metrics/instruments/CounterRecorder.scala
@@ -34,5 +34,5 @@ class CounterRecorder extends MetricRecorder {
}
object CounterRecorder {
- def apply(): CounterRecorder = new CounterRecorder
+ def apply(): CounterRecorder = new CounterRecorder()
} \ No newline at end of file
diff --git a/kamon-datadog/src/main/scala/kamon/datadog/DatadogMetricsSender.scala b/kamon-datadog/src/main/scala/kamon/datadog/DatadogMetricsSender.scala
index 50911093..eb19ae81 100644
--- a/kamon-datadog/src/main/scala/kamon/datadog/DatadogMetricsSender.scala
+++ b/kamon-datadog/src/main/scala/kamon/datadog/DatadogMetricsSender.scala
@@ -62,10 +62,16 @@ class DatadogMetricsSender(remote: InetSocketAddress, maxPacketSizeInBytes: Long
dataBuilder.flush()
}
-
def encodeMeasurement(measurement: Measurement, instrumentType: InstrumentType): String = {
- def dataDogDMetricFormat(value: String, metricType: String, samplingRate: Double = 1D): String =
- value + "|" + metricType + (if (samplingRate != 1D) "|@" + samplingRateFormat.format(samplingRate) else "")
+
+ def processTags(tags: Seq[String]): String = {
+ if (tags.isEmpty) "" else {
+ tags.foldLeft(new StringBuilder("|#")) { (sb, s) ⇒ if (sb.length > 2) sb ++= "," else sb ++= s }.toString()
+ }
+ }
+
+ def dataDogDMetricFormat(value: String, metricType: String, samplingRate: Double = 1D, tags: Seq[String] = Nil): String =
+ value + "|" + metricType + (if (samplingRate != 1D) "|@" + samplingRateFormat.format(samplingRate) else "" + processTags(tags))
instrumentType match {
case Histogram ⇒ dataDogDMetricFormat(measurement.value.toString, "ms", (1D / measurement.count))
@@ -91,26 +97,15 @@ class MetricDataPacketBuilder(maxPacketSizeInBytes: Long, udpSender: ActorRef, r
var buffer = new StringBuilder()
def appendMeasurement(key: String, measurementData: String): Unit = {
- if (key == lastKey) {
- val dataWithoutKey = measurementSeparator + measurementData
- if (fitsOnBuffer(dataWithoutKey))
- buffer.append(dataWithoutKey)
- else {
- flushToUDP(buffer.toString())
- buffer.clear()
- buffer.append(key).append(dataWithoutKey)
- }
+ val data = key + measurementSeparator + measurementData
+
+ if (fitsOnBuffer(metricSeparator + data)) {
+ val mSeparator = if (buffer.length > 0) metricSeparator else ""
+ buffer.append(mSeparator).append(data)
} else {
- lastKey = key
- val dataWithoutSeparator = key + measurementSeparator + measurementData
- if (fitsOnBuffer(metricSeparator + dataWithoutSeparator)) {
- val mSeparator = if (buffer.length > 0) metricSeparator else ""
- buffer.append(mSeparator).append(dataWithoutSeparator)
- } else {
- flushToUDP(buffer.toString())
- buffer.clear()
- buffer.append(dataWithoutSeparator)
- }
+ flushToUDP(buffer.toString())
+ buffer.clear()
+ buffer.append(data)
}
}
diff --git a/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala b/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala
index 781a73c5..98b36159 100644
--- a/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala
+++ b/kamon-datadog/src/test/scala/kamon/datadog/DatadogMetricSenderSpec.scala
@@ -1,6 +1,6 @@
/*
* =========================================================================================
- * Copyright © 2013 the kamon project <http://kamon.io/>
+ * Copyright © 2013-2014 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
@@ -45,20 +45,6 @@ class DatadogMetricSenderSpec extends TestKitBase with WordSpecLike with Matcher
data.utf8String should be(s"$testMetricKey:10|ms")
}
- "render several measurements of the same key under a single (key + multiple measurements) packet" in new UdpListenerFixture {
- val testMetricName = "test-metric"
- val testMetricKey = buildMetricKey(testMetricName)
- val testRecorder = HdrRecorder(1000L, 2, Scale.Unit)
- testRecorder.record(10L)
- testRecorder.record(11L)
- testRecorder.record(12L)
-
- val udp = setup(Map(testMetricName -> testRecorder.collect()))
- val Udp.Send(data, _, _) = udp.expectMsgType[Udp.Send]
-
- data.utf8String should be(s"$testMetricKey:10|ms:11|ms:12|ms")
- }
-
"include the correspondent sampling rate when rendering multiple occurrences of the same value" in new UdpListenerFixture {
val testMetricName = "test-metric"
val testMetricKey = buildMetricKey(testMetricName)
@@ -77,12 +63,12 @@ class DatadogMetricSenderSpec extends TestKitBase with WordSpecLike with Matcher
val testMetricKey = buildMetricKey(testMetricName)
val testRecorder = HdrRecorder(testMaxPacketSize, 3, Scale.Unit)
- var bytes = testMetricKey.length
+ var bytes = 0//testMetricKey.length
var level = 0
while (bytes <= testMaxPacketSize) {
level += 1
testRecorder.record(level)
- bytes += s":$level|ms".length
+ bytes += s"$testMetricKey:$level|ms".length
}
val udp = setup(Map(testMetricName -> testRecorder.collect()))
@@ -106,9 +92,7 @@ class DatadogMetricSenderSpec extends TestKitBase with WordSpecLike with Matcher
firstTestRecorder.record(10L)
firstTestRecorder.record(10L)
- firstTestRecorder.record(11L)
- secondTestRecorder.record(20L)
secondTestRecorder.record(21L)
thirdTestRecorder.record(1L)
@@ -116,13 +100,14 @@ class DatadogMetricSenderSpec extends TestKitBase with WordSpecLike with Matcher
thirdTestRecorder.record(1L)
thirdTestRecorder.record(1L)
+ val t = thirdTestRecorder.collect()
val udp = setup(Map(
firstTestMetricName -> firstTestRecorder.collect(),
secondTestMetricName -> secondTestRecorder.collect(),
- thirdTestMetricName -> thirdTestRecorder.collect()))
+ thirdTestMetricName -> t))
val Udp.Send(data, _, _) = udp.expectMsgType[Udp.Send]
- data.utf8String should be(s"$firstTestMetricKey:10|ms|@0.5:11|ms\n$secondTestMetricKey:20|ms:21|ms\n$thirdTestMetricKey:4|c")
+ data.utf8String should be(s"$firstTestMetricKey:10|ms|@0.5\n$secondTestMetricKey:21|ms\n$thirdTestMetricKey:4|c")
}
}
diff --git a/kamon-playground/src/main/resources/application.conf b/kamon-playground/src/main/resources/application.conf
index aaafd836..60b3eb6a 100644
--- a/kamon-playground/src/main/resources/application.conf
+++ b/kamon-playground/src/main/resources/application.conf
@@ -2,7 +2,7 @@ akka {
loggers = [ "akka.event.slf4j.Slf4jLogger" ]
loglevel = INFO
- extensions = ["kamon.newrelic.NewRelic", "kamon.statsd.StatsD"]
+ extensions = ["kamon.newrelic.NewRelic", "kamon.statsd.StatsD", "kamon.datadog.Datadog"]
actor {
debug {
@@ -66,7 +66,7 @@ kamon {
significant-value-digits = 1
}
mailbox-size {
- highest-trackable-value = 999999999
+ highest-trackable-value = 99999999
significant-value-digits = 1
}
}