aboutsummaryrefslogtreecommitdiff
path: root/kamon-statsd
diff options
context:
space:
mode:
authorIvan Topolnjak <ivantopo@gmail.com>2014-11-03 02:33:09 +0100
committerIvan Topolnjak <ivantopo@gmail.com>2014-11-03 02:33:09 +0100
commit6e3d9ae88ecce10420eeac82294c54c1b43dedf4 (patch)
treef96d5aec3e35e557663a3eb01654170371577831 /kamon-statsd
parent992dd3007a6ddd24bf2aaf952aeacab7d8d9fb1a (diff)
downloadKamon-6e3d9ae88ecce10420eeac82294c54c1b43dedf4.tar.gz
Kamon-6e3d9ae88ecce10420eeac82294c54c1b43dedf4.tar.bz2
Kamon-6e3d9ae88ecce10420eeac82294c54c1b43dedf4.zip
+ statsd: allow users to provide their own MetricKeyGenerator.
Diffstat (limited to 'kamon-statsd')
-rw-r--r--kamon-statsd/src/main/resources/reference.conf5
-rw-r--r--kamon-statsd/src/main/scala/kamon/statsd/SimpleMetricKeyGenerator.scala6
-rw-r--r--kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala19
-rw-r--r--kamon-statsd/src/main/scala/kamon/statsd/StatsDMetricsSender.scala4
4 files changed, 20 insertions, 14 deletions
diff --git a/kamon-statsd/src/main/resources/reference.conf b/kamon-statsd/src/main/resources/reference.conf
index bd713f65..a10ac735 100644
--- a/kamon-statsd/src/main/resources/reference.conf
+++ b/kamon-statsd/src/main/resources/reference.conf
@@ -4,6 +4,7 @@
kamon {
statsd {
+
# Hostname and port in which your StatsD is running. Remember that StatsD packets are sent using UDP and
# setting unreachable hosts and/or not open ports wont be warned by the Kamon, your data wont go anywhere.
hostname = "127.0.0.1"
@@ -29,6 +30,10 @@ kamon {
# In order to not get a ClassNotFoundException, we must register the kamon-sytem-metrics module
report-system-metrics = false
+ # FQCN of the implementation of `kamon.statsd.MetricKeyGenerator` to be instantiated and used for assigning
+ # metric names. The implementation must have a single parameter constructor accepting a `com.typesafe.config.Config`.
+ metric-key-generator = kamon.statsd.SimpleMetricKeyGenerator
+
simple-metric-key-generator {
# Application prefix for all metrics pushed to StatsD. The default namespacing scheme for metrics follows
diff --git a/kamon-statsd/src/main/scala/kamon/statsd/SimpleMetricKeyGenerator.scala b/kamon-statsd/src/main/scala/kamon/statsd/SimpleMetricKeyGenerator.scala
index f0bc6d64..28354423 100644
--- a/kamon-statsd/src/main/scala/kamon/statsd/SimpleMetricKeyGenerator.scala
+++ b/kamon-statsd/src/main/scala/kamon/statsd/SimpleMetricKeyGenerator.scala
@@ -6,7 +6,11 @@ import com.typesafe.config.Config
import kamon.metric.UserMetrics.UserMetricGroup
import kamon.metric.{ MetricIdentity, MetricGroupIdentity }
-class SimpleMetricKeyGenerator(config: Config) extends StatsD.MetricKeyGenerator {
+trait MetricKeyGenerator {
+ def generateKey(groupIdentity: MetricGroupIdentity, metricIdentity: MetricIdentity): String
+}
+
+class SimpleMetricKeyGenerator(config: Config) extends MetricKeyGenerator {
type Normalizer = String ⇒ String
val configSettings = config.getConfig("kamon.statsd.simple-metric-key-generator")
diff --git a/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala b/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
index c8f647a8..e92cb546 100644
--- a/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
+++ b/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
@@ -24,7 +24,6 @@ import kamon.metrics._
import scala.concurrent.duration._
import scala.collection.JavaConverters._
import com.typesafe.config.Config
-import java.lang.management.ManagementFactory
import akka.event.Logging
import java.net.InetSocketAddress
import java.util.concurrent.TimeUnit.MILLISECONDS
@@ -32,24 +31,22 @@ import java.util.concurrent.TimeUnit.MILLISECONDS
object StatsD extends ExtensionId[StatsDExtension] with ExtensionIdProvider {
override def lookup(): ExtensionId[_ <: Extension] = StatsD
override def createExtension(system: ExtendedActorSystem): StatsDExtension = new StatsDExtension(system)
-
- trait MetricKeyGenerator {
- def generateKey(groupIdentity: MetricGroupIdentity, metricIdentity: MetricIdentity): String
- }
}
class StatsDExtension(system: ExtendedActorSystem) extends Kamon.Extension {
val log = Logging(system, classOf[StatsDExtension])
log.info("Starting the Kamon(StatsD) extension")
- private val statsDConfig = system.settings.config.getConfig("kamon.statsd")
+ private val config = system.settings.config
+ private val statsDConfig = config.getConfig("kamon.statsd")
+ val tickInterval = config.getDuration("kamon.metrics.tick-interval", MILLISECONDS)
val statsDHost = new InetSocketAddress(statsDConfig.getString("hostname"), statsDConfig.getInt("port"))
val flushInterval = statsDConfig.getDuration("flush-interval", MILLISECONDS)
val maxPacketSizeInBytes = statsDConfig.getBytes("max-packet-size")
- val tickInterval = system.settings.config.getDuration("kamon.metrics.tick-interval", MILLISECONDS)
+ val keyGeneratorFQCN = statsDConfig.getString("metric-key-generator")
- val statsDMetricsListener = buildMetricsListener(tickInterval, flushInterval)
+ val statsDMetricsListener = buildMetricsListener(tickInterval, flushInterval, keyGeneratorFQCN, config)
// Subscribe to all user metrics
Kamon(Metrics)(system).subscribe(UserHistograms, "*", statsDMetricsListener, permanently = true)
@@ -89,14 +86,14 @@ class StatsDExtension(system: ExtendedActorSystem) extends Kamon.Extension {
}
}
- def buildMetricsListener(tickInterval: Long, flushInterval: Long): ActorRef = {
+ def buildMetricsListener(tickInterval: Long, flushInterval: Long, keyGeneratorFQCN: String, config: Config): ActorRef = {
assert(flushInterval >= tickInterval, "StatsD flush-interval needs to be equal or greater to the tick-interval")
- val defaultMetricKeyGenerator = new SimpleMetricKeyGenerator(system.settings.config)
+ val keyGenerator = system.dynamicAccess.createInstanceFor[MetricKeyGenerator](keyGeneratorFQCN, (classOf[Config], config) :: Nil).get
val metricsSender = system.actorOf(StatsDMetricsSender.props(
statsDHost,
maxPacketSizeInBytes,
- defaultMetricKeyGenerator), "statsd-metrics-sender")
+ keyGenerator), "statsd-metrics-sender")
if (flushInterval == tickInterval) {
// No need to buffer the metrics, let's go straight to the metrics sender.
diff --git a/kamon-statsd/src/main/scala/kamon/statsd/StatsDMetricsSender.scala b/kamon-statsd/src/main/scala/kamon/statsd/StatsDMetricsSender.scala
index 8fbf4fee..2aac3a52 100644
--- a/kamon-statsd/src/main/scala/kamon/statsd/StatsDMetricsSender.scala
+++ b/kamon-statsd/src/main/scala/kamon/statsd/StatsDMetricsSender.scala
@@ -26,7 +26,7 @@ import java.util.Locale
import kamon.metric.instrument.{ Counter, Histogram }
-class StatsDMetricsSender(remote: InetSocketAddress, maxPacketSizeInBytes: Long, metricKeyGenerator: StatsD.MetricKeyGenerator)
+class StatsDMetricsSender(remote: InetSocketAddress, maxPacketSizeInBytes: Long, metricKeyGenerator: MetricKeyGenerator)
extends Actor with UdpExtensionProvider {
import context.system
@@ -80,7 +80,7 @@ class StatsDMetricsSender(remote: InetSocketAddress, maxPacketSizeInBytes: Long,
}
object StatsDMetricsSender {
- def props(remote: InetSocketAddress, maxPacketSize: Long, metricKeyGenerator: StatsD.MetricKeyGenerator): Props =
+ def props(remote: InetSocketAddress, maxPacketSize: Long, metricKeyGenerator: MetricKeyGenerator): Props =
Props(new StatsDMetricsSender(remote, maxPacketSize, metricKeyGenerator))
}