aboutsummaryrefslogtreecommitdiff
path: root/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
diff options
context:
space:
mode:
Diffstat (limited to 'kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala')
-rw-r--r--kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala59
1 files changed, 10 insertions, 49 deletions
diff --git a/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala b/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
index e8c39db3..8b0e7992 100644
--- a/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
+++ b/kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala
@@ -27,30 +27,27 @@ import com.typesafe.config.Config
import java.lang.management.ManagementFactory
import akka.event.Logging
import java.net.InetSocketAddress
+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 localhostName: String
- def normalizedLocalhostName: String
- 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.getMilliseconds("kamon.metrics.tick-interval")
val statsDHost = new InetSocketAddress(statsDConfig.getString("hostname"), statsDConfig.getInt("port"))
val flushInterval = statsDConfig.getMilliseconds("flush-interval")
val maxPacketSizeInBytes = statsDConfig.getBytes("max-packet-size")
- val tickInterval = system.settings.config.getMilliseconds("kamon.metrics.tick-interval")
+ 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)
@@ -90,14 +87,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.
@@ -106,40 +103,4 @@ class StatsDExtension(system: ExtendedActorSystem) extends Kamon.Extension {
system.actorOf(TickMetricSnapshotBuffer.props(flushInterval.toInt.millis, metricsSender), "statsd-metrics-buffer")
}
}
-}
-
-class SimpleMetricKeyGenerator(config: Config) extends StatsD.MetricKeyGenerator {
- val application = config.getString("kamon.statsd.simple-metric-key-generator.application")
- val includeHostnameInMetrics =
- config.getBoolean("kamon.statsd.simple-metric-key-generator.include-hostname")
- val hostnameOverride =
- config.getString("kamon.statsd.simple-metric-key-generator.hostname-override")
-
- val _localhostName = ManagementFactory.getRuntimeMXBean.getName.split('@')(1)
- val _normalizedLocalhostName = _localhostName.replace('.', '_')
-
- def localhostName: String = _localhostName
-
- def normalizedLocalhostName: String = _normalizedLocalhostName
-
- val hostname: String =
- if (hostnameOverride == "none") normalizedLocalhostName
- else hostnameOverride
-
- val baseName: String =
- if (includeHostnameInMetrics) s"${application}.${hostname}"
- else application
-
- def generateKey(groupIdentity: MetricGroupIdentity, metricIdentity: MetricIdentity): String = {
- val normalizedGroupName = groupIdentity.name.replace(": ", "-").replace(" ", "_").replace("/", "_")
- val key = s"${baseName}.${groupIdentity.category.name}.${normalizedGroupName}"
-
- if (isUserMetric(groupIdentity)) key
- else s"${key}.${metricIdentity.name}"
- }
-
- def isUserMetric(groupIdentity: MetricGroupIdentity): Boolean = groupIdentity match {
- case someUserMetric: UserMetricGroup ⇒ true
- case everythingElse ⇒ false
- }
-}
+} \ No newline at end of file