diff options
Diffstat (limited to 'kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala')
-rw-r--r-- | kamon-statsd/src/main/scala/kamon/statsd/StatsD.scala | 59 |
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 |